简单汉化
This commit is contained in:
@@ -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: "",
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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: "",
|
||||
|
||||
Reference in New Issue
Block a user