简单汉化

This commit is contained in:
Cheng Zhou
2025-12-17 19:23:34 +08:00
parent 1e6cae6b6e
commit 4f50237f56
41 changed files with 2123 additions and 92 deletions
+11 -3
View File
@@ -12,13 +12,13 @@
</el-form-item>
<el-form-item label="严重性" prop="seriousness">
<el-select v-model="form.seriousness" placeholder="请选择">
<el-option label="SERIOUS" value="SERIOUS" />
<el-option label="NON_SERIOUS" value="NON_SERIOUS" />
<el-option label="SERIOUS(重)" value="SERIOUS" />
<el-option label="NON_SERIOUS(非重)" value="NON_SERIOUS" />
</el-select>
</el-form-item>
<el-form-item label="严重程度" prop="severity">
<el-select v-model="form.severity" placeholder="请选择">
<el-option v-for="s in severities" :key="s" :label="s" :value="s" />
<el-option v-for="s in severities" :key="s" :label="severityLabel(s)" :value="s" />
</el-select>
</el-form-item>
<el-form-item label="描述" prop="description">
@@ -57,6 +57,14 @@ const submitting = ref(false);
const study = useStudyStore();
const severities = ["G1", "G2", "G3", "G4", "G5"];
const severityLabel = (v: string) =>
({
G1: "G1(轻)",
G2: "G2(中)",
G3: "G3(重)",
G4: "G4(危重)",
G5: "G5(致死)",
}[v] || v);
const form = reactive({
subject_id: "",
+7 -7
View File
@@ -9,17 +9,17 @@
</el-form-item>
<el-form-item label="类别" prop="category">
<el-select v-model="form.category" placeholder="请选择">
<el-option label="MISSING" value="MISSING" />
<el-option label="INCONSISTENT" value="INCONSISTENT" />
<el-option label="OUT_OF_RANGE" value="OUT_OF_RANGE" />
<el-option label="OTHER" value="OTHER" />
<el-option label="缺失(MISSING)" value="MISSING" />
<el-option label="不一致(INCONSISTENT)" value="INCONSISTENT" />
<el-option label="超范围(OUT_OF_RANGE)" value="OUT_OF_RANGE" />
<el-option label="其他(OTHER)" value="OTHER" />
</el-select>
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-select v-model="form.priority" placeholder="请选择">
<el-option label="LOW" value="LOW" />
<el-option label="MEDIUM" value="MEDIUM" />
<el-option label="HIGH" value="HIGH" />
<el-option label="" value="LOW" />
<el-option label="" value="MEDIUM" />
<el-option label="" value="HIGH" />
</el-select>
</el-form-item>
<el-form-item label="指派给" prop="assigned_to">
+8 -1
View File
@@ -3,7 +3,7 @@
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="类别" prop="category">
<el-select v-model="form.category" placeholder="请选择">
<el-option v-for="c in categories" :key="c" :label="c" :value="c" />
<el-option v-for="c in categories" :key="c" :label="categoryLabel(c)" :value="c" />
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
@@ -51,6 +51,13 @@ const formRef = ref<FormInstance>();
const submitting = ref(false);
const categories = ["SITE_FEE", "SUBJECT_STIPEND", "TRAVEL", "OTHER"];
const categoryLabel = (v: string) =>
({
SITE_FEE: "中心费用",
SUBJECT_STIPEND: "受试者补贴",
TRAVEL: "差旅",
OTHER: "其他",
}[v] || v);
const form = reactive({
category: "SITE_FEE",
@@ -75,7 +75,7 @@ const change = async (status: string, reject_reason?: string) => {
};
const reject = async () => {
const reason = await ElMessageBox.prompt("请输入驳回原因", "驳回", {
const reason = await ElMessageBox.prompt("请输入驳回原因", "驳回审批", {
confirmButtonText: "确定",
cancelButtonText: "取消",
}).catch(() => null);
+12 -5
View File
@@ -16,11 +16,13 @@
<el-date-picker v-model="form.manufacture_date" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="状态">
<el-select v-model="form.status">
<el-option label="ACTIVE" value="ACTIVE" />
<el-option label="QUARANTINED" value="QUARANTINED" />
<el-option label="EXPIRED" value="EXPIRED" />
<el-option label="CLOSED" value="CLOSED" />
<el-select v-model="form.status" placeholder="请选择状态">
<el-option
v-for="s in statusOptions"
:key="s"
:label="`${statusLabel(s)}(${s})`"
:value="s"
/>
</el-select>
</el-form-item>
</el-form>
@@ -44,6 +46,8 @@ const study = useStudyStore();
const formRef = ref<FormInstance>();
const submitting = ref(false);
const statusOptions = ["ACTIVE", "QUARANTINED", "EXPIRED", "CLOSED"];
const form = reactive({
product_id: "",
batch_no: "",
@@ -115,4 +119,7 @@ const onSubmit = async () => {
submitting.value = false;
}
};
const statusLabel = (v: string) =>
({ ACTIVE: "在库", QUARANTINED: "隔离", EXPIRED: "过期", CLOSED: "关闭" }[v] || v);
</script>
+20 -5
View File
@@ -10,8 +10,13 @@
</el-select>
</el-form-item>
<el-form-item label="交易类型" prop="tx_type">
<el-select v-model="form.tx_type">
<el-option v-for="t in txTypes" :key="t" :label="t" :value="t" />
<el-select v-model="form.tx_type" placeholder="请选择类型">
<el-option
v-for="t in txTypes"
:key="t"
:label="`${txTypeLabel(t)}(${t})`"
:value="t"
/>
</el-select>
</el-form-item>
<el-form-item label="数量" prop="quantity">
@@ -21,7 +26,7 @@
<SubjectSelect
v-model="form.subject_id"
:study-id="study.currentStudy?.id || null"
placeholder="DISPENSE 时必填"
placeholder="发放时必填"
/>
</el-form-item>
<el-form-item label="日期" prop="tx_date">
@@ -70,7 +75,7 @@ const form = reactive({
});
const rules: FormRules = {
site_id: [{ required: true, message: "请输入中心ID", trigger: "blur" }],
site_id: [{ required: true, message: "请选择中心", trigger: "change" }],
batch_id: [{ required: true, message: "请选择批次", trigger: "change" }],
tx_type: [{ required: true, message: "请选择类型", trigger: "change" }],
quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
@@ -92,7 +97,7 @@ const onSubmit = async () => {
if (!study.currentStudy || !formRef.value) return;
await formRef.value.validate();
if (form.tx_type === "DISPENSE" && !form.subject_id) {
ElMessage.error("DISPENSE 时受试者必填");
ElMessage.error("发放时受试者必填");
return;
}
submitting.value = true;
@@ -112,4 +117,14 @@ const onSubmit = async () => {
submitting.value = false;
}
};
const txTypeLabel = (t: string) =>
({
RECEIPT: "入库",
DISPENSE: "发放",
RETURN: "回收",
DESTROY: "销毁",
TRANSFER_IN: "调入",
TRANSFER_OUT: "调出",
}[t] || t);
</script>
+17 -2
View File
@@ -9,12 +9,12 @@
</el-form-item>
<el-form-item label="类别" prop="category">
<el-select v-model="form.category" placeholder="请选择">
<el-option v-for="c in categories" :key="c" :label="c" :value="c" />
<el-option v-for="c in categories" :key="c" :label="categoryLabel(c)" :value="c" />
</el-select>
</el-form-item>
<el-form-item label="等级" prop="level">
<el-select v-model="form.level" placeholder="请选择">
<el-option v-for="l in levels" :key="l" :label="l" :value="l" />
<el-option v-for="l in levels" :key="l" :label="levelLabel(l)" :value="l" />
</el-select>
</el-form-item>
<el-form-item label="截止日期" prop="due_date">
@@ -132,4 +132,19 @@ const onSubmit = async () => {
}
});
};
const categoryLabel = (c: string) =>
({
RISK: "风险",
ISSUE: "问题",
PROTOCOL_DEVIATION: "方案偏差",
}[c] || c);
const levelLabel = (l: string) =>
({
LOW: "低",
MEDIUM: "中",
HIGH: "高",
CRITICAL: "关键",
}[l] || l);
</script>
+6 -6
View File
@@ -16,14 +16,14 @@
<el-aside width="200px" class="aside" v-if="study.currentStudy">
<el-menu router :default-active="$route.path">
<el-menu-item index="/home">首页</el-menu-item>
<el-menu-item index="/study/home">项目首页</el-menu-item>
<el-menu-item index="/study/milestones">里程碑</el-menu-item>
<el-menu-item index="/study/home">项目概览</el-menu-item>
<el-menu-item index="/study/milestones">伦理与启动管理</el-menu-item>
<el-menu-item index="/study/tasks">任务</el-menu-item>
<el-menu-item index="/study/subjects">受试者</el-menu-item>
<el-menu-item index="/study/aes">AE</el-menu-item>
<el-menu-item index="/study/issues">风险/问题</el-menu-item>
<el-menu-item index="/study/aes">不良事件</el-menu-item>
<el-menu-item index="/study/issues">风险问题</el-menu-item>
<el-menu-item index="/study/data-queries">数据问题</el-menu-item>
<el-menu-item index="/study/verifications">SDV/SDR</el-menu-item>
<el-menu-item index="/study/verifications">数据核查</el-menu-item>
<el-sub-menu index="imp">
<template #title>药品</template>
<el-menu-item index="/study/imp/inventory">库存</el-menu-item>
@@ -32,7 +32,7 @@
<el-menu-item index="/study/imp/transactions">交易台账</el-menu-item>
</el-sub-menu>
<el-menu-item index="/study/finance">费用</el-menu-item>
<el-menu-item index="/study/faq">FAQ</el-menu-item>
<el-menu-item index="/study/faq">知识库</el-menu-item>
</el-menu>
</el-aside>
<el-main>
+24 -2
View File
@@ -14,6 +14,7 @@
</el-form-item>
</el-form>
<template #footer>
<el-checkbox v-model="keepCreating" class="mr-8">提交后继续新建</el-checkbox>
<el-button @click="onClose">取消</el-button>
<el-button type="primary" :loading="submitting" @click="onSubmit">提交</el-button>
</template>
@@ -22,6 +23,7 @@
<script setup lang="ts">
import { computed, reactive, ref } from "vue";
import { format } from "date-fns";
import type { FormInstance, FormRules } from "element-plus";
import { ElMessage } from "element-plus";
import { createSubject } from "../api/subjects";
@@ -49,6 +51,7 @@ const form = reactive({
subject_no: "",
screening_date: "",
});
const keepCreating = ref(false);
const rules: FormRules = {
site_id: [{ required: true, message: "请选择中心", trigger: "change" }],
@@ -59,6 +62,15 @@ const onClose = () => {
visible.value = false;
};
const resetForm = () => {
const studyId = study.currentStudy?.id;
const recentSite = studyId ? localStorage.getItem(`recent_site_${studyId}`) : null;
const recentSubject = studyId ? localStorage.getItem(`recent_subject_${studyId}`) : null;
form.site_id = recentSite || "";
form.subject_no = recentSubject || "";
form.screening_date = format(new Date(), "yyyy-MM-dd");
};
const onSubmit = async () => {
if (!formRef.value) return;
await formRef.value.validate(async (valid) => {
@@ -69,10 +81,18 @@ const onSubmit = async () => {
}
submitting.value = true;
try {
await createSubject(study.currentStudy.id, { ...form });
const { data } = await createSubject(study.currentStudy.id, { ...form });
ElMessage.success("提交成功");
if (study.currentStudy?.id) {
localStorage.setItem(`recent_site_${study.currentStudy.id}`, form.site_id || "");
if (data?.id) localStorage.setItem(`recent_subject_${study.currentStudy.id}`, data.id);
}
emit("success");
onClose();
if (keepCreating.value) {
resetForm();
} else {
onClose();
}
} catch (e: any) {
ElMessage.error(e?.response?.data?.message || "提交失败");
} finally {
@@ -80,4 +100,6 @@ const onSubmit = async () => {
}
});
};
resetForm();
</script>
+10 -2
View File
@@ -17,7 +17,7 @@
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-select v-model="form.priority" placeholder="请选择">
<el-option v-for="p in priorities" :key="p" :label="p" :value="p" />
<el-option v-for="p in priorities" :key="p" :label="priorityLabel(p)" :value="p" />
</el-select>
</el-form-item>
<el-form-item label="截止日期" prop="due_date">
@@ -25,7 +25,7 @@
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择">
<el-option v-for="s in statuses" :key="s" :label="s" :value="s" />
<el-option v-for="s in statuses" :key="s" :label="statusLabel(s)" :value="s" />
</el-select>
</el-form-item>
</el-form>
@@ -62,6 +62,14 @@ const visible = computed({
const priorities = ["LOW", "MEDIUM", "HIGH"];
const statuses = ["TODO", "DOING", "DONE", "BLOCKED"];
const priorityLabel = (v: string) => ({ LOW: "低", MEDIUM: "中", HIGH: "高" }[v] || v);
const statusLabel = (v: string) =>
({
TODO: "待处理",
DOING: "进行中",
DONE: "已完成",
BLOCKED: "阻塞",
}[v] || v);
const form = reactive({
title: "",