|
|
@@ -5,6 +5,7 @@ import { computed, onMounted, ref, watch } from 'vue';
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
|
|
|
import { Page, useVbenModal } from '@vben/common-ui';
|
|
|
+import { useUserStore } from '@vben/stores';
|
|
|
|
|
|
import {
|
|
|
Button,
|
|
|
@@ -21,19 +22,19 @@ import {
|
|
|
import {
|
|
|
getAuxiliaryReviewResultMethod,
|
|
|
getReviewPrescriptionMethod,
|
|
|
- getReviewTaskMethod,
|
|
|
- listReviewIndicatorCategoriesMethod,
|
|
|
- listReviewIndicatorsByCategoryMethod,
|
|
|
+ groupReviewIndicatorsByCategory,
|
|
|
+ listReviewIndicatorsForReviewMethod,
|
|
|
listReviewPrescriptionsMethod,
|
|
|
saveReviewPrescriptionResultMethod,
|
|
|
} from '#/api';
|
|
|
|
|
|
+import { needsHerbSelect } from './data';
|
|
|
import AuxiliaryReviewModal from './modules/auxiliary-review-modal.vue';
|
|
|
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
+const userStore = useUserStore();
|
|
|
|
|
|
-const taskLoading = ref(false);
|
|
|
const listLoading = ref(false);
|
|
|
const detailLoading = ref(false);
|
|
|
const saving = ref(false);
|
|
|
@@ -46,7 +47,7 @@ const total = ref(0);
|
|
|
const currentPage = ref(1);
|
|
|
const pageSize = ref(50);
|
|
|
|
|
|
-const filterStatus = ref<string>();
|
|
|
+const filterStatus = ref<'unreviewed' | 'reviewed'>();
|
|
|
const filterInstitution = ref<string>();
|
|
|
const filterDepartment = ref<string>();
|
|
|
const filterDoctor = ref<string>();
|
|
|
@@ -63,6 +64,8 @@ interface CategoryGroup {
|
|
|
}
|
|
|
|
|
|
const indicatorGroups = ref<CategoryGroup[]>([]);
|
|
|
+const indicatorsLoaded = ref(false);
|
|
|
+const indicatorsLoading = ref(false);
|
|
|
|
|
|
const [AuxiliaryReviewModalComp, auxiliaryReviewModalApi] = useVbenModal({
|
|
|
connectedComponent: AuxiliaryReviewModal,
|
|
|
@@ -103,9 +106,8 @@ const listColumns = [
|
|
|
];
|
|
|
|
|
|
const statusLabelMap: Record<string, string> = {
|
|
|
- pending: '待点评',
|
|
|
- qualified: '合格',
|
|
|
- unqualified: '不合格',
|
|
|
+ unreviewed: '未点评',
|
|
|
+ reviewed: '已点评',
|
|
|
};
|
|
|
|
|
|
const tableData = computed(() =>
|
|
|
@@ -118,74 +120,142 @@ const tableData = computed(() =>
|
|
|
);
|
|
|
|
|
|
function getHerbOptions() {
|
|
|
- return (currentPrescription.value?.herbs ?? []).map((herb) => {
|
|
|
- const name = herb.split(' ')[0] ?? herb;
|
|
|
- return { label: name, value: name };
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-async function loadIndicators() {
|
|
|
- const categories = await listReviewIndicatorCategoriesMethod();
|
|
|
- const reviewCategories = categories.filter((item) => item.id !== 'cat-6');
|
|
|
- const groups = await Promise.all(
|
|
|
- reviewCategories.map(async (category) => ({
|
|
|
- categoryId: category.id,
|
|
|
- categoryName: category.name,
|
|
|
- indicators: await listReviewIndicatorsByCategoryMethod(category.id, {
|
|
|
- enabledOnly: true,
|
|
|
- categoryName: category.name,
|
|
|
- }),
|
|
|
- })),
|
|
|
- );
|
|
|
- indicatorGroups.value = groups.filter((item) => item.indicators.length > 0);
|
|
|
+ const medicineList = currentPrescription.value?.medicineList ?? [];
|
|
|
+ if (medicineList.length > 0) {
|
|
|
+ return medicineList.map((item) => ({
|
|
|
+ label: item.medicineName,
|
|
|
+ value: item.medicineName,
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ return [];
|
|
|
}
|
|
|
|
|
|
-async function loadTask() {
|
|
|
- if (!taskId.value) return;
|
|
|
- taskLoading.value = true;
|
|
|
+async function ensureIndicatorsLoaded() {
|
|
|
+ if (indicatorsLoading.value) return;
|
|
|
+ indicatorsLoading.value = true;
|
|
|
try {
|
|
|
- const task = await getReviewTaskMethod(taskId.value);
|
|
|
- taskName.value = task.name;
|
|
|
+ const items = await listReviewIndicatorsForReviewMethod();
|
|
|
+ indicatorGroups.value = groupReviewIndicatorsByCategory(items);
|
|
|
+ indicatorsLoaded.value = true;
|
|
|
+ } catch (error: any) {
|
|
|
+ indicatorsLoaded.value = false;
|
|
|
+ message.error(error.message || '加载点评指标失败');
|
|
|
} finally {
|
|
|
- taskLoading.value = false;
|
|
|
+ indicatorsLoading.value = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function getListQuery() {
|
|
|
+ return {
|
|
|
+ departmentName: filterDepartment.value,
|
|
|
+ doctorName: filterDoctor.value,
|
|
|
+ institutionName: filterInstitution.value,
|
|
|
+ status: filterStatus.value,
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+async function fetchPrescriptionsPage(page: number) {
|
|
|
+ if (!taskId.value) {
|
|
|
+ return { items: [], total: 0 };
|
|
|
+ }
|
|
|
+ return listReviewPrescriptionsMethod(
|
|
|
+ taskId.value,
|
|
|
+ page,
|
|
|
+ pageSize.value,
|
|
|
+ getListQuery(),
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
async function loadPrescriptions() {
|
|
|
if (!taskId.value) return;
|
|
|
listLoading.value = true;
|
|
|
try {
|
|
|
- const result = await listReviewPrescriptionsMethod(
|
|
|
- taskId.value,
|
|
|
- currentPage.value,
|
|
|
- pageSize.value,
|
|
|
- {
|
|
|
- departmentName: filterDepartment.value,
|
|
|
- doctorName: filterDoctor.value,
|
|
|
- institutionName: filterInstitution.value,
|
|
|
- status: filterStatus.value,
|
|
|
- },
|
|
|
- );
|
|
|
+ const result = await fetchPrescriptionsPage(currentPage.value);
|
|
|
prescriptions.value = result.items;
|
|
|
total.value = result.total;
|
|
|
if (!selectedId.value && result.items.length > 0) {
|
|
|
const first = result.items[0];
|
|
|
if (first) selectPrescription(first.id);
|
|
|
}
|
|
|
+ } catch (error: any) {
|
|
|
+ prescriptions.value = [];
|
|
|
+ total.value = 0;
|
|
|
+ message.error(error.message || '加载处方列表失败');
|
|
|
} finally {
|
|
|
listLoading.value = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function findNextPendingInList(
|
|
|
+ items: PrescriptionReviewModel.ReviewPrescriptionRecord[],
|
|
|
+ afterIndex: number,
|
|
|
+) {
|
|
|
+ for (let i = afterIndex + 1; i < items.length; i++) {
|
|
|
+ const item = items[i];
|
|
|
+ if (item?.status === 'unreviewed') return item;
|
|
|
+ }
|
|
|
+ for (let i = 0; i <= afterIndex; i++) {
|
|
|
+ const item = items[i];
|
|
|
+ if (item?.status === 'unreviewed') return item;
|
|
|
+ }
|
|
|
+ return undefined;
|
|
|
+}
|
|
|
+
|
|
|
+/** 保存后自动跳转到下一条未点评记录 */
|
|
|
+async function selectNextPendingPrescription(savedId: string) {
|
|
|
+ const savedIndex = prescriptions.value.findIndex((item) => item.id === savedId);
|
|
|
+ const nextInPage = findNextPendingInList(
|
|
|
+ prescriptions.value,
|
|
|
+ savedIndex >= 0 ? savedIndex : prescriptions.value.length - 1,
|
|
|
+ );
|
|
|
+ if (nextInPage) {
|
|
|
+ selectPrescription(nextInPage.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const totalPages = Math.max(1, Math.ceil(total.value / pageSize.value));
|
|
|
+
|
|
|
+ for (let page = currentPage.value + 1; page <= totalPages; page++) {
|
|
|
+ const result = await fetchPrescriptionsPage(page);
|
|
|
+ const pending = result.items.find((item) => item.status === 'unreviewed');
|
|
|
+ if (pending) {
|
|
|
+ currentPage.value = page;
|
|
|
+ prescriptions.value = result.items;
|
|
|
+ selectPrescription(pending.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let page = 1; page < currentPage.value; page++) {
|
|
|
+ const result = await fetchPrescriptionsPage(page);
|
|
|
+ const pending = result.items.find((item) => item.status === 'unreviewed');
|
|
|
+ if (pending) {
|
|
|
+ currentPage.value = page;
|
|
|
+ prescriptions.value = result.items;
|
|
|
+ selectPrescription(pending.id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ selectedId.value = '';
|
|
|
+ currentPrescription.value = undefined;
|
|
|
+ message.info('当前任务处方已全部点评完成');
|
|
|
+}
|
|
|
+
|
|
|
async function loadPrescriptionDetail(id: string) {
|
|
|
detailLoading.value = true;
|
|
|
try {
|
|
|
- const detail = await getReviewPrescriptionMethod(id);
|
|
|
- currentPrescription.value = detail;
|
|
|
+ const detail = await getReviewPrescriptionMethod(id, taskId.value);
|
|
|
+ currentPrescription.value = {
|
|
|
+ ...currentPrescription.value,
|
|
|
+ ...detail,
|
|
|
+ };
|
|
|
qualified.value = detail.reviewResult?.qualified ?? true;
|
|
|
reviewComment.value = detail.reviewResult?.comment ?? '';
|
|
|
selectedIndicators.value = detail.reviewResult?.indicatorIds ?? [];
|
|
|
herbSelections.value = { ...(detail.reviewResult?.herbIndicatorMap ?? {}) };
|
|
|
+ } catch (error: any) {
|
|
|
+ message.error(error.message || '加载处方详情失败');
|
|
|
} finally {
|
|
|
detailLoading.value = false;
|
|
|
}
|
|
|
@@ -193,14 +263,24 @@ async function loadPrescriptionDetail(id: string) {
|
|
|
|
|
|
function selectPrescription(id: string) {
|
|
|
selectedId.value = id;
|
|
|
+ const row = prescriptions.value.find((item) => item.id === id);
|
|
|
+ if (row) {
|
|
|
+ currentPrescription.value = { ...row };
|
|
|
+ qualified.value = true;
|
|
|
+ reviewComment.value = '';
|
|
|
+ selectedIndicators.value = [];
|
|
|
+ herbSelections.value = {};
|
|
|
+ }
|
|
|
loadPrescriptionDetail(id);
|
|
|
}
|
|
|
|
|
|
-function onQualifiedChange() {
|
|
|
- if (qualified.value) {
|
|
|
- selectedIndicators.value = [];
|
|
|
- herbSelections.value = {};
|
|
|
+async function onQualifiedChange() {
|
|
|
+ if (!qualified.value) {
|
|
|
+ await ensureIndicatorsLoaded();
|
|
|
+ return;
|
|
|
}
|
|
|
+ selectedIndicators.value = [];
|
|
|
+ herbSelections.value = {};
|
|
|
}
|
|
|
|
|
|
function onIndicatorChange(indicatorId: string, checked: boolean) {
|
|
|
@@ -220,28 +300,37 @@ function isIndicatorChecked(indicatorId: string) {
|
|
|
return selectedIndicators.value.includes(indicatorId);
|
|
|
}
|
|
|
|
|
|
-function needsHerbSelect(indicator: PrescriptionReviewModel.ReviewIndicator) {
|
|
|
- return indicator.categoryId === 'cat-2' || indicator.associatedChineseMedicine;
|
|
|
-}
|
|
|
-
|
|
|
function getRowClassName(record: { id: string }) {
|
|
|
return record.id === selectedId.value ? 'selected-row' : '';
|
|
|
}
|
|
|
|
|
|
async function openAuxiliaryReviewModal() {
|
|
|
- if (!selectedId.value) return;
|
|
|
+ const prescriptionId = currentPrescription.value?.prescriptionId;
|
|
|
+ if (!selectedId.value || !prescriptionId) {
|
|
|
+ message.warning('请先选择处方');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ await ensureIndicatorsLoaded();
|
|
|
try {
|
|
|
- const result = await getAuxiliaryReviewResultMethod(selectedId.value);
|
|
|
+ const result = await getAuxiliaryReviewResultMethod(prescriptionId);
|
|
|
auxiliaryReviewModalApi.setData({
|
|
|
indicatorGroups: indicatorGroups.value,
|
|
|
result,
|
|
|
herbOptions: getHerbOptions(),
|
|
|
onApply: (appliedResult: PrescriptionReviewModel.ReviewPrescriptionResult) => {
|
|
|
- qualified.value = false;
|
|
|
- selectedIndicators.value = [...(appliedResult.indicatorIds ?? [])];
|
|
|
- herbSelections.value = {
|
|
|
- ...(appliedResult.herbIndicatorMap ?? {}),
|
|
|
- };
|
|
|
+ qualified.value = appliedResult.qualified ?? false;
|
|
|
+ if (appliedResult.qualified) {
|
|
|
+ selectedIndicators.value = [];
|
|
|
+ herbSelections.value = {};
|
|
|
+ } else {
|
|
|
+ selectedIndicators.value = [...(appliedResult.indicatorIds ?? [])];
|
|
|
+ herbSelections.value = {
|
|
|
+ ...(appliedResult.herbIndicatorMap ?? {}),
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (appliedResult.comment) {
|
|
|
+ reviewComment.value = appliedResult.comment;
|
|
|
+ }
|
|
|
},
|
|
|
});
|
|
|
auxiliaryReviewModalApi.open();
|
|
|
@@ -251,18 +340,34 @@ async function openAuxiliaryReviewModal() {
|
|
|
}
|
|
|
|
|
|
async function onSave() {
|
|
|
- if (!selectedId.value) return;
|
|
|
+ if (!selectedId.value || !currentPrescription.value || !taskId.value) return;
|
|
|
+ if (!qualified.value) {
|
|
|
+ await ensureIndicatorsLoaded();
|
|
|
+ }
|
|
|
saving.value = true;
|
|
|
try {
|
|
|
- await saveReviewPrescriptionResultMethod(selectedId.value, {
|
|
|
- qualified: qualified.value,
|
|
|
- indicatorIds: qualified.value ? [] : selectedIndicators.value,
|
|
|
- herbIndicatorMap: qualified.value ? {} : herbSelections.value,
|
|
|
- comment: reviewComment.value,
|
|
|
+ const allIndicators = indicatorGroups.value.flatMap(
|
|
|
+ (group) => group.indicators,
|
|
|
+ );
|
|
|
+ await saveReviewPrescriptionResultMethod({
|
|
|
+ reviewDetailId: selectedId.value,
|
|
|
+ recordId: currentPrescription.value.recordId ?? taskId.value,
|
|
|
+ prescriptionId: currentPrescription.value.prescriptionId,
|
|
|
+ result: {
|
|
|
+ qualified: qualified.value,
|
|
|
+ indicatorIds: qualified.value ? [] : selectedIndicators.value,
|
|
|
+ herbIndicatorMap: qualified.value ? {} : herbSelections.value,
|
|
|
+ comment: reviewComment.value,
|
|
|
+ },
|
|
|
+ indicators: allIndicators,
|
|
|
+ excessMedicineOptions: currentPrescription.value.medicineList,
|
|
|
+ reviewUserId: userStore.userInfo?.userId,
|
|
|
+ reviewUserName: userStore.userInfo?.realName,
|
|
|
});
|
|
|
message.success('保存成功');
|
|
|
+ const savedId = selectedId.value;
|
|
|
await loadPrescriptions();
|
|
|
- await loadPrescriptionDetail(selectedId.value);
|
|
|
+ await selectNextPendingPrescription(savedId);
|
|
|
} catch (error: any) {
|
|
|
message.error(error.message || '保存失败');
|
|
|
} finally {
|
|
|
@@ -287,15 +392,17 @@ watch(
|
|
|
},
|
|
|
);
|
|
|
|
|
|
-onMounted(async () => {
|
|
|
- await Promise.all([loadTask(), loadIndicators()]);
|
|
|
- await loadPrescriptions();
|
|
|
+onMounted(() => {
|
|
|
+ const name = route.query.name;
|
|
|
+ taskName.value = Array.isArray(name) ? (name[0] ?? '') : (name ?? '');
|
|
|
+ loadPrescriptions();
|
|
|
+ ensureIndicatorsLoaded();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
<Page auto-content-height class="review-workspace-page">
|
|
|
- <Spin :spinning="taskLoading">
|
|
|
+ <div>
|
|
|
<div class="workspace-header">
|
|
|
<Button type="link" @click="goBack">返回</Button>
|
|
|
<span v-if="taskName" class="workspace-title">{{ taskName }}</span>
|
|
|
@@ -306,9 +413,8 @@ onMounted(async () => {
|
|
|
<Select
|
|
|
v-model:value="filterStatus"
|
|
|
:options="[
|
|
|
- { label: '待点评', value: 'pending' },
|
|
|
- { label: '合格', value: 'qualified' },
|
|
|
- { label: '不合格', value: 'unqualified' },
|
|
|
+ { label: '未点评', value: 'unreviewed' },
|
|
|
+ { label: '已点评', value: 'reviewed' },
|
|
|
]"
|
|
|
allow-clear
|
|
|
class="filter-item"
|
|
|
@@ -406,10 +512,15 @@ onMounted(async () => {
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="review-form">
|
|
|
- <div v-if="qualified" class="qualified-panel">
|
|
|
+ <div
|
|
|
+ :class="qualified ? 'qualified-panel' : 'review-form-panel'"
|
|
|
+ >
|
|
|
<div class="review-form-header">
|
|
|
<span class="form-title">点评结果:</span>
|
|
|
- <RadioGroup v-model:value="qualified" @change="onQualifiedChange">
|
|
|
+ <RadioGroup
|
|
|
+ v-model:value="qualified"
|
|
|
+ @change="onQualifiedChange"
|
|
|
+ >
|
|
|
<Radio :value="true">合格</Radio>
|
|
|
<Radio :value="false">不合格</Radio>
|
|
|
</RadioGroup>
|
|
|
@@ -420,6 +531,55 @@ onMounted(async () => {
|
|
|
辅助点评结果
|
|
|
</a>
|
|
|
</div>
|
|
|
+ <div v-if="!qualified" class="indicator-section">
|
|
|
+ <Spin :spinning="indicatorsLoading">
|
|
|
+ <template v-if="indicatorGroups.length">
|
|
|
+ <div
|
|
|
+ v-for="group in indicatorGroups"
|
|
|
+ :key="`${group.categoryId}-${group.categoryName}`"
|
|
|
+ class="indicator-group"
|
|
|
+ >
|
|
|
+ <div class="group-title">{{ group.categoryName }}</div>
|
|
|
+ <div class="group-items">
|
|
|
+ <template
|
|
|
+ v-for="indicator in group.indicators"
|
|
|
+ :key="indicator.id"
|
|
|
+ >
|
|
|
+ <div class="indicator-item">
|
|
|
+ <Checkbox
|
|
|
+ :checked="isIndicatorChecked(indicator.id)"
|
|
|
+ @change="
|
|
|
+ (e) =>
|
|
|
+ onIndicatorChange(
|
|
|
+ indicator.id,
|
|
|
+ e.target.checked ?? false,
|
|
|
+ )
|
|
|
+ "
|
|
|
+ >
|
|
|
+ {{ indicator.name }}
|
|
|
+ </Checkbox>
|
|
|
+ <Select
|
|
|
+ v-if="
|
|
|
+ isIndicatorChecked(indicator.id) &&
|
|
|
+ needsHerbSelect(indicator)
|
|
|
+ "
|
|
|
+ v-model:value="herbSelections[indicator.id]"
|
|
|
+ :options="getHerbOptions()"
|
|
|
+ class="herb-select"
|
|
|
+ mode="multiple"
|
|
|
+ placeholder="选择中药"
|
|
|
+ size="small"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div v-else-if="!indicatorsLoading" class="indicator-empty">
|
|
|
+ 暂无点评指标
|
|
|
+ </div>
|
|
|
+ </Spin>
|
|
|
+ </div>
|
|
|
<div class="comment-section">
|
|
|
<div class="comment-label">点评意见和说明</div>
|
|
|
<Textarea
|
|
|
@@ -429,70 +589,13 @@ onMounted(async () => {
|
|
|
/>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <template v-else>
|
|
|
- <div class="review-form-header">
|
|
|
- <span class="form-title">点评结果:</span>
|
|
|
- <RadioGroup v-model:value="qualified" @change="onQualifiedChange">
|
|
|
- <Radio :value="true">合格</Radio>
|
|
|
- <Radio :value="false">不合格</Radio>
|
|
|
- </RadioGroup>
|
|
|
- <a
|
|
|
- class="auxiliary-link"
|
|
|
- @click.prevent="openAuxiliaryReviewModal"
|
|
|
- >
|
|
|
- 辅助点评结果
|
|
|
- </a>
|
|
|
- </div>
|
|
|
- <div class="indicator-section">
|
|
|
- <div
|
|
|
- v-for="group in indicatorGroups"
|
|
|
- :key="group.categoryId"
|
|
|
- class="indicator-group"
|
|
|
- >
|
|
|
- <div class="group-title">{{ group.categoryName }}</div>
|
|
|
- <div class="group-items">
|
|
|
- <template
|
|
|
- v-for="indicator in group.indicators"
|
|
|
- :key="indicator.id"
|
|
|
- >
|
|
|
- <div class="indicator-item">
|
|
|
- <Checkbox
|
|
|
- :checked="isIndicatorChecked(indicator.id)"
|
|
|
- @change="
|
|
|
- (e) =>
|
|
|
- onIndicatorChange(
|
|
|
- indicator.id,
|
|
|
- e.target.checked ?? false,
|
|
|
- )
|
|
|
- "
|
|
|
- >
|
|
|
- {{ indicator.name }}
|
|
|
- </Checkbox>
|
|
|
- <Select
|
|
|
- v-if="
|
|
|
- isIndicatorChecked(indicator.id) &&
|
|
|
- needsHerbSelect(indicator)
|
|
|
- "
|
|
|
- v-model:value="herbSelections[indicator.id]"
|
|
|
- :options="getHerbOptions()"
|
|
|
- class="herb-select"
|
|
|
- mode="multiple"
|
|
|
- placeholder="选择中药"
|
|
|
- size="small"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
</div>
|
|
|
</template>
|
|
|
<div v-else class="empty-panel">请选择处方进行点评</div>
|
|
|
</Spin>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </Spin>
|
|
|
+ </div>
|
|
|
<AuxiliaryReviewModalComp />
|
|
|
<div v-if="currentPrescription" class="review-save-bar">
|
|
|
<Button :loading="saving" type="primary" @click="onSave">保存</Button>
|
|
|
@@ -505,7 +608,6 @@ onMounted(async () => {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
gap: 12px;
|
|
|
- margin-bottom: 12px;
|
|
|
}
|
|
|
|
|
|
.workspace-title {
|
|
|
@@ -600,12 +702,23 @@ onMounted(async () => {
|
|
|
font-size: 13px;
|
|
|
}
|
|
|
|
|
|
-.qualified-panel {
|
|
|
+.qualified-panel,
|
|
|
+.review-form-panel {
|
|
|
padding: 16px;
|
|
|
background: #f5f5f5;
|
|
|
border-radius: 4px;
|
|
|
}
|
|
|
|
|
|
+.review-form-panel .review-form-header {
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.review-form-panel .indicator-section {
|
|
|
+ margin-bottom: 16px;
|
|
|
+ padding: 0;
|
|
|
+ background: transparent;
|
|
|
+}
|
|
|
+
|
|
|
.review-form-header {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
@@ -616,6 +729,10 @@ onMounted(async () => {
|
|
|
margin-bottom: 16px;
|
|
|
}
|
|
|
|
|
|
+.review-form-panel .comment-section {
|
|
|
+ margin-top: 0;
|
|
|
+}
|
|
|
+
|
|
|
.form-title {
|
|
|
margin-right: 12px;
|
|
|
font-weight: 500;
|
|
|
@@ -659,6 +776,12 @@ onMounted(async () => {
|
|
|
width: 140px;
|
|
|
}
|
|
|
|
|
|
+.indicator-empty {
|
|
|
+ padding: 8px 0;
|
|
|
+ font-size: 13px;
|
|
|
+ color: rgb(0 0 0 / 45%);
|
|
|
+}
|
|
|
+
|
|
|
.comment-section {
|
|
|
margin-bottom: 0;
|
|
|
}
|
|
|
@@ -681,4 +804,8 @@ onMounted(async () => {
|
|
|
text-align: center;
|
|
|
color: rgb(0 0 0 / 45%);
|
|
|
}
|
|
|
+
|
|
|
+.ant-btn {
|
|
|
+ padding: 0 3px;
|
|
|
+}
|
|
|
</style>
|