|
|
@@ -1,51 +1,119 @@
|
|
|
<template>
|
|
|
<main class="safety-platform-container__main">
|
|
|
- <BasicForm
|
|
|
- ref="basicFormRef"
|
|
|
- :formData="ruleFormData"
|
|
|
- :formRules="isViewMode ? undefined : formRules"
|
|
|
- :formConfig="computedFormConfig"
|
|
|
+ <el-form
|
|
|
+ ref="formRef"
|
|
|
+ :model="ruleFormData"
|
|
|
+ :rules="formRules"
|
|
|
+ label-width="auto"
|
|
|
+ class="check-template-form"
|
|
|
>
|
|
|
- <template #fileFormat>
|
|
|
- <el-radio-group v-model="ruleFormData.fileFormat" :disabled="isViewMode">
|
|
|
- <el-radio value="PDF">PDF</el-radio>
|
|
|
- <el-radio value="WORD">WORD</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </template>
|
|
|
- <template #fileUrl>
|
|
|
- <UploadFiles
|
|
|
- v-if="!isViewMode"
|
|
|
- label="上传文件"
|
|
|
- :maxCount="1"
|
|
|
- :fileList="uploadFileList"
|
|
|
- @uploadSuccess="handleUploadSuccess"
|
|
|
+ <el-form-item label="检查单模版名称:" prop="templateName">
|
|
|
+ <el-input
|
|
|
+ v-model="ruleFormData.templateName"
|
|
|
+ placeholder="请输入检查单模版名称"
|
|
|
+ :disabled="isViewMode"
|
|
|
/>
|
|
|
- <div v-else-if="ruleFormData.fileUrl" class="file-display">
|
|
|
- <a :href="ruleFormData.fileUrl" target="_blank" class="file-link">{{ getFileName(ruleFormData.fileUrl) }}</a>
|
|
|
- </div>
|
|
|
- <span v-else class="no-file">暂无文件</span>
|
|
|
- </template>
|
|
|
- <template #content>
|
|
|
- <div v-if="!isViewMode" class="editor-container">
|
|
|
- <Toolbar style="border-bottom: 1px solid #dcdfe6" :editor="editorRef" />
|
|
|
- <Editor
|
|
|
- style="height: 400px; overflow-y: auto"
|
|
|
- v-model="ruleFormData.content"
|
|
|
- mode="default"
|
|
|
- :defaultConfig="editorConfig"
|
|
|
- @on-created="handleEditorCreated"
|
|
|
- @on-change="handleEditorChange"
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="类别名称:" prop="categoryName">
|
|
|
+ <el-select
|
|
|
+ v-model="ruleFormData.categoryCode"
|
|
|
+ placeholder="请选择类别名称"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ style="width: 100%"
|
|
|
+ @change="onCategoryChange"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="item in CHECK_TEMPLATE_CATEGORY_OPTIONS"
|
|
|
+ :key="item.categoryCode"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.categoryCode"
|
|
|
/>
|
|
|
- </div>
|
|
|
- <div v-else class="content-display" v-html="ruleFormData.content || '暂无内容'"></div>
|
|
|
- </template>
|
|
|
- <template #status>
|
|
|
- <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
|
|
|
- <el-radio :value="1">启用</el-radio>
|
|
|
- <el-radio :value="0">禁用</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </template>
|
|
|
- </BasicForm>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="业务工作:" prop="businessWork">
|
|
|
+ <el-input
|
|
|
+ v-model="ruleFormData.businessWork"
|
|
|
+ placeholder="请输入业务工作"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="填写说明:" prop="fillInstruction">
|
|
|
+ <el-input
|
|
|
+ v-model="ruleFormData.fillInstruction"
|
|
|
+ type="textarea"
|
|
|
+ :rows="5"
|
|
|
+ placeholder="请输入填写说明(限300字)"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ maxlength="300"
|
|
|
+ show-word-limit
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <div class="check-items-section">
|
|
|
+ <div class="section-header">
|
|
|
+ <el-upload
|
|
|
+ v-if="isEditMode && props.id"
|
|
|
+ :show-file-list="false"
|
|
|
+ :http-request="handleImportItem"
|
|
|
+ accept=".xlsx,.xls"
|
|
|
+ >
|
|
|
+ <el-button type="primary" size="small">批量导入明细</el-button>
|
|
|
+ </el-upload>
|
|
|
+ </div>
|
|
|
+ <div class="check-items-table">
|
|
|
+ <el-table :data="checkItems" border>
|
|
|
+ <el-table-column label="编号" type="index" width="80" align="center" />
|
|
|
+ <el-table-column label="检查内容" min-width="180">
|
|
|
+ <template #header>
|
|
|
+ <span>检查内容<span style="color: red">*</span></span>
|
|
|
+ </template>
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.checkContent"
|
|
|
+ placeholder="请输入检查内容"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="检查标准" min-width="180">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.checkStandard"
|
|
|
+ placeholder="请输入检查标准"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="检查结果" min-width="150" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-radio-group v-model="scope.row.checkResult" :disabled="isViewMode">
|
|
|
+ <el-radio value="合格">合格</el-radio>
|
|
|
+ <el-radio value="不合格">不合格</el-radio>
|
|
|
+ <el-radio value="待检">待检</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="检查发现问题" min-width="200">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.checkProblem"
|
|
|
+ placeholder="请输入检查发现问题"
|
|
|
+ :disabled="isViewMode"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column v-if="!isViewMode" label="操作" fixed="right" width="350" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button type="primary" link @click="handleAddItem(scope.$index)">新增</el-button>
|
|
|
+ <el-button type="primary" link @click="handleMoveUp(scope.$index)">向上插入分类</el-button>
|
|
|
+ <el-button type="primary" link @click="handleMoveDown(scope.$index)">向下插入分类</el-button>
|
|
|
+ <el-button type="danger" link @click="handleDeleteItem(scope.$index)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</main>
|
|
|
<footer class="safety-platform-container__footer">
|
|
|
<el-button @click="router.back()">返回</el-button>
|
|
|
@@ -56,209 +124,227 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
- import { computed, onMounted, ref, shallowRef, onBeforeUnmount } from 'vue';
|
|
|
+ import { computed, onMounted, ref } from 'vue';
|
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
|
import { ElMessage } from 'element-plus';
|
|
|
- import BasicForm from '@/components/BasicForm.vue';
|
|
|
- import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
|
|
|
- import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
|
|
|
- import '@wangeditor/editor/dist/css/style.css';
|
|
|
- import { useFormConfigHook } from '@/hooks/useFormConfigHook';
|
|
|
- import { ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES } from '../configs/form';
|
|
|
+ import type { FormInstance } from 'element-plus';
|
|
|
import {
|
|
|
- queryAcademyFileById,
|
|
|
- saveAcademyFile,
|
|
|
- updateAcademyFile,
|
|
|
- type ProductionSafetyFile,
|
|
|
+ CHECK_TEMPLATE_CATEGORY_OPTIONS,
|
|
|
+ CHECK_TEMPLATE_FORM_DATA,
|
|
|
+ CHECK_TEMPLATE_FORM_RULES,
|
|
|
+ } from '../configs/form';
|
|
|
+ import {
|
|
|
+ queryChecklistTemplateDetail,
|
|
|
+ saveChecklistTemplateList,
|
|
|
+ updateChecklistTemplate,
|
|
|
+ importChecklistTemplateItem,
|
|
|
+ type ChecklistTemplateItem,
|
|
|
} from '@/api/production-safety-system';
|
|
|
- import type { FileItem } from '@/components/UploadFiles/types';
|
|
|
+
|
|
|
+ const props = defineProps<{
|
|
|
+ id?: number;
|
|
|
+ }>();
|
|
|
|
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
|
|
|
|
const operate = computed(() => (route.query.operate as string) || 'check-template-create');
|
|
|
- const currentId = computed(() => Number(route.query.id));
|
|
|
-
|
|
|
const isCreateMode = computed(() => operate.value === 'check-template-create');
|
|
|
const isEditMode = computed(() => operate.value === 'check-template-edit');
|
|
|
const isViewMode = computed(() => operate.value === 'check-template-view');
|
|
|
|
|
|
- const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
|
|
|
- useFormConfigHook(ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES);
|
|
|
-
|
|
|
- // 查看模式下,所有字段设为只读
|
|
|
- const viewFormConfig = ref(
|
|
|
- ACADEMY_FILE_FORM_CONFIG.map((item) => ({
|
|
|
- ...item,
|
|
|
- componentProps: {
|
|
|
- ...item.componentProps,
|
|
|
- disabled: true,
|
|
|
- },
|
|
|
- })),
|
|
|
- );
|
|
|
-
|
|
|
- const computedFormConfig = computed(() => {
|
|
|
- if (isViewMode.value) {
|
|
|
- return viewFormConfig.value;
|
|
|
- }
|
|
|
- return ruleFormConfig.value;
|
|
|
- });
|
|
|
+ const formRef = ref<FormInstance>();
|
|
|
+ const ruleFormData = ref({ ...CHECK_TEMPLATE_FORM_DATA });
|
|
|
+ const formRules = CHECK_TEMPLATE_FORM_RULES;
|
|
|
+
|
|
|
+ const checkItems = ref<CheckItemRow[]>([]);
|
|
|
|
|
|
- const basicFormRef = ref<InstanceType<typeof BasicForm>>();
|
|
|
-
|
|
|
- // 富文本编辑器
|
|
|
- const editorRef = shallowRef();
|
|
|
- const editorConfig = {
|
|
|
- placeholder: '请输入文档内容',
|
|
|
- MENU_CONF: {},
|
|
|
+ const onCategoryChange = (categoryCode: string) => {
|
|
|
+ const opt = CHECK_TEMPLATE_CATEGORY_OPTIONS.find((c) => c.categoryCode === categoryCode);
|
|
|
+ if (opt) ruleFormData.value.categoryName = opt.categoryName;
|
|
|
};
|
|
|
|
|
|
- const handleEditorCreated = (editor: any) => {
|
|
|
- editorRef.value = editor;
|
|
|
+ interface CheckItemRow {
|
|
|
+ id?: number;
|
|
|
+ templateId?: number;
|
|
|
+ checkContent: string;
|
|
|
+ checkStandard: string;
|
|
|
+ checkResult: string; // 合格/不合格/待检
|
|
|
+ checkProblem: string;
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleValidate = async () => {
|
|
|
+ if (!formRef.value) return;
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ formRef.value?.validate((valid: boolean) => {
|
|
|
+ resolve(valid);
|
|
|
+ });
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
- const handleEditorChange = () => {
|
|
|
- // 编辑器内容变化时的处理
|
|
|
+ const handleAddItem = (index: number) => {
|
|
|
+ checkItems.value.splice(index + 1, 0, createEmptyCheckItem());
|
|
|
};
|
|
|
|
|
|
- // 文件上传
|
|
|
- const uploadFileList = ref<FileItem[]>([]);
|
|
|
+ /** 向上插入分类:在当前行之前插入一条空白数据 */
|
|
|
+ const handleMoveUp = (index: number) => {
|
|
|
+ checkItems.value.splice(index, 0, createEmptyCheckItem());
|
|
|
+ };
|
|
|
|
|
|
- const handleUploadSuccess = (files: FileItem[]) => {
|
|
|
- uploadFileList.value = files;
|
|
|
- if (files.length > 0 && files[0].file) {
|
|
|
- // 这里需要实际上传文件到服务器,获取 fileUrl
|
|
|
- // 暂时使用文件对象,实际应该调用上传接口
|
|
|
- ruleFormData.fileUrl = files[0].file.name; // 临时处理,需要替换为实际上传后的URL
|
|
|
- }
|
|
|
+ /** 向下插入分类:在当前行之后插入一条空白数据 */
|
|
|
+ const handleMoveDown = (index: number) => {
|
|
|
+ checkItems.value.splice(index + 1, 0, createEmptyCheckItem());
|
|
|
};
|
|
|
|
|
|
- const getFileName = (url: string) => {
|
|
|
- if (!url) return '';
|
|
|
- const parts = url.split('/');
|
|
|
- return parts[parts.length - 1];
|
|
|
+ const handleDeleteItem = (index: number) => {
|
|
|
+ if (checkItems.value.length <= 1) {
|
|
|
+ ElMessage.warning('至少需要保留一条数据');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ checkItems.value.splice(index, 1);
|
|
|
};
|
|
|
|
|
|
- const handleValidate = async () => {
|
|
|
- if (!basicFormRef.value) return;
|
|
|
- const res = await basicFormRef.value.validateForm();
|
|
|
- return res;
|
|
|
+ const handleImportItem = async (options: { file: File }) => {
|
|
|
+ if (!props.id) return;
|
|
|
+ try {
|
|
|
+ await importChecklistTemplateItem(options.file, props.id);
|
|
|
+ ElMessage.success('导入成功');
|
|
|
+ await getDetail();
|
|
|
+ } catch (e: any) {
|
|
|
+ ElMessage.error(e?.message || '导入失败');
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const getDetail = async () => {
|
|
|
- if (!currentId.value) return;
|
|
|
+ if (!props.id) return;
|
|
|
+
|
|
|
try {
|
|
|
- const res = await queryAcademyFileById(currentId.value);
|
|
|
- if (res) {
|
|
|
- // 映射接口字段到表单字段
|
|
|
- ruleFormData.fileName = res.fileName || '';
|
|
|
- ruleFormData.classifyName = res.classifyName || '';
|
|
|
- ruleFormData.fileCode = res.fileCode || '';
|
|
|
- ruleFormData.fileVersion = res.fileVersion || '';
|
|
|
- ruleFormData.fileFormat = res.fileFormat || '';
|
|
|
- ruleFormData.releaseDate = res.releaseDate || '';
|
|
|
- ruleFormData.fileUrl = res.fileUrl || '';
|
|
|
- ruleFormData.content = res.content || '';
|
|
|
- ruleFormData.status = res.status ?? 1;
|
|
|
-
|
|
|
- // 如果有文件URL,转换为FileItem格式
|
|
|
- if (res.fileUrl) {
|
|
|
- uploadFileList.value = [
|
|
|
- {
|
|
|
- fileId: Date.now(),
|
|
|
- fileName: getFileName(res.fileUrl),
|
|
|
- fileType: res.fileFormat?.toLowerCase() === 'pdf' ? 'pdf' : 'word',
|
|
|
- fileSize: '0KB',
|
|
|
- },
|
|
|
- ];
|
|
|
- }
|
|
|
+ const detail = await queryChecklistTemplateDetail(props.id);
|
|
|
+ if (!detail) return;
|
|
|
+
|
|
|
+ ruleFormData.value.templateName = detail.templateName || '';
|
|
|
+ ruleFormData.value.categoryName = detail.categoryName || '';
|
|
|
+ ruleFormData.value.categoryCode = detail.categoryCode || '';
|
|
|
+ ruleFormData.value.businessWork = detail.businessWork || '';
|
|
|
+ ruleFormData.value.fillInstruction = detail.fillInstruction || '';
|
|
|
+
|
|
|
+ const items = detail.ChecklistTemplateItem;
|
|
|
+ if (items && items.length > 0) {
|
|
|
+ checkItems.value = items
|
|
|
+ .filter((it) => !it.isDeleted || it.isDeleted === 0)
|
|
|
+ .map((item) => ({
|
|
|
+ id: item.id,
|
|
|
+ templateId: item.templateId,
|
|
|
+ checkContent: item.checkContent || '',
|
|
|
+ checkStandard: item.checkStandard || '',
|
|
|
+ checkResult: item.checkResult || '待检',
|
|
|
+ checkProblem: item.checkProblem || '',
|
|
|
+ }));
|
|
|
}
|
|
|
- cloneRuleFormData();
|
|
|
- } catch (e) {
|
|
|
- console.error('获取院级文件详情失败:', e);
|
|
|
- ElMessage.error('获取详情失败');
|
|
|
+ if (checkItems.value.length === 0) checkItems.value = [createEmptyCheckItem()];
|
|
|
+ } catch (e: any) {
|
|
|
+ console.error('获取检查单模版详情失败:', e);
|
|
|
+ ElMessage.error(e?.message || '获取详情失败,请重试');
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+ const createEmptyCheckItem = (): CheckItemRow => ({
|
|
|
+ checkContent: '',
|
|
|
+ checkStandard: '',
|
|
|
+ checkResult: '待检',
|
|
|
+ checkProblem: '',
|
|
|
+ });
|
|
|
+
|
|
|
+ const validateCheckItems = (): boolean => {
|
|
|
+ for (let i = 0; i < checkItems.value.length; i++) {
|
|
|
+ const item = checkItems.value[i];
|
|
|
+ if (!item.checkContent || !item.checkContent.trim()) {
|
|
|
+ ElMessage.warning(`第 ${i + 1} 行的检查内容不能为空`);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ };
|
|
|
+
|
|
|
const handleSubmit = async () => {
|
|
|
- const res = await handleValidate();
|
|
|
- if (!res) return;
|
|
|
+ const valid = await handleValidate();
|
|
|
+ if (!valid) return;
|
|
|
+
|
|
|
+ if (!validateCheckItems()) return;
|
|
|
+
|
|
|
try {
|
|
|
- const basePayload: ProductionSafetyFile = {
|
|
|
- fileName: ruleFormData.fileName,
|
|
|
- classifyName: ruleFormData.classifyName,
|
|
|
- fileCode: ruleFormData.fileCode,
|
|
|
- fileVersion: ruleFormData.fileVersion,
|
|
|
- fileFormat: ruleFormData.fileFormat,
|
|
|
- releaseDate: ruleFormData.releaseDate,
|
|
|
- fileUrl: ruleFormData.fileUrl || undefined,
|
|
|
- content: ruleFormData.content || undefined,
|
|
|
- status: ruleFormData.status ?? 1,
|
|
|
+ const items: ChecklistTemplateItem[] = checkItems.value.map((item) => ({
|
|
|
+ id: item.id,
|
|
|
+ templateId: props.id ?? item.templateId,
|
|
|
+ checkContent: item.checkContent || '',
|
|
|
+ checkStandard: item.checkStandard || '',
|
|
|
+ checkResult: item.checkResult || '待检',
|
|
|
+ checkProblem: item.checkProblem || '',
|
|
|
+ isDeleted: 0,
|
|
|
+ }));
|
|
|
+
|
|
|
+ const payload = {
|
|
|
+ templateName: ruleFormData.value.templateName || '',
|
|
|
+ categoryName: ruleFormData.value.categoryName || '',
|
|
|
+ categoryCode: ruleFormData.value.categoryCode || '',
|
|
|
+ businessWork: ruleFormData.value.businessWork || '',
|
|
|
+ fillInstruction: ruleFormData.value.fillInstruction || '',
|
|
|
+ ChecklistTemplateItem: items,
|
|
|
};
|
|
|
|
|
|
- if (isCreateMode.value) {
|
|
|
- await saveAcademyFile(basePayload);
|
|
|
- ElMessage.success('创建成功');
|
|
|
- } else if (isEditMode.value && currentId.value) {
|
|
|
- await updateAcademyFile({
|
|
|
- id: currentId.value,
|
|
|
- ...basePayload,
|
|
|
- });
|
|
|
+ if (isEditMode.value && props.id) {
|
|
|
+ await updateChecklistTemplate({ id: props.id, ...payload });
|
|
|
ElMessage.success('保存成功');
|
|
|
+ } else {
|
|
|
+ await saveChecklistTemplateList(payload);
|
|
|
+ ElMessage.success('创建成功');
|
|
|
}
|
|
|
|
|
|
router.back();
|
|
|
- } catch (e) {
|
|
|
- console.error('保存院级文件失败:', e);
|
|
|
- ElMessage.error('保存失败,请重试');
|
|
|
+ } catch (e: any) {
|
|
|
+ console.error('保存检查单模版失败:', e);
|
|
|
+ ElMessage.error(e?.message || '保存失败,请重试');
|
|
|
}
|
|
|
};
|
|
|
|
|
|
onMounted(() => {
|
|
|
- cloneRuleFormData();
|
|
|
- beforeRouteLeave();
|
|
|
if (isEditMode.value || isViewMode.value) {
|
|
|
getDetail();
|
|
|
+ } else {
|
|
|
+ checkItems.value = [createEmptyCheckItem()];
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
- onBeforeUnmount(() => {
|
|
|
- const editor = editorRef.value;
|
|
|
- if (editor == null) return;
|
|
|
- editor.destroy();
|
|
|
- });
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@use '@/styles/page-details-layout.scss' as *;
|
|
|
|
|
|
- .editor-container {
|
|
|
- width: 100%;
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
- border-radius: 4px;
|
|
|
- overflow: hidden;
|
|
|
+ .check-template-form {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ width: 600px;
|
|
|
+ gap: 32px;
|
|
|
+
|
|
|
+ :deep(.el-form-item) {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.el-form-item__label) {
|
|
|
+ padding: 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- .content-display {
|
|
|
- min-height: 200px;
|
|
|
- padding: 12px;
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
- border-radius: 4px;
|
|
|
- background-color: #f5f7fa;
|
|
|
+ .check-items-section {
|
|
|
+ margin-top: 32px;
|
|
|
}
|
|
|
|
|
|
- .file-display {
|
|
|
- .file-link {
|
|
|
- color: #409eff;
|
|
|
- text-decoration: none;
|
|
|
- &:hover {
|
|
|
- text-decoration: underline;
|
|
|
- }
|
|
|
- }
|
|
|
+ .section-header {
|
|
|
+ display: flex;
|
|
|
+ gap: 10px;
|
|
|
+ margin-bottom: 20px;
|
|
|
}
|
|
|
|
|
|
- .no-file {
|
|
|
- color: rgba(0, 0, 0, 0.65);
|
|
|
+ .check-items-table {
|
|
|
+ width: 100%;
|
|
|
}
|
|
|
</style>
|
|
|
-
|