feat: 新增投资项目退出反馈、进度报告、计划申请及退出计划等管理功能模块及相关组件

This commit is contained in:
2025-12-27 01:11:47 +08:00
parent b29d128e41
commit 915cb66b40
11 changed files with 968 additions and 684 deletions

View File

@@ -5,7 +5,8 @@
<div class="form-meta">
<div class="meta-item">
<span>{{ t('projectExitPlan.form.applyDepartmentLabel') }}</span>
<el-input v-model="formData.applicationDept" size="small" :placeholder="t('projectExitPlan.placeholder.input')" />
<el-input v-model="formData.applicationDept" size="small"
:placeholder="t('projectExitPlan.placeholder.input')" />
</div>
<div class="meta-item">
<span>{{ t('projectExitPlan.form.applyDateLabel') }}</span>
@@ -20,7 +21,8 @@
<div class="table-cell label">{{ t('projectExitPlan.form.projectName') }}</div>
</template>
<div class="table-cell value project-name-cell">
<el-input v-model="formData.projectName" :placeholder="t('projectExitPlan.form.projectNamePlaceholder')" readonly>
<el-input v-model="formData.projectName"
:placeholder="t('projectExitPlan.form.projectNamePlaceholder')" readonly>
<template #suffix>
<el-icon class="cursor-pointer interactive-icon" @click="handleSelectProject">
<FolderOpened />
@@ -38,7 +40,8 @@
<div class="table-cell label">{{ t('projectExitPlan.form.exitSuggestion') }}</div>
</template>
<div class="table-cell value">
<el-input v-model="formData.exitRecommendation" :placeholder="t('projectExitPlan.placeholder.input')" />
<el-input v-model="formData.exitRecommendation"
:placeholder="t('projectExitPlan.placeholder.input')" />
</div>
</el-form-item>
@@ -65,7 +68,8 @@
<div class="table-cell label">{{ t('projectExitPlan.form.taskDescription') }}</div>
</template>
<div class="table-cell value">
<el-input v-model="formData.taskDescription" type="textarea" :rows="1" :placeholder="t('projectExitPlan.placeholder.input')" />
<el-input v-model="formData.taskDescription" type="textarea" :rows="1"
:placeholder="t('projectExitPlan.placeholder.input')" />
</div>
</el-form-item>
@@ -74,8 +78,10 @@
<div class="table-cell label">{{ t('projectExitPlan.form.executor') }}</div>
</template>
<div class="table-cell value">
<el-select v-model="formData.executor" clearable :placeholder="t('projectExitPlan.form.executorPlaceholder')">
<el-option :label="t('projectExitPlan.form.executorPlaceholder')" value="executor-placeholder" />
<el-select v-model="formData.executor" clearable
:placeholder="t('projectExitPlan.form.executorPlaceholder')">
<el-option :label="t('projectExitPlan.form.executorPlaceholder')"
value="executor-placeholder" />
</el-select>
</div>
</el-form-item>
@@ -85,23 +91,13 @@
<div class="table-cell label">{{ t('projectExitPlan.form.taskStartTime') }}</div>
</template>
<div class="table-cell value">
<el-date-picker
v-model="formData.taskStartDate"
type="date"
value-format="YYYY-MM-DD"
:placeholder="t('projectExitPlan.placeholder.select')"
style="width: 100%"
/>
<el-date-picker v-model="formData.taskStartDate" type="date" value-format="YYYY-MM-DD"
:placeholder="t('projectExitPlan.placeholder.select')" style="width: 100%" />
</div>
<div class="table-cell label">{{ t('projectExitPlan.form.taskEndTime') }}</div>
<div class="table-cell value">
<el-date-picker
v-model="formData.taskEndDate"
type="date"
value-format="YYYY-MM-DD"
:placeholder="t('projectExitPlan.placeholder.select')"
style="width: 100%"
/>
<el-date-picker v-model="formData.taskEndDate" type="date" value-format="YYYY-MM-DD"
:placeholder="t('projectExitPlan.placeholder.select')" style="width: 100%" />
</div>
</el-form-item>
</el-form>
@@ -117,31 +113,39 @@
</el-form-item>
</el-form>
</template>
<el-table :data="tableData" style="width: 100%" height="50vh" highlight-current-row border @current-change="handleSelectionChange">
<el-table :data="tableData" style="width: 100%" height="50vh" highlight-current-row border
@current-change="handleSelectionChange">
<el-table-column label="选择" width="80">
<template #default="scope">
<div class="options" :class="active === scope.$index ? 'active' : ''"></div>
</template>
</el-table-column>
<el-table-column prop="projectName" :label="t('projectLibrary.table.projectName')" min-width="200" />
<el-table-column prop="projectStartTime" :label="t('projectLibrary.table.projectImplementationStart')" min-width="160" />
<el-table-column prop="projectStartTime" :label="t('projectLibrary.table.projectImplementationStart')"
min-width="160" />
<el-table-column prop="projectNature" :label="t('projectLibrary.table.projectNature')" min-width="140">
<template #default="{ row }">
{{projectNatureOptions.find((item: Enums) => item.value === row.projectNature)?.label}}
</template>
</el-table-column>
<el-table-column prop="projectOwnerUnit" :label="t('projectLibrary.table.projectOwnerUnit')" min-width="200" />
<el-table-column prop="projectOwnerUnit" :label="t('projectLibrary.table.projectOwnerUnit')"
min-width="200" />
<el-table-column prop="" label="项目实施单位" />
<el-table-column prop="projectInvestmentDirection" :label="t('projectLibrary.table.projectDirection')" min-width="160" />
<el-table-column prop="mainBusinessTypes" :label="t('planApply.applySection.mainBusinessType')" min-width="160">
<el-table-column prop="projectInvestmentDirection" :label="t('projectLibrary.table.projectDirection')"
min-width="160" />
<el-table-column prop="mainBusinessTypes" :label="t('planApply.applySection.mainBusinessType')"
min-width="160">
<template #default="{ row }">
{{mainBusinessOptions.find((item: Enums) => item.value === row.mainBusinessTypes)?.label}}
</template>
</el-table-column>
<el-table-column prop="constructionStage" :label="t('projectLibrary.table.constructionStage')" min-width="120" />
<el-table-column prop="investmentCategory" :label="t('projectLibrary.table.investmentCategory')" min-width="140">
<el-table-column prop="constructionStage" :label="t('projectLibrary.table.constructionStage')"
min-width="120" />
<el-table-column prop="investmentCategory" :label="t('projectLibrary.table.investmentCategory')"
min-width="140">
<template #default="{ row }">
{{ investmentCategoryOptions.find((item: Enums) => item.value === row.investmentCategory)?.label }}
{{investmentCategoryOptions.find((item: Enums) => item.value === row.investmentCategory)?.label
}}
</template>
</el-table-column>
<el-table-column prop="" label="操作" fixed="right" width="100">
@@ -151,16 +155,10 @@
</el-table-column>
</el-table>
<div class="mt15 flex justify-end pagination-wrapper">
<el-pagination
background
layout="sizes, prev, pager, next, jumper, total"
:total="total"
:page-sizes="[10, 20, 50, 100]"
v-model:page-size="queryForm.size"
v-model:current-page="queryForm.page"
@size-change="handlePageSizeChange"
@current-change="handlePageChange"
/>
<el-pagination background layout="sizes, prev, pager, next, jumper, total" :total="total"
:page-sizes="[10, 20, 50, 100]" v-model:page-size="queryForm.size"
v-model:current-page="queryForm.page" @size-change="handlePageSizeChange"
@current-change="handlePageChange" />
</div>
<template #footer>
<el-button type="primary" @click="tableSubmit">确定</el-button>
@@ -371,9 +369,11 @@ defineExpose({
.table-cell.value {
flex: 1;
}
.table-row {
margin: 0;
}
.table-row.two-columns .table-cell.label {
width: 160px;
}
@@ -405,6 +405,7 @@ defineExpose({
.exit-plan-table :deep(.el-date-editor) {
width: 100%;
}
.options {
width: 20px;
height: 20px;
@@ -412,6 +413,7 @@ defineExpose({
border: 1px solid var(--el-border-color);
border-radius: 50%;
}
.active {
background-color: var(--el-color-primary);
color: white;
@@ -421,6 +423,7 @@ defineExpose({
height: 100%;
position: relative;
}
:deep(.el-form-item__label:before) {
left: 4px;
position: absolute;

View File

@@ -11,9 +11,11 @@
<el-col :span="24">
<el-form-item :label="t('planApply.applySection.projectName')" required prop="entity.projectName">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.projectName') }}</span>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.projectName')
}}</span>
</template>
<el-input v-model="formData.entity.projectName" :placeholder="t('planApply.placeholder.input')" readonly>
<el-input v-model="formData.entity.projectName" :placeholder="t('planApply.placeholder.input')"
readonly>
<template #append>
<el-icon class="cursor-pointer interactive-icon" @click="handleSelectProject">
<FolderOpened />
@@ -27,73 +29,73 @@
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.groupName')" required prop="entity.groupCompany">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.groupName') }}</span>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.groupName')
}}</span>
</template>
<el-input v-model="formData.entity.groupCompany" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.groupCompany"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectNature')">
<el-select v-model="formData.entity.projectNature" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in projectNatureOptions" :label="item.label" :value="item.value" :key="item.value" />
<el-select v-model="formData.entity.projectNature"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in projectNatureOptions" :label="item.label" :value="item.value"
:key="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectMainUnit')" required prop="entity.projectMainEntity">
<el-tree-select
v-model="formData.entity.projectMainEntity"
:data="projectMainEntityOptions"
check-strictly
node-key="name"
:props="{
<el-form-item :label="t('planApply.applySection.projectMainUnit')" required
prop="entity.projectMainEntity">
<el-tree-select v-model="formData.entity.projectMainEntity" :data="projectMainEntityOptions"
check-strictly node-key="name" :props="{
value: 'name',
label: 'name',
children: 'children',
}"
:render-after-expand="false"
@current-change="handleProjectMainUnitChange"
/>
}" :render-after-expand="false" @current-change="handleProjectMainUnitChange" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.projectOwnerUnit')">
<el-tree-select
v-model="formData.entity.projectOwnerUnit"
:data="projectMainEntityOptions"
check-strictly
node-key="name"
:props="{
<el-tree-select v-model="formData.entity.projectOwnerUnit" :data="projectMainEntityOptions"
check-strictly node-key="name" :props="{
value: 'name',
label: 'name',
children: 'children',
}"
:render-after-expand="false"
/>
}" :render-after-expand="false" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.investmentCategory')" required prop="entity.investmentCategory">
<el-form-item :label="t('planApply.applySection.investmentCategory')" required
prop="entity.investmentCategory">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.investmentCategory') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('planApply.applySection.investmentCategory') }}</span>
</template>
<el-select v-model="formData.entity.investmentCategory" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in investmentCategoryOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.investmentCategory"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in investmentCategoryOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.investmentType')" required prop="entity.investmentArea">
<el-form-item :label="t('planApply.applySection.investmentType')" required
prop="entity.investmentArea">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.investmentType') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('planApply.applySection.investmentType') }}</span>
</template>
<el-select v-model="formData.entity.investmentArea" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in investmentAreaOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.investmentArea"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in investmentAreaOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -101,38 +103,51 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectAddress')" required prop="entity.projectAddress">
<el-form-item :label="t('planApply.applySection.projectAddress')" required
prop="entity.projectAddress">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.projectAddress') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('planApply.applySection.projectAddress') }}</span>
</template>
<el-input v-model="formData.entity.projectAddress" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.projectAddress"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectDetailAddress')" required prop="entity.projectAddressDetail">
<el-form-item :label="t('planApply.applySection.projectDetailAddress')" required
prop="entity.projectAddressDetail">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.projectDetailAddress') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('planApply.applySection.projectDetailAddress') }}</span>
</template>
<el-input v-model="formData.entity.projectAddressDetail" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.projectAddressDetail"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.projectDirection')" required prop="entity.projectInvestmentDirection">
<el-select v-model="formData.entity.projectInvestmentDirection" :placeholder="t('planApply.placeholder.select')" >
<el-option v-for="item in projectDirectionOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item :label="t('reserveRegistration.basicInfo.projectDirection')" required
prop="entity.projectInvestmentDirection">
<el-select v-model="formData.entity.projectInvestmentDirection"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in projectDirectionOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.directionSubdivision')" required prop="entity.investmentDirectionSegmentation">
<el-form-item :label="t('reserveRegistration.basicInfo.directionSubdivision')" required
prop="entity.investmentDirectionSegmentation">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('reserveRegistration.basicInfo.directionSubdivision') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('reserveRegistration.basicInfo.directionSubdivision') }}</span>
</template>
<el-select v-model="formData.entity.investmentDirectionSegmentation" :placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in ProjectDirectionDetailsOptionsEnums" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.investmentDirectionSegmentation"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in ProjectDirectionDetailsOptionsEnums" :key="item.value"
:label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -140,22 +155,30 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.projectSource')" required prop="entity.projectSource">
<el-form-item :label="t('reserveRegistration.basicInfo.projectSource')" required
prop="entity.projectSource">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('reserveRegistration.basicInfo.projectSource') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('reserveRegistration.basicInfo.projectSource') }}</span>
</template>
<el-select v-model="formData.entity.projectSource" :placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in projectSourceOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.projectSource"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in projectSourceOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.constructionNature')" required prop="entity.constructionNature">
<el-form-item :label="t('planApply.applySection.constructionNature')" required
prop="entity.constructionNature">
<template #label>
<span style="color: var(--el-text-color-regular)">{{ t('planApply.applySection.constructionNature') }}</span>
<span style="color: var(--el-text-color-regular)">{{
t('planApply.applySection.constructionNature') }}</span>
</template>
<el-select v-model="formData.entity.constructionNature" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in constructionNatureOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.constructionNature"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in constructionNatureOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -163,16 +186,21 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.majorInvestmentProject')" required prop="entity.majorInvestmentProjects">
<el-select v-model="formData.entity.majorInvestmentProjects" :placeholder="t('planApply.placeholder.input')" >
<el-option v-for="item in yesOrNo" :value="item.value" :label="item.label" :key="item.value"/>
<el-form-item :label="t('reserveRegistration.basicInfo.majorInvestmentProject')" required
prop="entity.majorInvestmentProjects">
<el-select v-model="formData.entity.majorInvestmentProjects"
:placeholder="t('planApply.placeholder.input')">
<el-option v-for="item in yesOrNo" :value="item.value" :label="item.label"
:key="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.keyProject')" required prop="entity.keyProject">
<el-select v-model="formData.entity.keyProject" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in projectImportantOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.keyProject" :placeholder="t('planApply.placeholder.select')"
clearable>
<el-option v-for="item in projectImportantOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -180,32 +208,25 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.isWithinMainBusiness')" required prop="entity.isMainBusiness">
<el-select v-model="formData.entity.isMainBusiness" :placeholder="t('planApply.placeholder.select')" clearable
@change="(e:any) =>{
<el-form-item :label="t('planApply.applySection.isWithinMainBusiness')" required
prop="entity.isMainBusiness">
<el-select v-model="formData.entity.isMainBusiness"
:placeholder="t('planApply.placeholder.select')" clearable @change="(e: any) => {
if (e === '1') {
formData.entity.mainBusinessTypes = ''
}
}"
>
<el-option v-for="item in yesOrNo" :value="item.value" :label="item.label" :key="item.value"/>
}">
<el-option v-for="item in yesOrNo" :value="item.value" :label="item.label"
:key="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
:label="t('planApply.applySection.mainBusinessType')"
:required="formData.entity.isMainBusiness === '0'"
prop="entity.mainBusinessTypes"
>
<el-form-item :label="t('planApply.applySection.mainBusinessType')"
:required="formData.entity.isMainBusiness === '0'" prop="entity.mainBusinessTypes">
<el-select v-model="formData.entity.mainBusinessTypes">
<el-option
v-for="item in mainBusinessOptions"
:key="item.value"
:label="item.label"
:value="item.value"
:disabled="formData.entity.isMainBusiness !== '0'"
/>
<el-option v-for="item in mainBusinessOptions" :key="item.value" :label="item.label"
:value="item.value" :disabled="formData.entity.isMainBusiness !== '0'" />
</el-select>
</el-form-item>
</el-col>
@@ -213,13 +234,17 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.mainBusinessCode')" required prop="entity.mainBusinessCode">
<el-input v-model="formData.entity.mainBusinessCode" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('reserveRegistration.basicInfo.mainBusinessCode')" required
prop="entity.mainBusinessCode">
<el-input v-model="formData.entity.mainBusinessCode"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.isManufacturing')" required prop="entity.isManufacturingIndustry">
<el-select v-model="formData.entity.isManufacturingIndustry" :placeholder="t('planApply.placeholder.select')" clearable>
<el-form-item :label="t('planApply.applySection.isManufacturing')" required
prop="entity.isManufacturingIndustry">
<el-select v-model="formData.entity.isManufacturingIndustry"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option :label="t('planApply.common.yes')" :value="t('planApply.common.yes')" />
<el-option :label="t('planApply.common.no')" :value="t('planApply.common.no')" />
</el-select>
@@ -229,16 +254,22 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')" required prop="entity.isStrategicEmergingIndustries">
<el-select v-model="formData.entity.isStrategicEmergingIndustries" :placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in strategicIndustryOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')" required
prop="entity.isStrategicEmergingIndustries">
<el-select v-model="formData.entity.isStrategicEmergingIndustries"
:placeholder="t('planApply.placeholder.select')" clearable>
<el-option v-for="item in strategicIndustryOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.cityStrategy')" required prop="entity.urbanStrategy">
<el-select v-model="formData.entity.urbanStrategy" :placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in cityStrategyOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item :label="t('planApply.applySection.cityStrategy')" required
prop="entity.urbanStrategy">
<el-select v-model="formData.entity.urbanStrategy"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in cityStrategyOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -246,25 +277,17 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectImplementationStart')" required prop="entity.projectStartTime">
<el-date-picker
v-model="formData.entity.projectStartTime"
type="date"
value-format="YYYY-MM-DD"
:placeholder="t('planApply.placeholder.select')"
style="width: 100%"
/>
<el-form-item :label="t('planApply.applySection.projectImplementationStart')" required
prop="entity.projectStartTime">
<el-date-picker v-model="formData.entity.projectStartTime" type="date" value-format="YYYY-MM-DD"
:placeholder="t('planApply.placeholder.select')" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.applySection.projectImplementationEnd')" required prop="entity.projectEndTime">
<el-date-picker
v-model="formData.entity.projectEndTime"
type="date"
value-format="YYYY-MM-DD"
:placeholder="t('planApply.placeholder.select')"
style="width: 100%"
/>
<el-form-item :label="t('planApply.applySection.projectImplementationEnd')" required
prop="entity.projectEndTime">
<el-date-picker v-model="formData.entity.projectEndTime" type="date" value-format="YYYY-MM-DD"
:placeholder="t('planApply.placeholder.select')" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
@@ -275,19 +298,23 @@
<div class="panel-title">{{ t('planApply.planInvestment.currentYearTotalTitle') }}</div>
<div style="flex: 1">
<el-form-item style="height: 82px" :label="t('planApply.planInvestment.planYear')">
<el-date-picker
v-model="formData.entity.planInvestmentYear"
type="year"
value-format="YYYY"
:placeholder="t('planApply.placeholder.selectYear')"
style="width: 100%"
/>
<el-date-picker v-model="formData.entity.planInvestmentYear" type="year"
value-format="YYYY" :placeholder="t('planApply.placeholder.selectYear')"
style="width: 100%" />
</el-form-item>
<el-form-item style="height: 82px" :label="t('planApply.planInvestment.plannedImageQuota')+'(万元)'" required prop="entity.planImageQuota">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.planImageQuota" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item style="height: 82px"
:label="t('planApply.planInvestment.plannedImageQuota') + '(万元)'" required
prop="entity.planImageQuota">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.planImageQuota"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item style="height: 82px" :label="t('planApply.planInvestment.annualPlanPayment')+'(万元)'" required prop="entity.planPaymentLimit">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.planPaymentLimit" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item style="height: 82px"
:label="t('planApply.planInvestment.annualPlanPayment') + '(万元)'" required
prop="entity.planPaymentLimit">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.planPaymentLimit"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</div>
</div>
@@ -296,23 +323,37 @@
<div class="plan-investment-panel right-panel">
<div class="panel-title">{{ t('planApply.planInvestment.currentYearFundingTitle') }}</div>
<div style="flex: 1">
<el-form-item :label="t('planApply.investmentEstimate.capitalFunding')+'(万元)'" required prop="entity.ownedFunds">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.ownedFunds" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item :label="t('planApply.investmentEstimate.capitalFunding') + '(万元)'" required
prop="entity.ownedFunds">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.ownedFunds"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item :label="t('planApply.investmentEstimate.financialFunding')+'(万元)'" required prop="entity.financialFunds">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.financialFunds" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item :label="t('planApply.investmentEstimate.financialFunding') + '(万元)'" required
prop="entity.financialFunds">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.financialFunds"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item :label="t('planApply.investmentEstimate.externalRaisedFunds')+'(万元)'" required prop="entity.externalRaisedCapital">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.externalRaisedCapital" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item :label="t('planApply.investmentEstimate.externalRaisedFunds') + '(万元)'"
required prop="entity.externalRaisedCapital">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.externalRaisedCapital"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item :label="t('planApply.investmentEstimate.otherFunding')+'(万元)'" required prop="entity.otherFunds">
<el-input-number readonly :precision="2" length="20" :controls="false" v-model="formData.entity.otherFunds" :placeholder="t('planApply.placeholder.input')"></el-input-number>
<el-form-item :label="t('planApply.investmentEstimate.otherFunding') + '(万元)'" required
prop="entity.otherFunds">
<el-input-number readonly :precision="2" length="20" :controls="false"
v-model="formData.entity.otherFunds"
:placeholder="t('planApply.placeholder.input')"></el-input-number>
</el-form-item>
<el-form-item :label="t('planApply.investmentEstimate.financialFundingDescription')">
<el-input v-model="formData.entity.governmentFundSourceDesc" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.governmentFundSourceDesc"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item :label="t('planApply.investmentEstimate.otherFundingDescription')">
<el-input v-model="formData.entity.otherFundSourceDesc" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.otherFundSourceDesc"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</div>
</div>
@@ -321,8 +362,10 @@
<!--项目概述-->
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.applySection.projectOverview')" required prop="entity.projectDesc">
<el-input v-model="formData.entity.projectDesc" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('planApply.applySection.projectOverview')" required
prop="entity.projectDesc">
<el-input v-model="formData.entity.projectDesc"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
@@ -330,16 +373,12 @@
<el-row class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.applySection.projectInitialPlan')">
<el-input v-model="formData.entity.projectPreliminaryPlan" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="formData.entity.projectPreliminaryPlan"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
<el-form-item :label="t('planApply.headerForm.attachments')">
<UploadFile
:modelValue="formData.entity.projectPreliminaryPlanAttachment"
@change="uploadChange"
:fileSize="20"
type="simple"
:limit="10"
/>
<UploadFile :modelValue="formData.entity.projectPreliminaryPlanAttachment"
@change="uploadChange" :fileSize="20" type="simple" :limit="10" />
</el-form-item>
</el-col>
</el-row>
@@ -352,31 +391,44 @@
</el-col>
</el-row>
<!--项目投资情况-->
<div class="form-section-title">{{ t('planApply.investmentStatus.title') }} 单位{{ t('planApply.investmentEstimate.unitSuffix') }}</div>
<div class="form-section-title">{{ t('planApply.investmentStatus.title') }} 单位{{
t('planApply.investmentEstimate.unitSuffix') }}</div>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.investmentStatus.totalInvestmentAmount')" required prop="entity.projectTotalAmount">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="formData.entity.projectTotalAmount" :placeholder="t('planApply.placeholder.input')"></el-input-number>
<el-form-item :label="t('planApply.investmentStatus.totalInvestmentAmount')" required
prop="entity.projectTotalAmount">
<el-input-number :precision="2" :length="20" :controls="false" min="0"
v-model="formData.entity.projectTotalAmount"
:placeholder="t('planApply.placeholder.input')"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.investmentStatus.cumulativeInvestmentLastYear')" required prop="entity.lastYearCompleted" label-width="230px">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="formData.entity.lastYearCompleted" :placeholder="t('planApply.placeholder.input')"/>
<el-form-item :label="t('planApply.investmentStatus.cumulativeInvestmentLastYear')" required
prop="entity.lastYearCompleted" label-width="230px">
<el-input-number :precision="2" :length="20" :controls="false" min="0"
v-model="formData.entity.lastYearCompleted"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.investmentStatus.ourTotalInvestmentAmount')" required prop="entity.ourInvestmentTotalAmount">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="formData.entity.ourInvestmentTotalAmount" :placeholder="t('planApply.placeholder.input')">
<el-form-item :label="t('planApply.investmentStatus.ourTotalInvestmentAmount')" required
prop="entity.ourInvestmentTotalAmount">
<el-input-number :precision="2" :length="20" :controls="false" min="0"
v-model="formData.entity.ourInvestmentTotalAmount"
:placeholder="t('planApply.placeholder.input')">
<template #append>{{ t('planApply.investmentEstimate.unitSuffix') }}</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.investmentStatus.ourCumulativeInvestmentLastYear')" required prop="entity.ourLastYearCompleted" label-width="230px">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="formData.entity.ourLastYearCompleted" :placeholder="t('planApply.placeholder.input')">
<el-form-item :label="t('planApply.investmentStatus.ourCumulativeInvestmentLastYear')" required
prop="entity.ourLastYearCompleted" label-width="230px">
<el-input-number :precision="2" :length="20" :controls="false" min="0"
v-model="formData.entity.ourLastYearCompleted"
:placeholder="t('planApply.placeholder.input')">
<template #append>{{ t('planApply.investmentEstimate.unitSuffix') }}</template>
</el-input-number>
</el-form-item>
@@ -409,56 +461,95 @@
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.planYear')" min-width="140">
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.planYear') }}</span>
</template>
<template #default="{ row }">
<el-date-picker
v-model="row.plannedInvestmentYear"
type="year"
value-format="YYYY"
:placeholder="t('planApply.placeholder.select')"
style="width: 100%"
/>
<el-date-picker v-model="row.plannedInvestmentYear" type="year" value-format="YYYY"
:placeholder="t('planApply.placeholder.select')" style="width: 100%"
:class="{ 'is-error': !row.plannedInvestmentYear }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.plannedImageQuota')+'(万元)'" min-width="160">
<el-table-column min-width="160">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.plannedImageQuota') +
'(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.plannedImageAmount" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.plannedImageAmount" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.plannedImageAmount === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.annualPlanPayment')+'(万元)'" min-width="160">
<el-table-column min-width="160">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.annualPlanPayment') +
'(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.plannedPaymentAmount" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.plannedPaymentAmount" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.plannedPaymentAmount === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.fundingSources')" align="center">
<el-table-column :label="t('planApply.annualInvestmentInfo.table.capitalFunding')+'(万元)'" min-width="140">
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.capitalFunding') +
'(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.selfFunding" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.selfFunding" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.selfFunding === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.externalRaisedFunds')+'(万元)'" min-width="150">
<el-table-column min-width="150">
<template #header>
<span class="required-field">{{
t('planApply.annualInvestmentInfo.table.externalRaisedFunds') + '(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.externalFunding" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.externalFunding" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.externalFunding === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.financialFunding')+'(万元)'" min-width="140">
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.financialFunding') +
'(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.fiscalFunding" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.fiscalFunding" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.fiscalFunding === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.otherFunding')+'(万元)'" min-width="140">
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.otherFunding') +
'(万元)' }}</span>
</template>
<template #default="{ row }">
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.otherFunding" :placeholder="t('planApply.placeholder.input')"/>
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
v-model="row.otherFunding" :placeholder="t('planApply.placeholder.input')"
:class="{ 'is-error': row.otherFunding === null }" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.financialFundingDescription')" min-width="200">
<el-table-column :label="t('planApply.annualInvestmentInfo.table.financialFundingDescription')"
min-width="200">
<template #default="{ row }">
<el-input v-model="row.fiscalFundingSource" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="row.fiscalFundingSource"
:placeholder="t('planApply.placeholder.input')" />
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.otherFundingDescription')" min-width="200">
<el-table-column :label="t('planApply.annualInvestmentInfo.table.otherFundingDescription')"
min-width="200">
<template #default="{ row }">
<el-input v-model="row.otherFundingSource" :placeholder="t('planApply.placeholder.input')" />
<el-input v-model="row.otherFundingSource"
:placeholder="t('planApply.placeholder.input')" />
</template>
</el-table-column>
</el-table-column>
@@ -468,15 +559,20 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.decisionType')">
<el-select v-model="formData.entity.decisionType" :placeholder="t('planApply.placeholder.select')" >
<el-option v-for="item in decisionTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="formData.entity.decisionType"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in decisionTypeOptions" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.isCompleteEstablishmentProcedures')" required prop="entity.isProjectApprovalCompleted">
<el-select v-model="formData.entity.isProjectApprovalCompleted" :placeholder="t('planApply.placeholder.select')" >
<el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item :label="t('planApply.decisionInfo.isCompleteEstablishmentProcedures')" required
prop="entity.isProjectApprovalCompleted">
<el-select v-model="formData.entity.isProjectApprovalCompleted"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in yesOrNo" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -484,36 +580,47 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.establishmentDocumentNumber')" :prop="formData.entity.isProjectApprovalCompleted === '0' ? 'entity.projectApprovalFileNo':''">
<el-input v-model="formData.entity.projectApprovalFileNo" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('planApply.decisionInfo.establishmentDocumentNumber')"
:prop="formData.entity.isProjectApprovalCompleted === '0' ? 'entity.projectApprovalFileNo' : ''">
<el-input v-model="formData.entity.projectApprovalFileNo"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.establishmentDocumentInfo')" :prop="formData.entity.isProjectApprovalCompleted === '0' ? 'entity.projectApprovalFileInfo':''">
<el-input v-model="formData.entity.projectApprovalFileInfo" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('planApply.decisionInfo.establishmentDocumentInfo')"
:prop="formData.entity.isProjectApprovalCompleted === '0' ? 'entity.projectApprovalFileInfo' : ''">
<el-input v-model="formData.entity.projectApprovalFileInfo"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.isCompleteDecisionProcedures')" required prop="entity.isDecisionProcedureCompleted">
<el-select v-model="formData.entity.isDecisionProcedureCompleted" :placeholder="t('planApply.placeholder.select')" >
<el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
<el-form-item :label="t('planApply.decisionInfo.isCompleteDecisionProcedures')" required
prop="entity.isDecisionProcedureCompleted">
<el-select v-model="formData.entity.isDecisionProcedureCompleted"
:placeholder="t('planApply.placeholder.select')">
<el-option v-for="item in yesOrNo" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('planApply.decisionInfo.decisionProgramDocumentNumber')" :prop="formData.entity.isDecisionProcedureCompleted === '0' ? 'entity.decisionProcedureFileNo':''">
<el-input v-model="formData.entity.decisionProcedureFileNo" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('planApply.decisionInfo.decisionProgramDocumentNumber')"
:prop="formData.entity.isDecisionProcedureCompleted === '0' ? 'entity.decisionProcedureFileNo' : ''">
<el-input v-model="formData.entity.decisionProcedureFileNo"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.decisionInfo.decisionDocumentInfo')" :prop="formData.entity.isDecisionProcedureCompleted === '0' ? 'entity.decisionFileInfo':''">
<el-input v-model="formData.entity.decisionFileInfo" :placeholder="t('planApply.placeholder.input')" />
<el-form-item :label="t('planApply.decisionInfo.decisionDocumentInfo')"
:prop="formData.entity.isDecisionProcedureCompleted === '0' ? 'entity.decisionFileInfo' : ''">
<el-input v-model="formData.entity.decisionFileInfo"
:placeholder="t('planApply.placeholder.input')" />
</el-form-item>
</el-col>
</el-row>
@@ -522,7 +629,7 @@
<el-row class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.reviewOpinions.submitUnitOpinion')">
<el-input v-model="formData.entity.submitUnitOpinion" readonly />
<el-input v-model="formData.entity.submitUnitOpinion" :readonly="mode === 'view'" />
</el-form-item>
</el-col>
</el-row>
@@ -530,7 +637,7 @@
<el-row class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.reviewOpinions.groupInvestmentDeptOpinion')">
<el-input v-model="formData.entity.groupInvestmentDeptOpinion" readonly />
<el-input v-model="formData.entity.groupInvestmentDeptOpinion" :readonly="mode === 'view'" />
</el-form-item>
</el-col>
</el-row>
@@ -538,7 +645,7 @@
<el-row class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.reviewOpinions.submitUnitLeadershipOpinion')">
<el-input v-model="formData.entity.submitUnitLeadershipOpinion" readonly />
<el-input v-model="formData.entity.submitUnitLeadershipOpinion" :readonly="mode === 'view'" />
</el-form-item>
</el-col>
</el-row>
@@ -546,7 +653,8 @@
<el-row class="form-row">
<el-col :span="24">
<el-form-item :label="t('planApply.reviewOpinions.submitUnitMainLeadershipOpinion')">
<el-input v-model="formData.entity.submitUnitMainLeadershipOpinion" readonly />
<el-input v-model="formData.entity.submitUnitMainLeadershipOpinion"
:readonly="mode === 'view'" />
</el-form-item>
</el-col>
</el-row>
@@ -557,7 +665,7 @@
</template>
<script lang="ts" setup>
import { ref, watch,nextTick } from 'vue';
import { ref, watch, nextTick, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import type { InvestmentProjects, ProjectPlanApplyFormData } from '../interface/types';
import ProjectNameList from '/@/components/ProjectNameList/index.vue';
@@ -574,6 +682,7 @@ import {
cityStrategyOptions, decisionTypeOptions, yesOrNo, projectDirectionOptions,
} from '/@/hooks/enums';
import type { FormInstance, FormRules } from 'element-plus';
import { ElMessage } from 'element-plus';
import { FolderOpened } from '@element-plus/icons-vue';
import LibrarySelect from '/@/views/invMid/projectLibrary/components/LibrarySelect.vue';
import { selectTreeCompanyTree } from '/@/api/admin/dept';
@@ -584,6 +693,7 @@ const props = withDefaults(
modelValue?: ProjectPlanApplyFormData;
rules?: FormRules;
isUpdate?: boolean;
mode?: 'edit' | 'view';
}>(),
{
modelValue: () => ({
@@ -672,6 +782,7 @@ const props = withDefaults(
}),
rules: () => ({}),
isUpdate: false,
mode: 'edit',
}
);
@@ -679,6 +790,8 @@ const emit = defineEmits<{
(e: 'update:modelValue', value: ProjectPlanApplyFormData): void;
}>();
const mode = computed(() => props.mode);
const defaultForm: ProjectPlanApplyFormData = {
entity: {
id: null,
@@ -771,12 +884,12 @@ const selectedAnnualInvestmentIndex = ref<number>(formData.value.investmentProje
const handleAddAnnualInvestment = () => {
const newItem: InvestmentProjects = {
plannedInvestmentYear: '',
plannedImageAmount: '',
plannedPaymentAmount: '',
selfFunding: '',
externalFunding: '',
fiscalFunding: '',
otherFunding: '',
plannedImageAmount: null,
plannedPaymentAmount: null,
selfFunding: null,
externalFunding: null,
fiscalFunding: null,
otherFunding: null,
fiscalFundingSource: '',
otherFundingSource: '',
};
@@ -785,7 +898,8 @@ const handleAddAnnualInvestment = () => {
};
const year = computed(() => formData.value.entity.planInvestmentYear)
// 修改计算逻辑,确保正确处理初始值
const safeParseFloat = (value: string | number): number => {
const safeParseFloat = (value: string | number | null): number => {
if (value === null) return 0;
const parsed = typeof value === 'string' ? parseFloat(value) : value;
return isNaN(parsed) ? 0 : parsed;
};
@@ -868,8 +982,70 @@ watch(
},
{ deep: true }
);
const validateForm = () => {
return useForm.value?.validate();
const validateForm = async () => {
// 先验证表单
const formValid = await useForm.value?.validate().catch(() => false);
// 帮助函数:检查值是否为空
const isEmptyValue = (value: any): boolean => {
if (value === null || value === undefined) return true;
if (typeof value === 'string' && value.trim() === '') return true;
if (typeof value === 'number' && isNaN(value)) return true;
return false;
};
// 验证年度项目投资信息表格
let tableValid = true;
const tableErrors: string[] = [];
if (formData.value.investmentProjects.length === 0) {
tableErrors.push('请至少添加一条年度项目投资信息');
tableValid = false;
} else {
formData.value.investmentProjects.forEach((item, index) => {
const rowNum = index + 1;
if (isEmptyValue(item.plannedInvestmentYear)) {
tableErrors.push(`${rowNum}行:计划投资年度必填`);
tableValid = false;
}
if (isEmptyValue(item.plannedImageAmount)) {
tableErrors.push(`${rowNum}行:计划形象额度必填`);
tableValid = false;
}
if (isEmptyValue(item.plannedPaymentAmount)) {
tableErrors.push(`${rowNum}行:计划支付额度必填`);
tableValid = false;
}
if (isEmptyValue(item.selfFunding)) {
tableErrors.push(`${rowNum}行:自有资金必填`);
tableValid = false;
}
if (isEmptyValue(item.externalFunding)) {
tableErrors.push(`${rowNum}行:对外募集资金必填`);
tableValid = false;
}
if (isEmptyValue(item.fiscalFunding)) {
tableErrors.push(`${rowNum}行:财政资金必填`);
tableValid = false;
}
if (isEmptyValue(item.otherFunding)) {
tableErrors.push(`${rowNum}行:其他资金必填`);
tableValid = false;
}
});
}
if (!tableValid) {
// 显示第一个表格错误
ElMessage.error(tableErrors[0]);
return Promise.reject(new Error(tableErrors[0]));
}
if (!formValid) {
return Promise.reject(new Error('表单验证失败'));
}
return Promise.resolve(true);
};
const projectNameFn = (row: any) => {
Object.assign(formData.value.entity, row);
@@ -1033,4 +1209,17 @@ formData.value.entity.deptId = value.id
.annual-investment-table :deep(.el-table__body-wrapper) {
overflow-x: auto;
}
/* 必填字段标记 - 在标题前添加红色星号 */
.required-field::before {
content: '*';
color: var(--el-color-danger);
margin-right: 4px;
}
/* 错误状态样式 - 输入框红色边框 */
.annual-investment-table :deep(.is-error .el-input__wrapper) {
border-color: var(--el-color-danger) !important;
box-shadow: 0 0 0 1px var(--el-color-danger) inset !important;
}
</style>

View File

@@ -1,7 +1,8 @@
<template>
<el-row class="page-title-row mb10">
<div class="page-title">{{ title ? title : t('progressReport.form.title') }}</div>
<div class="page-report-time">{{ t('progressReport.form.reportTime') }}: {{formData.createTime || reportTime }}</div>
<div class="page-report-time">{{ t('progressReport.form.reportTime') }}: {{ formData.createTime || reportTime }}
</div>
<div class="page-unit">{{ t('progressReport.form.unit') }}</div>
</el-row>
<div class="project-progress-report-form">
@@ -17,12 +18,15 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('progressReport.form.projectStatus')" required prop="projectStatus">
<span v-for="item in projectStatusOptions" :key="item.value">{{formData.projectStatus == item.value ? item.label : ''}}</span>
<span v-for="item in projectStatusOptions" :key="item.value">{{ formData.projectStatus ==
item.value ? item.label : '' }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('progressReport.form.constructionStage')">
<span v-for="item in constructionStageOptions" :key="item.value">{{formData.constructionStage == item.value ? item.label : ''}}</span>
<span v-for="item in constructionStageOptions" :key="item.value">{{ formData.constructionStage
==
item.value ? item.label : '' }}</span>
</el-form-item>
</el-col>
</el-row>
@@ -33,14 +37,16 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('progressReport.form.totalInvestmentAmount')" required prop="projectTotalAmount">
<el-form-item :label="t('progressReport.form.totalInvestmentAmount')" required
prop="projectTotalAmount">
<span>{{ formData.projectTotalAmount }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('progressReport.form.cumulativeInvestmentToMonthEnd')" required prop="cumulativeInvestmentToDate">
<el-form-item :label="t('progressReport.form.cumulativeInvestmentToMonthEnd')" required
prop="cumulativeInvestmentToDate">
<span>{{ formData.cumulativeInvestmentToDate }}</span>
</el-form-item>
</el-col>
@@ -72,12 +78,16 @@
<span>{{ formData.annualReport }}</span>
</el-form-item>
<el-form-item style="height: 82px;"
:label="t('progressReport.form.currentYearPlannedInvestment')" required prop="annualPlannedInvestment">
<span>{{formData.investmentTotalAmount ?? 0 + ' ' + t('progressReport.form.unitSuffix')}}</span>
:label="t('progressReport.form.currentYearPlannedInvestment')" required
prop="annualPlannedInvestment">
<span>{{ formData.investmentTotalAmount ?? 0 + ' ' +
t('progressReport.form.unitSuffix') }}</span>
</el-form-item>
<el-form-item style="height: 82px;"
:label="t('progressReport.form.enterpriseCumulativeInvestmentToMonthEnd')" required prop="ytdRemainingInvestment">
<span>{{ formData.ytdRemainingInvestment + ' ' + t('progressReport.form.unitSuffix')}}</span>
:label="t('progressReport.form.enterpriseCumulativeInvestmentToMonthEnd')" required
prop="ytdRemainingInvestment">
<span>{{ formData.ytdRemainingInvestment + ' ' +
t('progressReport.form.unitSuffix') }}</span>
</el-form-item>
<el-form-item style="height: 82px;"
:label="t('progressReport.form.investmentCompletionRate')">
@@ -133,8 +143,9 @@
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('progressReport.form.currentStageEvidenceMaterials')">
<uploadFile :modelValue="JSON.parse(formData.supportingDocuments || '[]') || []" @change="uploadChange" :fileSize="20" type="simple" :limit="10"
:isShowTip="false" disabled></uploadFile>
<uploadFile :modelValue="JSON.parse(formData.supportingDocuments || '[]') || []"
@change="uploadChange" :fileSize="20" type="simple" :limit="10" :isShowTip="false" disabled>
</uploadFile>
</el-form-item>
</el-col>
</el-row>
@@ -150,7 +161,8 @@
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('progressReport.form.isLastDeclaration')">
<span>{{formData.isFinalApplication == '1' ? t('progressReport.form.yes') : t('progressReport.form.no')}}</span>
<span>{{ formData.isFinalApplication == '1' ? t('progressReport.form.yes') :
t('progressReport.form.no') }}</span>
</el-form-item>
</el-col>
</el-row>
@@ -297,7 +309,7 @@ watch(
(newVal) => {
if (newVal) {
if (typeof newVal.annualReport === 'number') newVal.annualReport = newVal.annualReport.toString()
Object.assign(formData, defaultForm, newVal);
Object.assign(formData, newVal);
}
},
{ immediate: true, deep: true }

View File

@@ -1,12 +1,12 @@
export interface InvestmentProjects {
id?: number;
plannedInvestmentYear: string;
plannedImageAmount: string;
plannedPaymentAmount: string;
selfFunding: string;
externalFunding: string;
fiscalFunding: string;
otherFunding: string;
plannedImageAmount: string | number | null;
plannedPaymentAmount: string | number | null;
selfFunding: string | number | null;
externalFunding: string | number | null;
fiscalFunding: string | number | null;
otherFunding: string | number | null;
fiscalFundingSource: string;
otherFundingSource: string;
}

View File

@@ -15,7 +15,8 @@
</el-button>
</div>
<div class="opinion-input">
<el-input v-model="opinionText" type="textarea" :rows="4" :placeholder="t('workbench.approval.opinion.inputPlaceholder')" resize="vertical" />
<el-input v-model="opinionText" type="textarea" :rows="4"
:placeholder="t('workbench.approval.opinion.inputPlaceholder')" resize="vertical" />
</div>
<!-- <div class="opinion-attachment">
<el-icon class="attachment-icon">
@@ -30,7 +31,8 @@
<!-- 撤回区域可撤回状态显示 -->
<div v-if="status === 'withdrawable'" class="withdraw-section">
<div class="withdraw-input">
<el-input v-model="opinionText" type="textarea" :rows="4" :placeholder="t('workbench.approval.opinion.inputPlaceholder')" resize="vertical" />
<el-input v-model="opinionText" type="textarea" :rows="4"
:placeholder="t('workbench.approval.opinion.inputPlaceholder')" resize="vertical" />
</div>
<div class="withdraw-action">
<el-button type="primary" @click="handleWithdraw">
@@ -61,7 +63,8 @@
<!-- <div v-if="record.action" class="record-action">{{ record.action }}</div> -->
<template v-if="record.id !== 'root' && item.status === 2">
<div class="record-status" :class="getStatusClass(item.approveDesc?.startsWith('拒绝原因:') ? 'rejected' : 'approved')">
<div class="record-status"
:class="getStatusClass(item.approveDesc?.startsWith('拒绝原因:') ? 'rejected' : 'approved')">
{{ getStatusLabel(item.approveDesc?.startsWith('拒绝原因:') ? 'rejected' : 'approved') }}
</div>
<div class="record-opinion">
@@ -79,7 +82,8 @@
</div>
</div>
<template v-if="selectUser">
<EmployeesDialog :visible="selectUserDialog" :data="[]" type="user" @change="changeUser" @update:visible="(e:boolean) => selectUserDialog = e"/>
<EmployeesDialog :visible="selectUserDialog" :data="[]" type="user" @change="changeUser"
@update:visible="(e: boolean) => selectUserDialog = e" />
</template>
</div>
</template>
@@ -374,6 +378,7 @@ onMounted(() => {
display: flex;
/* gap: 8px; */
margin-bottom: 16px;
.el-button {
flex: 1;
}

View File

@@ -27,12 +27,15 @@
<!-- 标题描述上传附件 -->
<el-row class="mb10">
<el-form :model="headerForm" label-width="80px" class="w-full" :rules="headerRequiredRule" ref="headerFormRef">
<el-form :model="headerForm" label-width="80px" class="w-full" :rules="headerRequiredRule"
ref="headerFormRef">
<el-form-item :label="t('planApply.headerForm.title')" prop="title">
<el-input v-model="headerForm.title" :placeholder="t('planApply.headerForm.titlePlaceholder')"/>
<el-input v-model="headerForm.title"
:placeholder="t('planApply.headerForm.titlePlaceholder')" />
</el-form-item>
<el-form-item :label="t('planApply.headerForm.description')">
<el-input v-model="headerForm.description" :placeholder="t('planApply.headerForm.descriptionPlaceholder')"/>
<el-input v-model="headerForm.description"
:placeholder="t('planApply.headerForm.descriptionPlaceholder')" />
</el-form-item>
<el-form-item :label="t('planApply.headerForm.attachments')">
<UploadFile :modelValue="headerForm.attachments" :fileSize="20" type="simple" :limit="10"
@@ -41,7 +44,8 @@
</el-form>
</el-row>
<ProjectPlanApplyForm v-model="formData" :rules="formDataRules" ref="formDataRef" :is-update="props.isUpdate"/>
<ProjectPlanApplyForm v-model="formData" :rules="formDataRules" ref="formDataRef"
:is-update="props.isUpdate" />
</div>
</div>
</template>
@@ -203,40 +207,51 @@ const formDataRules = ref<FormRules<ProjectPlanApplyFormData>>({
'entity.financialFunds': requiredRule,
'entity.planImageQuota': requiredRule,
'entity.planPaymentLimit': requiredRule,
'entity.projectApprovalFileNo':[{validator:(rule: any, value: any, callback: any) =>{
'entity.projectApprovalFileNo': [{
validator: (rule: any, value: any, callback: any) => {
if (formData.value.entity.isProjectApprovalCompleted === '1' && !value) {
callback(new Error(`${t('该字段必填')}`));
} else {
callback();
}
},required:true,trigger: ['blur', 'change']}],
'entity.projectApprovalFileInfo':[{validator:(rule: any, value: any, callback: any) =>{
}, required: true, trigger: ['blur', 'change']
}],
'entity.projectApprovalFileInfo': [{
validator: (rule: any, value: any, callback: any) => {
if (formData.value.entity.isProjectApprovalCompleted === '1' && !value) {
callback(new Error(`${t('该字段必填')}`));
} else {
callback();
}
},required: true,trigger: ['blur', 'change']}],
'entity.decisionProcedureFileNo':[{validator:(rule: any, value: any, callback: any) =>{
}, required: true, trigger: ['blur', 'change']
}],
'entity.decisionProcedureFileNo': [{
validator: (rule: any, value: any, callback: any) => {
if (formData.value.entity.isDecisionProcedureCompleted === '1' && !value) {
callback(new Error(`${t('该字段必填')}`));
} else {
callback();
}
},required:true,trigger: ['blur', 'change']}],
'entity.decisionFileInfo':[{validator:(rule: any, value: any, callback: any) =>{
}, required: true, trigger: ['blur', 'change']
}],
'entity.decisionFileInfo': [{
validator: (rule: any, value: any, callback: any) => {
if (formData.value.entity.isDecisionProcedureCompleted === '1' && !value) {
callback(new Error(`${t('该字段必填')}`));
} else {
callback();
}
},required: true,trigger: ['blur', 'change']}],
}, required: true, trigger: ['blur', 'change']
}],
});
const handleInitiateApproval = async () => {
try {
const headerValid = await headerFormRef.value?.validate();
const valid = await formDataRef.value?.validateForm();
if (!valid && !headerValid) return;
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) return;
const valid = await formDataRef.value?.validateForm().catch(() => false);
if (!valid) return;
submitLoading.value = true;
let flowIdKey = ''
const data = await investmentProjectsPlanUserDeptBelong()
@@ -296,9 +311,13 @@ const handleInitiateApproval = async () => {
const saveLoading = ref<boolean>(false);
const handleSaveDraft = async () => {
const headerValid = await headerFormRef.value?.validate();
const valid = await formDataRef.value?.validateForm();
if (!valid && !headerValid) return;
try {
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) return;
const valid = await formDataRef.value?.validateForm().catch(() => false);
if (!valid) return;
saveLoading.value = true;
const flowName = props.isUpdate ? 'investmentPlanUpdates' : 'investmentPlanRegistration';
const flowNameObj = flowNameOptions.filter(item => item.label === flowName)[0]
@@ -326,6 +345,9 @@ const handleSaveDraft = async () => {
saveLoading.value = false;
message.error(err.msg);
});
} catch (error) {
console.log(error, 'error');
}
};
const handleLoadTemplate = () => {

View File

@@ -27,15 +27,19 @@
<!-- 标题描述上传附件 -->
<el-row class="mb10">
<el-form :model="headerForm" label-width="80px" class="w-full">
<el-form-item :label="t('progressReport.headerForm.title')">
<el-input v-model="headerForm.title" :placeholder="t('progressReport.headerForm.titlePlaceholder')" />
<el-form :model="headerForm" :rules="headerFormRules" ref="headerFormRef" label-width="80px"
class="w-full">
<el-form-item :label="t('progressReport.headerForm.title')" prop="title" required>
<el-input v-model="headerForm.title"
:placeholder="t('progressReport.headerForm.titlePlaceholder')" />
</el-form-item>
<el-form-item :label="t('progressReport.headerForm.description')">
<el-input v-model="headerForm.description" :placeholder="t('progressReport.headerForm.descriptionPlaceholder')" />
<el-input v-model="headerForm.description"
:placeholder="t('progressReport.headerForm.descriptionPlaceholder')" />
</el-form-item>
<el-form-item :label="t('progressReport.headerForm.attachments')">
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20" type="simple" :limit="10" />
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20"
type="simple" :limit="10" />
</el-form-item>
</el-form>
</el-row>
@@ -46,7 +50,7 @@
</template>
<script setup lang="ts">
import { reactive } from 'vue';
import { reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
import ProjectProgressReportForm from '/@/components/investment/common/ProjectProgressReportForm.vue';
@@ -64,6 +68,10 @@ import {flowNameOptions} from "/@/hooks/enums";
const { t } = useI18n();
const message = useMessage();
const headerFormRef = ref<any>();
const headerFormRules = {
title: [{ required: true, message: '标题必填', trigger: ['blur', 'change'] }]
};
const headerForm = reactive<{ title: string; description: string; attachments: any[] | string }>({
title: '',
description: '',
@@ -103,6 +111,7 @@ const formData = reactive<InvestmentProjectProgress>({
delFlag: '',
processInstanceId: '',
status: '',
deptId: '',
});
// 必填规则
const requiredRule = [{ required: true, message: `${t('该字段必填')}` }];
@@ -118,6 +127,10 @@ const formDataRef = ref<FormRules<InvestmentProjectProgress>>({
const handleInitiateApproval = async () => {
// message.info(t('progressReport.messages.initiateApproval'));
try {
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) {
return;
}
const valid = await formRef.value?.validate();
submitLoading.value = true;
let flowIdKey = '';
@@ -139,10 +152,14 @@ const handleInitiateApproval = async () => {
flowIdKey = 'VITE_FLOWID_31';
}
headerForm.attachments = JSON.stringify(headerForm.attachments);
const {processInstanceId} = await flowFn(flowIdKey,{
const flowResult = await flowFn(flowIdKey, {
paramMap: {
}
})
if (flowResult instanceof Error) {
throw flowResult;
}
const { processInstanceId } = flowResult;
const flowNameObj = flowNameOptions.filter(item => item.label === 'projectProgressDeclaration')[0]
await addFlowForm({
title: headerForm.title,

View File

@@ -37,7 +37,8 @@ onMounted(() =>{
<ProjectProgressReportFormDeatils v-model="detailFormData" title="投资项目进度审核" />
</el-col>
<el-col :span="6" v-if="!isPreview">
<ApprovalAction :status="status" :approval-records="[]" :task-id="taskId" :process-instance-id="projectId"/>
<ApprovalAction :status="status" :approval-records="[]" :task-id="taskId"
:process-instance-id="projectId" />
</el-col>
</el-row>
</el-card>

View File

@@ -26,8 +26,9 @@
</el-row>
<el-row class="mb10">
<el-form :model="headerForm" label-width="80px" class="w-full">
<el-form-item :label="t('projectExitFeedback.headerForm.title')">
<el-form :model="headerForm" :rules="headerFormRules" ref="headerFormRef" label-width="80px"
class="w-full">
<el-form-item :label="t('projectExitFeedback.headerForm.title')" prop="title" required>
<el-input v-model="headerForm.title"
:placeholder="t('projectExitFeedback.headerForm.titlePlaceholder')" />
</el-form-item>
@@ -36,7 +37,8 @@
:placeholder="t('projectExitFeedback.headerForm.descriptionPlaceholder')" />
</el-form-item>
<el-form-item :label="t('projectExitFeedback.headerForm.attachments')">
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20" type="simple" :limit="10" />
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20"
type="simple" :limit="10" />
</el-form-item>
</el-form>
</el-row>
@@ -47,12 +49,13 @@
</template>
<script setup lang="ts">
import { reactive } from 'vue';
import { reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
import ProjectExitFeedbackForm from '/@/components/investment/common/ProjectExitFeedbackForm.vue';
import { ProjectExitFeedback } from '/@/views/invMid/projectExitFeedback/interface/type';
import { addProjectExitPlanFeedback } from "/@/api/investment/projectExitPlan";
import { ProjectTask } from "/@/views/invMid/projectExitPlan/interface/type";
import UploadFile from "/@/components/Upload/index.vue";
import { flowFn } from "/@/utils/flowFn";
import { addFlowForm } from "/@/api/flow/flow";
@@ -60,6 +63,10 @@ import {flowNameOptions} from "/@/hooks/enums";
const { t } = useI18n();
const message = useMessage();
const headerFormRef = ref<any>();
const headerFormRules = {
title: [{ required: true, message: '标题必填', trigger: ['blur', 'change'] }]
};
const headerForm = reactive<{ title: string, description: string, attachments: any[] | string }>({
title: '',
description: '',
@@ -70,16 +77,21 @@ const formData = ref<ProjectExitFeedback>({
exitExecutor: '',
exitRemark: '',
exitAttachment: '',
deptId: '',
});
const submitLoading = ref(false);
const handleInitiateApproval = async () => {
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) {
return;
}
if (!formData.value.projectId) {
message.error('项目名称必填');
return
}
submitLoading.value = true;
const attachments = JSON.stringify(headerForm.attachments);
const {processInstanceId} = await flowFn('VITE_FLOWID_36',{
const flowResult = await flowFn('VITE_FLOWID_36', {
paramMap: {
// miu0ilc1tfa61_assignee_select: [
// {
@@ -91,6 +103,11 @@ const handleInitiateApproval = async () => {
// ]
}
})
if (flowResult instanceof Error) {
submitLoading.value = false;
throw flowResult;
}
const { processInstanceId } = flowResult;
const flowNameObj = flowNameOptions.filter(item => item.label === 'exitFeedback')[0]
await addFlowForm({
title: headerForm.title,
@@ -101,7 +118,7 @@ const handleInitiateApproval = async () => {
})
formData.value.processInstanceId = processInstanceId;
const exitAttachment = JSON.stringify(formData.value.exitAttachment);
const params = { ...formData.value, exitAttachment }
const params = { ...formData.value, exitAttachment } as ProjectTask;
addProjectExitPlanFeedback(params).then(() => {
message.success(t('common.success'));
}).catch((err: any) => {

View File

@@ -38,6 +38,8 @@ export interface ProjectExitFeedback {
projectId?: number;
/** 项目名称*/
projectName?: string;
/** 部门id */
deptId: string;
}
export interface paramsDataProjectExitPlanFeedback {

View File

@@ -26,8 +26,9 @@
</el-row>
<el-row class="mb10">
<el-form :model="headerForm" label-width="80px" class="w-full">
<el-form-item :label="t('projectExitPlan.headerForm.title')">
<el-form :model="headerForm" :rules="headerFormRules" ref="headerFormRef" label-width="80px"
class="w-full">
<el-form-item :label="t('projectExitPlan.headerForm.title')" prop="title" required>
<el-input v-model="headerForm.title"
:placeholder="t('projectExitPlan.headerForm.titlePlaceholder')" />
</el-form-item>
@@ -36,7 +37,8 @@
:placeholder="t('projectExitPlan.headerForm.descriptionPlaceholder')" />
</el-form-item>
<el-form-item :label="t('projectExitPlan.headerForm.attachments')">
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20" type="simple" :limit="10" />
<UploadFile :modelValue="headerForm.attachments" @change="uploadChange" :fileSize="20"
type="simple" :limit="10" />
</el-form-item>
</el-form>
</el-row>
@@ -47,7 +49,7 @@
</template>
<script setup lang="ts">
import { reactive } from 'vue';
import { reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
@@ -63,6 +65,10 @@ const formDataRef = ref<HTMLFormElement | null>()
const { t } = useI18n();
const message = useMessage();
const headerFormRef = ref<any>();
const headerFormRules = {
title: [{ required: true, message: '标题必填', trigger: ['blur', 'change'] }]
};
const headerForm = reactive<{ title: string, description: string, attachments: any[] | string }>({
title: '',
description: '',
@@ -78,6 +84,7 @@ const formData = ref<ProjectTask>({
executor: '',
taskStartDate: new Date().toISOString().substring(0, 10),
taskEndDate: new Date().toISOString().substring(0, 10),
deptId: ''
});
const requiredRule = [{ required: true, message: `${t('该字段必填')}` }]
const rules = reactive<FormRules<ProjectTask>>({
@@ -87,12 +94,16 @@ const rules = reactive<FormRules<ProjectTask>>({
const submitLoading = ref<boolean>(false);
const handleInitiateApproval = async () => {
try {
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) {
return;
}
const valid = await formDataRef?.value?.validateRef();
if (!valid) return;
submitLoading.value = true;
const folowIdKey = 'VITE_FLOWID_35'
const attachments = JSON.stringify(headerForm.attachments);
const {processInstanceId} = await flowFn(folowIdKey,{
const flowResult = await flowFn(folowIdKey, {
paramMap: {
// miu0ilc1tfa61_assignee_select: [
// {
@@ -104,6 +115,11 @@ const handleInitiateApproval = async () => {
// ]
}
})
if (flowResult instanceof Error) {
submitLoading.value = false;
throw flowResult;
}
const { processInstanceId } = flowResult;
const flowNameObj = flowNameOptions.filter(item => item.label === 'exitPlan')[0]
await addFlowForm({
title: headerForm.title,