|
@@ -126,7 +126,7 @@
|
|
|
<Dialog
|
|
<Dialog
|
|
|
:title="dialogTitle"
|
|
:title="dialogTitle"
|
|
|
v-model="dialogVisible"
|
|
v-model="dialogVisible"
|
|
|
- width="680px"
|
|
|
|
|
|
|
+ width="780px"
|
|
|
:close-on-click-modal="false"
|
|
:close-on-click-modal="false"
|
|
|
destroy-on-close
|
|
destroy-on-close
|
|
|
>
|
|
>
|
|
@@ -137,110 +137,121 @@
|
|
|
label-width="100px"
|
|
label-width="100px"
|
|
|
v-loading="formLoading"
|
|
v-loading="formLoading"
|
|
|
>
|
|
>
|
|
|
- <el-form-item label="部门" prop="deptId">
|
|
|
|
|
- <el-tree-select
|
|
|
|
|
- v-model="formData.deptId"
|
|
|
|
|
- :data="deptList"
|
|
|
|
|
- :props="defaultProps"
|
|
|
|
|
- node-key="id"
|
|
|
|
|
- filterable
|
|
|
|
|
- clearable
|
|
|
|
|
- placeholder="请选择部门"
|
|
|
|
|
- class="w-full"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="成果名称" prop="achievementName">
|
|
|
|
|
- <el-input v-model="formData.achievementName" placeholder="请输入成果名称" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="成果类型" prop="achievementType">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="formData.achievementType"
|
|
|
|
|
- placeholder="请选择成果类型"
|
|
|
|
|
- clearable
|
|
|
|
|
- class="w-full"
|
|
|
|
|
- @change="handleAchievementTypeChange"
|
|
|
|
|
- >
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="dict in getStrDictOptions(DICT_TYPE.ACHIEVEMENT_TYPE)"
|
|
|
|
|
- :key="dict.value"
|
|
|
|
|
- :label="dict.label"
|
|
|
|
|
- :value="dict.value"
|
|
|
|
|
- />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="子类型" prop="subType">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="formData.subType"
|
|
|
|
|
- placeholder="请先选择成果类型"
|
|
|
|
|
- clearable
|
|
|
|
|
- class="w-full"
|
|
|
|
|
- :disabled="!formData.achievementType"
|
|
|
|
|
- >
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="dict in subTypeOptions"
|
|
|
|
|
- :key="dict.value"
|
|
|
|
|
- :label="dict.label"
|
|
|
|
|
- :value="dict.value"
|
|
|
|
|
|
|
+ <div class="form-basic-grid">
|
|
|
|
|
+ <el-form-item label="部门" prop="deptId">
|
|
|
|
|
+ <el-tree-select
|
|
|
|
|
+ v-model="formData.deptId"
|
|
|
|
|
+ :data="deptList"
|
|
|
|
|
+ :props="defaultProps"
|
|
|
|
|
+ node-key="id"
|
|
|
|
|
+ filterable
|
|
|
|
|
+ clearable
|
|
|
|
|
+ placeholder="请选择部门"
|
|
|
|
|
+ class="w-full"
|
|
|
/>
|
|
/>
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="概述" prop="summary">
|
|
|
|
|
- <el-input
|
|
|
|
|
- v-model="formData.summary"
|
|
|
|
|
- type="textarea"
|
|
|
|
|
- :rows="5"
|
|
|
|
|
- placeholder="请输入成果概述"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-divider v-if="formData.extAttributes.length" content-position="center"
|
|
|
|
|
- >详细信息</el-divider
|
|
|
|
|
- >
|
|
|
|
|
- <div v-loading="extendLoading">
|
|
|
|
|
- <el-form-item
|
|
|
|
|
- v-for="(attribute, index) in formData.extAttributes"
|
|
|
|
|
- :key="attribute.identifier || index"
|
|
|
|
|
- :label="attribute.name"
|
|
|
|
|
- :prop="`extAttributes.${index}.actualValue`"
|
|
|
|
|
- :rules="getAttributeRules(attribute)"
|
|
|
|
|
- label-width="130px"
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="成果名称" prop="achievementName">
|
|
|
|
|
+ <el-input v-model="formData.achievementName" placeholder="请输入成果名称" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="成果类型" prop="achievementType">
|
|
|
<el-select
|
|
<el-select
|
|
|
- v-if="attribute.dataType === 'dropdown'"
|
|
|
|
|
- v-model="attribute.actualValue"
|
|
|
|
|
- placeholder="请选择"
|
|
|
|
|
|
|
+ v-model="formData.achievementType"
|
|
|
|
|
+ placeholder="请选择成果类型"
|
|
|
clearable
|
|
clearable
|
|
|
class="w-full"
|
|
class="w-full"
|
|
|
|
|
+ @change="handleAchievementTypeChange"
|
|
|
>
|
|
>
|
|
|
<el-option
|
|
<el-option
|
|
|
- v-for="option in attribute.dropdownList || []"
|
|
|
|
|
- :key="option.value"
|
|
|
|
|
- :label="option.name"
|
|
|
|
|
- :value="option.value"
|
|
|
|
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.ACHIEVEMENT_TYPE)"
|
|
|
|
|
+ :key="dict.value"
|
|
|
|
|
+ :label="dict.label"
|
|
|
|
|
+ :value="dict.value"
|
|
|
/>
|
|
/>
|
|
|
</el-select>
|
|
</el-select>
|
|
|
- <el-date-picker
|
|
|
|
|
- v-else-if="attribute.dataType === 'date'"
|
|
|
|
|
- v-model="attribute.dateValue"
|
|
|
|
|
- type="date"
|
|
|
|
|
- placeholder="请选择日期"
|
|
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="子类型" prop="subType">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="formData.subType"
|
|
|
|
|
+ placeholder="请先选择成果类型"
|
|
|
|
|
+ clearable
|
|
|
class="w-full"
|
|
class="w-full"
|
|
|
- />
|
|
|
|
|
- <el-input
|
|
|
|
|
- v-else
|
|
|
|
|
- v-model="attribute.actualValue"
|
|
|
|
|
- :placeholder="`请输入${attribute.name}`"
|
|
|
|
|
- />
|
|
|
|
|
|
|
+ :disabled="!formData.achievementType"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="dict in subTypeOptions"
|
|
|
|
|
+ :key="dict.value"
|
|
|
|
|
+ :label="dict.label"
|
|
|
|
|
+ :value="dict.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-divider v-if="attachmentGroups.length" content-position="center">附件资料</el-divider>
|
|
|
|
|
- <el-form-item v-for="group in attachmentGroups" :key="group.type" :label="group.label">
|
|
|
|
|
- <UploadFile
|
|
|
|
|
- v-model="attachmentFiles[group.type]"
|
|
|
|
|
- :file-type="['pdf', 'png', 'jpg', 'jpeg']"
|
|
|
|
|
- :return-object="true"
|
|
|
|
|
- :limit="10"
|
|
|
|
|
|
|
+ <el-form-item label="概述" prop="summary">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="formData.summary"
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ :rows="3"
|
|
|
|
|
+ placeholder="请输入成果概述"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
+ <div class="form-extra-sections">
|
|
|
|
|
+ <div v-if="formData.extAttributes.length" class="form-extra-section">
|
|
|
|
|
+ <el-divider content-position="center">详细信息</el-divider>
|
|
|
|
|
+ <div v-loading="extendLoading" class="form-attribute-grid">
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-for="(attribute, index) in formData.extAttributes"
|
|
|
|
|
+ :key="attribute.identifier || index"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-form-item
|
|
|
|
|
+ :label="attribute.name"
|
|
|
|
|
+ :prop="`extAttributes.${index}.actualValue`"
|
|
|
|
|
+ :rules="getAttributeRules(attribute)"
|
|
|
|
|
+ label-width="130px"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-if="attribute.dataType === 'dropdown'"
|
|
|
|
|
+ v-model="attribute.actualValue"
|
|
|
|
|
+ placeholder="请选择"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ class="w-full"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="option in attribute.dropdownList || []"
|
|
|
|
|
+ :key="option.value"
|
|
|
|
|
+ :label="option.name"
|
|
|
|
|
+ :value="option.value"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-else-if="attribute.dataType === 'date'"
|
|
|
|
|
+ v-model="attribute.dateValue"
|
|
|
|
|
+ type="date"
|
|
|
|
|
+ placeholder="请选择日期"
|
|
|
|
|
+ class="w-full"
|
|
|
|
|
+ />
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-else
|
|
|
|
|
+ v-model="attribute.actualValue"
|
|
|
|
|
+ :placeholder="`请输入${attribute.name}`"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-if="attachmentGroups.length" class="form-extra-section">
|
|
|
|
|
+ <el-divider content-position="center">附件资料</el-divider>
|
|
|
|
|
+ <div class="form-attachment-grid">
|
|
|
|
|
+ <el-form-item v-for="group in attachmentGroups" :key="group.type" :label="group.label">
|
|
|
|
|
+ <UploadFile
|
|
|
|
|
+ v-model="attachmentFiles[group.type]"
|
|
|
|
|
+ :file-type="['pdf', 'png', 'jpg', 'jpeg']"
|
|
|
|
|
+ :return-object="true"
|
|
|
|
|
+ :limit="10"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
|
<el-button type="primary" :loading="formLoading" @click="submitForm">确定</el-button>
|
|
<el-button type="primary" :loading="formLoading" @click="submitForm">确定</el-button>
|
|
@@ -753,6 +764,42 @@ onMounted(async () => {
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
|
|
|
+.form-basic-grid {
|
|
|
|
|
+ display: grid;
|
|
|
|
|
+ grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
|
|
|
+ gap: 0 20px;
|
|
|
|
|
+ align-items: start;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-extra-sections {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 4px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-extra-section {
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-attribute-grid,
|
|
|
|
|
+.form-attachment-grid {
|
|
|
|
|
+ display: grid;
|
|
|
|
|
+ grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
|
|
|
+ gap: 0 20px;
|
|
|
|
|
+ align-items: start;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@media (max-width: 640px) {
|
|
|
|
|
+ .form-basic-grid {
|
|
|
|
|
+ grid-template-columns: 1fr;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .form-attribute-grid,
|
|
|
|
|
+ .form-attachment-grid {
|
|
|
|
|
+ grid-template-columns: 1fr;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.achievement-detail {
|
|
.achievement-detail {
|
|
|
max-height: 68vh;
|
|
max-height: 68vh;
|
|
|
overflow-y: auto;
|
|
overflow-y: auto;
|