1
This commit is contained in:
@@ -172,7 +172,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { reactive, watch } from 'vue';
|
import { reactive, watch, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { FolderOpened, OfficeBuilding } from '@element-plus/icons-vue';
|
import { FolderOpened, OfficeBuilding } from '@element-plus/icons-vue';
|
||||||
import { investmentProjectsPlanGetById, investmentProjectsPlanPage } from '/@/api/investment/investmentManagement';
|
import { investmentProjectsPlanGetById, investmentProjectsPlanPage } from '/@/api/investment/investmentManagement';
|
||||||
@@ -205,6 +205,7 @@ const defaultForm: ProjectTask = {
|
|||||||
executor: '',
|
executor: '',
|
||||||
taskStartDate: new Date().toISOString().substring(0, 10),
|
taskStartDate: new Date().toISOString().substring(0, 10),
|
||||||
taskEndDate: new Date().toISOString().substring(0, 10),
|
taskEndDate: new Date().toISOString().substring(0, 10),
|
||||||
|
deptId: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
const formData = reactive<ProjectTask>({ ...defaultForm, ...props.modelValue });
|
const formData = reactive<ProjectTask>({ ...defaultForm, ...props.modelValue });
|
||||||
|
|||||||
@@ -452,8 +452,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<el-table :data="formData.investmentProjects" border style="width: 100%" class="annual-investment-table">
|
<el-table :data="formData.investmentProjects" border style="width: 100%" class="annual-investment-table">
|
||||||
<el-table-column width="60" align="center">
|
<el-table-column width="60" align="center">
|
||||||
<template>
|
<template #default="{ $index }">
|
||||||
<el-radio v-model="selectedAnnualInvestmentIndex" />
|
<el-radio v-model="selectedAnnualInvestmentIndex" :value="$index" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="t('planApply.annualInvestmentInfo.table.index')" width="60" align="center">
|
<el-table-column :label="t('planApply.annualInvestmentInfo.table.index')" width="60" align="center">
|
||||||
@@ -488,9 +488,9 @@
|
|||||||
'(万元)' }}</span>
|
'(万元)' }}</span>
|
||||||
</template>
|
</template>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-input-number :precision="2" :controls="false" :min="0" :value-on-clear="null"
|
<el-input-number :precision="2" :controls="false" readonly
|
||||||
v-model="row.plannedPaymentAmount" :placeholder="t('planApply.placeholder.input')"
|
:model-value="calculateRowPaymentLimit(row)"
|
||||||
:class="{ 'is-error': row.plannedPaymentAmount === null }" />
|
:placeholder="t('planApply.placeholder.input')" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column :label="t('planApply.annualInvestmentInfo.table.fundingSources')" align="center">
|
<el-table-column :label="t('planApply.annualInvestmentInfo.table.fundingSources')" align="center">
|
||||||
@@ -659,7 +659,8 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
<ProjectNameList :visible="visible" @emit:cancel="visible = false" @emit:confirm="projectNameFn" />
|
<ProjectNameList :visible="visible" :isSelect="false" :selectedId="''" @emit:cancel="visible = false"
|
||||||
|
@emit:confirm="projectNameFn" />
|
||||||
<LibrarySelect v-model="librarySelectVisible" @select="handleLibrarySelect" />
|
<LibrarySelect v-model="librarySelectVisible" @select="handleLibrarySelect" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -903,6 +904,18 @@ const safeParseFloat = (value: string | number | null): number => {
|
|||||||
const parsed = typeof value === 'string' ? parseFloat(value) : value;
|
const parsed = typeof value === 'string' ? parseFloat(value) : value;
|
||||||
return isNaN(parsed) ? 0 : parsed;
|
return isNaN(parsed) ? 0 : parsed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 计算表格每行的计划支付额度 = 自有资金 + 对外募集资金 + 财政资金 + 其他资金
|
||||||
|
const calculateRowPaymentLimit = (row: InvestmentProjects): number => {
|
||||||
|
const selfFunding = safeParseFloat(row.selfFunding);
|
||||||
|
const externalFunding = safeParseFloat(row.externalFunding);
|
||||||
|
const fiscalFunding = safeParseFloat(row.fiscalFunding);
|
||||||
|
const otherFunding = safeParseFloat(row.otherFunding);
|
||||||
|
const total = selfFunding + externalFunding + fiscalFunding + otherFunding;
|
||||||
|
// 同步更新 row.plannedPaymentAmount 以便后续计算汇总
|
||||||
|
row.plannedPaymentAmount = total;
|
||||||
|
return total;
|
||||||
|
};
|
||||||
// 监听投资计划数据变化
|
// 监听投资计划数据变化
|
||||||
watch(() => formData.value.investmentProjects, (newValue) => {
|
watch(() => formData.value.investmentProjects, (newValue) => {
|
||||||
if (!year.value) return;
|
if (!year.value) return;
|
||||||
@@ -1048,7 +1061,46 @@ const validateForm = async () => {
|
|||||||
return Promise.resolve(true);
|
return Promise.resolve(true);
|
||||||
};
|
};
|
||||||
const projectNameFn = (row: any) => {
|
const projectNameFn = (row: any) => {
|
||||||
Object.assign(formData.value.entity, row);
|
// 映射 API 返回的字段名到表单字段名
|
||||||
|
const mappedData = {
|
||||||
|
...row,
|
||||||
|
// 资金相关字段映射
|
||||||
|
ownedFunds: row.enterpriseOwnFunds ?? row.ownedFunds ?? '',
|
||||||
|
financialFunds: row.governmentInvestmentFunds ?? row.financialFunds ?? '',
|
||||||
|
externalRaisedCapital: row.externalRaisedFunds ?? row.externalRaisedCapital ?? '',
|
||||||
|
otherFunds: row.otherFunds ?? '',
|
||||||
|
// 计划投资年度信息映射
|
||||||
|
planInvestmentYear: row.planInvestmentYear ?? '',
|
||||||
|
planImageQuota: row.planImageQuota ?? '',
|
||||||
|
planPaymentLimit: row.planPaymentLimit ?? '',
|
||||||
|
governmentFundSourceDesc: row.governmentFundSourceDesc ?? '',
|
||||||
|
otherFundSourceDesc: row.otherFundSourceDesc ?? '',
|
||||||
|
// 主业相关字段映射
|
||||||
|
isMainBusiness: row.isMainBusiness ?? '',
|
||||||
|
mainBusinessTypes: row.mainBusinessTypes ?? '',
|
||||||
|
mainBusinessCode: row.mainBusinessCode ?? '',
|
||||||
|
// 项目信息字段映射
|
||||||
|
projectInvestmentDirection: row.projectInvestmentDirection ?? '',
|
||||||
|
investmentDirectionSegmentation: row.investmentDirectionSegmentation ?? '',
|
||||||
|
isStrategicEmergingIndustries: row.isStrategicEmergingIndustries ?? '',
|
||||||
|
urbanStrategy: row.urbanStrategy ?? '',
|
||||||
|
isManufacturingIndustry: row.isManufacturingIndustry ?? '',
|
||||||
|
majorInvestmentProjects: row.majorInvestmentProjects ?? '',
|
||||||
|
// 决策信息字段映射
|
||||||
|
decisionType: row.decisionType ?? '',
|
||||||
|
isProjectApprovalCompleted: row.isProjectApprovalCompleted ?? '',
|
||||||
|
projectApprovalFileNo: row.projectApprovalFileNo ?? '',
|
||||||
|
projectApprovalFileInfo: row.projectApprovalFileInfo ?? '',
|
||||||
|
isDecisionProcedureCompleted: row.isDecisionProcedureCompleted ?? '',
|
||||||
|
decisionProcedureFileNo: row.decisionProcedureFileNo ?? '',
|
||||||
|
decisionFileInfo: row.decisionFileInfo ?? '',
|
||||||
|
// 其他字段映射
|
||||||
|
projectDesc: row.projectDesc ?? '',
|
||||||
|
progressDesc: row.progressDesc ?? '',
|
||||||
|
shareholdingRatio: row.shareholdingRatio ?? '',
|
||||||
|
isControllingStake: row.isControllingStake ?? '',
|
||||||
|
};
|
||||||
|
Object.assign(formData.value.entity, mappedData);
|
||||||
visible.value = false;
|
visible.value = false;
|
||||||
};
|
};
|
||||||
const handleLibrarySelect = (row: any) => {
|
const handleLibrarySelect = (row: any) => {
|
||||||
|
|||||||
@@ -15,7 +15,8 @@
|
|||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="t('planApply.applySection.projectName')" required prop="entity.projectName">
|
<el-form-item :label="t('planApply.applySection.projectName')" required prop="entity.projectName">
|
||||||
<template #label>
|
<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>
|
</template>
|
||||||
<span>{{ formData.entity.projectName }}</span>
|
<span>{{ formData.entity.projectName }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -25,20 +26,23 @@
|
|||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.groupName')" required prop="entity.groupCompany">
|
<el-form-item :label="t('planApply.applySection.groupName')" required prop="entity.groupCompany">
|
||||||
<template #label>
|
<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>
|
</template>
|
||||||
<span>{{ formData.entity.groupCompany }}</span>
|
<span>{{ formData.entity.groupCompany }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.projectNature')">
|
<el-form-item :label="t('planApply.applySection.projectNature')">
|
||||||
<span>{{projectNatureOptions.find((item:Enums) => item.value === formData.entity.projectNature)?.label}}</span>
|
<span>{{projectNatureOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.projectNature)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.projectMainUnit')" required prop="entity.projectMainEntity">
|
<el-form-item :label="t('planApply.applySection.projectMainUnit')" required
|
||||||
|
prop="entity.projectMainEntity">
|
||||||
<span>{{ formData.entity.projectMainEntity }}</span>
|
<span>{{ formData.entity.projectMainEntity }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -51,37 +55,47 @@
|
|||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{investmentCategoryOptions.find((item:Enums) => item.value === formData.entity.investmentCategory)?.label}}</span>
|
<span>{{investmentCategoryOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.investmentCategory)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{investmentAreaOptions.find((item:Enums) => item.value ===formData.entity.investmentArea)?.label}}</span>
|
<span>{{investmentAreaOptions.find((item: Enums) => item.value
|
||||||
|
=== formData.entity.investmentArea)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{ formData.entity.projectAddress }}</span>
|
<span>{{ formData.entity.projectAddress }}</span>
|
||||||
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{ formData.entity.projectAddressDetail }}</span>
|
<span>{{ formData.entity.projectAddressDetail }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -90,99 +104,127 @@
|
|||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('reserveRegistration.basicInfo.projectDirection')" required prop="entity.projectInvestmentDirection">
|
<el-form-item :label="t('reserveRegistration.basicInfo.projectDirection')" required
|
||||||
|
prop="entity.projectInvestmentDirection">
|
||||||
<span>{{ formData.entity.projectInvestmentDirection }}</span>
|
<span>{{ formData.entity.projectInvestmentDirection }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{projectDirectionDetailsOptions.find((item:Enums) => item.value ===formData.entity.investmentDirectionSegmentation)?.label}}</span>
|
<span>{{projectDirectionDetailsOptions.find((item: Enums) => item.value
|
||||||
|
=== formData.entity.investmentDirectionSegmentation)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{projectSourceOptions.find((item:Enums) => item.value === formData.entity.projectSource)?.label}}</span>
|
<span>{{projectSourceOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.projectSource)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<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>
|
<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>
|
</template>
|
||||||
<span>{{constructionNatureOptions.find((item:Enums) => item.value === formData.entity.constructionNature)?.label}}</span>
|
<span>{{constructionNatureOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.constructionNature)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('reserveRegistration.basicInfo.majorInvestmentProject')" required prop="entity.majorInvestmentProjects">
|
<el-form-item :label="t('reserveRegistration.basicInfo.majorInvestmentProject')" required
|
||||||
|
prop="entity.majorInvestmentProjects">
|
||||||
<span>{{ formData.entity.majorInvestmentProjects }}</span>
|
<span>{{ formData.entity.majorInvestmentProjects }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.keyProject')" required prop="entity.keyProject">
|
<el-form-item :label="t('planApply.applySection.keyProject')" required prop="entity.keyProject">
|
||||||
<span>{{projectImportantOptions.find((item:Enums) => item.value === formData.entity.keyProject)?.label}}</span>
|
<span>{{projectImportantOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.keyProject)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.isWithinMainBusiness')" required prop="entity.isMainBusiness">
|
<el-form-item :label="t('planApply.applySection.isWithinMainBusiness')" required
|
||||||
<span>{{formData.entity.isMainBusiness == t('planApply.common.yes') ? t('planApply.common.yes') : t('planApply.common.no')}}</span>
|
prop="entity.isMainBusiness">
|
||||||
|
<span>{{ formData.entity.isMainBusiness == t('planApply.common.yes') ? t('planApply.common.yes')
|
||||||
|
:
|
||||||
|
t('planApply.common.no')}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.mainBusinessType')" :required="formData.entity.isMainBusiness === t('planApply.common.yes')" prop="entity.mainBusinessTypes">
|
<el-form-item :label="t('planApply.applySection.mainBusinessType')"
|
||||||
<span>{{mainBusinessOptions.find((item:Enums) => item.value === formData.entity.mainBusinessTypes)?.label}}</span>
|
:required="formData.entity.isMainBusiness === t('planApply.common.yes')"
|
||||||
|
prop="entity.mainBusinessTypes">
|
||||||
|
<span>{{mainBusinessOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.mainBusinessTypes)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('reserveRegistration.basicInfo.mainBusinessCode')" required prop="entity.mainBusinessCode">
|
<el-form-item :label="t('reserveRegistration.basicInfo.mainBusinessCode')" required
|
||||||
|
prop="entity.mainBusinessCode">
|
||||||
<span>{{ formData.entity.mainBusinessTypes }}</span>
|
<span>{{ formData.entity.mainBusinessTypes }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.isManufacturing')" required prop="entity.isManufacturingIndustry">
|
<el-form-item :label="t('planApply.applySection.isManufacturing')" required
|
||||||
<span>{{formData.entity.isManufacturingIndustry == t('planApply.common.yes') ? t('planApply.common.yes') : t('planApply.common.no')}}</span>
|
prop="entity.isManufacturingIndustry">
|
||||||
|
<span>{{ formData.entity.isManufacturingIndustry == t('planApply.common.yes') ?
|
||||||
|
t('planApply.common.yes') :
|
||||||
|
t('planApply.common.no')}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')" required prop="entity.isStrategicEmergingIndustries">
|
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')" required
|
||||||
<span>{{strategicIndustryOptions.find((item:Enums) => item.value === formData.entity.isStrategicEmergingIndustries)?.label}}</span>
|
prop="entity.isStrategicEmergingIndustries">
|
||||||
|
<span>{{strategicIndustryOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.isStrategicEmergingIndustries)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.cityStrategy')" required prop="entity.urbanStrategy">
|
<el-form-item :label="t('planApply.applySection.cityStrategy')" required
|
||||||
<span>{{cityStrategyOptions.find((item:Enums) => item.value === formData.entity.urbanStrategy)?.label}}</span>
|
prop="entity.urbanStrategy">
|
||||||
|
<span>{{cityStrategyOptions.find((item: Enums) => item.value ===
|
||||||
|
formData.entity.urbanStrategy)?.label}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.projectImplementationStart')" required prop="entity.projectStartTime">
|
<el-form-item :label="t('planApply.applySection.projectImplementationStart')" required
|
||||||
|
prop="entity.projectStartTime">
|
||||||
<span>{{ formData.entity.projectStartTime }}</span>
|
<span>{{ formData.entity.projectStartTime }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.applySection.projectImplementationEnd')" required prop="entity.projectEndTime">
|
<el-form-item :label="t('planApply.applySection.projectImplementationEnd')" required
|
||||||
|
prop="entity.projectEndTime">
|
||||||
<span>{{ formData.entity.projectEndTime }}</span>
|
<span>{{ formData.entity.projectEndTime }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -198,11 +240,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="height: 82px;" :label="t('planApply.planInvestment.plannedImageQuota')"
|
<el-form-item style="height: 82px;" :label="t('planApply.planInvestment.plannedImageQuota')"
|
||||||
required prop="entity.planImageQuota">
|
required prop="entity.planImageQuota">
|
||||||
<span>{{formData.entity.planImageQuota}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.planImageQuota }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="height: 82px;" :label="t('planApply.planInvestment.annualPlanPayment')"
|
<el-form-item style="height: 82px;" :label="t('planApply.planInvestment.annualPlanPayment')"
|
||||||
required prop="entity.planPaymentLimit">
|
required prop="entity.planPaymentLimit">
|
||||||
<span>{{formData.entity.planPaymentLimit}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.planPaymentLimit }}{{
|
||||||
|
t('planApply.investmentEstimate.unitSuffix') }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -211,18 +255,27 @@
|
|||||||
<div class="plan-investment-panel right-panel">
|
<div class="plan-investment-panel right-panel">
|
||||||
<div class="panel-title">{{ t('planApply.planInvestment.currentYearFundingTitle') }}</div>
|
<div class="panel-title">{{ t('planApply.planInvestment.currentYearFundingTitle') }}</div>
|
||||||
<div style="flex: 1;">
|
<div style="flex: 1;">
|
||||||
<el-form-item :label="t('planApply.investmentEstimate.capitalFunding')" required prop="entity.ownedFunds">
|
<el-form-item :label="t('planApply.investmentEstimate.capitalFunding')" required
|
||||||
<span>{{formData.entity.ownedFunds}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
prop="entity.ownedFunds">
|
||||||
|
<span>{{ formData.entity.ownedFunds }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('planApply.investmentEstimate.financialFunding')" required prop="entity.financialFunds">
|
<el-form-item :label="t('planApply.investmentEstimate.financialFunding')" required
|
||||||
<span>{{formData.entity.financialFunds}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
prop="entity.financialFunds">
|
||||||
|
<span>{{ formData.entity.financialFunds }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('planApply.investmentEstimate.externalRaisedFunds')" required prop="entity.externalRaisedCapital">
|
<el-form-item :label="t('planApply.investmentEstimate.externalRaisedFunds')" required
|
||||||
|
prop="entity.externalRaisedCapital">
|
||||||
|
|
||||||
<span>{{formData.entity.externalRaisedCapital}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.externalRaisedCapital }}{{
|
||||||
|
t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('planApply.investmentEstimate.otherFunding')" required prop="entity.otherFunds">
|
<el-form-item :label="t('planApply.investmentEstimate.otherFunding')" required
|
||||||
<span>{{formData.entity.otherFunds}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
prop="entity.otherFunds">
|
||||||
|
<span>{{ formData.entity.otherFunds }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('planApply.investmentEstimate.financialFundingDescription')">
|
<el-form-item :label="t('planApply.investmentEstimate.financialFundingDescription')">
|
||||||
<span>{{ formData.entity.governmentFundSourceDesc }}</span>
|
<span>{{ formData.entity.governmentFundSourceDesc }}</span>
|
||||||
@@ -237,7 +290,8 @@
|
|||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="t('planApply.applySection.projectOverview')" required prop="entity.projectDesc">
|
<el-form-item :label="t('planApply.applySection.projectOverview')" required
|
||||||
|
prop="entity.projectDesc">
|
||||||
<span>{{ formData.entity.projectDesc }}</span>
|
<span>{{ formData.entity.projectDesc }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -249,7 +303,8 @@
|
|||||||
<span>{{ formData.entity.projectPreliminaryPlan }}</span>
|
<span>{{ formData.entity.projectPreliminaryPlan }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('planApply.headerForm.attachments')">
|
<el-form-item :label="t('planApply.headerForm.attachments')">
|
||||||
<UploadFile :modelValue="formData.entity.projectPreliminaryPlanAttachment" :fileSize="20" type="simple" :limit="10"/>
|
<UploadFile :modelValue="formData.entity.projectPreliminaryPlanAttachment" :fileSize="20"
|
||||||
|
type="simple" :limit="10" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -266,28 +321,35 @@
|
|||||||
<div class="form-section-title">{{ t('planApply.investmentStatus.title') }}</div>
|
<div class="form-section-title">{{ t('planApply.investmentStatus.title') }}</div>
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.investmentStatus.totalInvestmentAmount')" required prop="entity.projectTotalAmount">
|
<el-form-item :label="t('planApply.investmentStatus.totalInvestmentAmount')" required
|
||||||
|
prop="entity.projectTotalAmount">
|
||||||
<span>{{ formData.entity.projectTotalAmount }}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.projectTotalAmount }}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.investmentStatus.cumulativeInvestmentLastYear')" required prop="entity.lastYearCompleted">
|
<el-form-item :label="t('planApply.investmentStatus.cumulativeInvestmentLastYear')" required
|
||||||
<span>{{formData.entity.lastYearCompleted}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
prop="entity.lastYearCompleted">
|
||||||
|
<span>{{ formData.entity.lastYearCompleted }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.investmentStatus.ourTotalInvestmentAmount')" required prop="entity.ourInvestmentTotalAmount">
|
<el-form-item :label="t('planApply.investmentStatus.ourTotalInvestmentAmount')" required
|
||||||
|
prop="entity.ourInvestmentTotalAmount">
|
||||||
|
|
||||||
<span>{{formData.entity.ourInvestmentTotalAmount}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.ourInvestmentTotalAmount }}{{
|
||||||
|
t('planApply.investmentEstimate.unitSuffix') }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.investmentStatus.ourCumulativeInvestmentLastYear')" required prop="entity.ourLastYearCompleted">
|
<el-form-item :label="t('planApply.investmentStatus.ourCumulativeInvestmentLastYear')" required
|
||||||
|
prop="entity.ourLastYearCompleted">
|
||||||
|
|
||||||
<span>{{formData.entity.ourLastYearCompleted}}{{ t('planApply.investmentEstimate.unitSuffix') }}</span>
|
<span>{{ formData.entity.ourLastYearCompleted }}{{ t('planApply.investmentEstimate.unitSuffix')
|
||||||
|
}}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -378,7 +440,8 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.decisionInfo.isCompleteEstablishmentProcedures')" required prop="entity.isProjectApprovalCompleted">
|
<el-form-item :label="t('planApply.decisionInfo.isCompleteEstablishmentProcedures')" required
|
||||||
|
prop="entity.isProjectApprovalCompleted">
|
||||||
|
|
||||||
<span>{{ formData.entity.isProjectApprovalCompleted }}</span>
|
<span>{{ formData.entity.isProjectApprovalCompleted }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -400,7 +463,8 @@
|
|||||||
|
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('planApply.decisionInfo.isCompleteDecisionProcedures')" required prop="entity.isDecisionProcedureCompleted">
|
<el-form-item :label="t('planApply.decisionInfo.isCompleteDecisionProcedures')" required
|
||||||
|
prop="entity.isDecisionProcedureCompleted">
|
||||||
<span>{{ formData.entity.isDecisionProcedureCompleted }}</span>
|
<span>{{ formData.entity.isDecisionProcedureCompleted }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -426,7 +490,8 @@
|
|||||||
import { ref, watch } from 'vue';
|
import { ref, watch } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import type { InvestmentProjects, ProjectPlanApplyFormData } from "../interface/types";
|
import type { InvestmentProjects, ProjectPlanApplyFormData } from "../interface/types";
|
||||||
import {projectNatureOptions,
|
import {
|
||||||
|
projectNatureOptions,
|
||||||
investmentAreaOptions,
|
investmentAreaOptions,
|
||||||
investmentCategoryOptions,
|
investmentCategoryOptions,
|
||||||
projectDirectionDetailsOptions,
|
projectDirectionDetailsOptions,
|
||||||
@@ -444,9 +509,9 @@ const useForm = ref<FormInstance | undefined>();
|
|||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
modelValue?: ProjectPlanApplyFormData;
|
modelValue?: ProjectPlanApplyFormData;
|
||||||
rules?: FormRules;
|
rules?: FormRules;
|
||||||
isEdit: boolean;
|
isEdit?: boolean;
|
||||||
title:string;
|
title?: string;
|
||||||
processInstanceId: string;
|
processInstanceId?: string;
|
||||||
}>(), {
|
}>(), {
|
||||||
isEdit: true,
|
isEdit: true,
|
||||||
title: '',
|
title: '',
|
||||||
@@ -523,6 +588,9 @@ const defaultForm: ProjectPlanApplyFormData = {
|
|||||||
submitUnitLeadershipOpinion: '',
|
submitUnitLeadershipOpinion: '',
|
||||||
submitUnitMainLeadershipOpinion: '',
|
submitUnitMainLeadershipOpinion: '',
|
||||||
planImageQuota: '',
|
planImageQuota: '',
|
||||||
|
processInstanceId: '',
|
||||||
|
status: 0,
|
||||||
|
deptId: 0
|
||||||
},
|
},
|
||||||
investmentProjects: [
|
investmentProjects: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-row class="page-title-row mb10">
|
<el-row class="page-title-row mb10">
|
||||||
<div class="page-title">{{ t('progressReport.form.title') }}</div>
|
<div class="page-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>
|
<div class="page-unit">{{ t('progressReport.form.unit') }}</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
<div class="project-progress-report-form">
|
<div class="project-progress-report-form">
|
||||||
@@ -11,26 +12,14 @@
|
|||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="t('progressReport.form.projectName')" required prop="projectName">
|
<el-form-item :label="t('progressReport.form.projectName')" required prop="projectName">
|
||||||
<el-select v-model="formData.projectId"
|
<el-select v-model="formData.projectId"
|
||||||
:placeholder="t('progressReport.form.selectPlaceholder')"
|
:placeholder="t('progressReport.form.selectPlaceholder')" @change="handelSelectChange">
|
||||||
@change="handelSelectChange"
|
<el-option v-for="item in projectNameData" :key="item.id" :label="item.projectName || ''"
|
||||||
>
|
:value="item.id" />
|
||||||
<el-option
|
|
||||||
v-for="item in projectNameData"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.projectName || ''"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-pagination
|
<el-pagination background layout="sizes, prev, pager, next, jumper, total"
|
||||||
background
|
:total="total" :page-sizes="[10, 20, 50, 100]" v-model:page-size="queryForm.size"
|
||||||
layout="sizes, prev, pager, next, jumper, total"
|
v-model:current-page="queryForm.page" @size-change="handlePageSizeChange"
|
||||||
:total="total"
|
@current-change="handlePageChange" />
|
||||||
:page-sizes="[10, 20, 50, 100]"
|
|
||||||
v-model:page-size="queryForm.size"
|
|
||||||
v-model:current-page="queryForm.page"
|
|
||||||
@size-change="handlePageSizeChange"
|
|
||||||
@current-change="handlePageChange"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -40,13 +29,9 @@
|
|||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item :label="t('progressReport.form.projectStatus')" required prop="projectStatus">
|
<el-form-item :label="t('progressReport.form.projectStatus')" required prop="projectStatus">
|
||||||
<el-select v-model="formData.projectStatus"
|
<el-select v-model="formData.projectStatus"
|
||||||
:placeholder="t('progressReport.form.inputPlaceholder')"
|
:placeholder="t('progressReport.form.inputPlaceholder')" clearable>
|
||||||
clearable>
|
<el-option v-for="item in projectStatusOptions" :key="item.value" :value="item.value"
|
||||||
<el-option
|
:label="item.label" />
|
||||||
v-for="item in projectStatusOptions" :key="item.value"
|
|
||||||
:value="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -54,10 +39,8 @@
|
|||||||
<el-form-item :label="t('progressReport.form.constructionStage')">
|
<el-form-item :label="t('progressReport.form.constructionStage')">
|
||||||
<el-select v-model="formData.constructionStage"
|
<el-select v-model="formData.constructionStage"
|
||||||
:placeholder="t('progressReport.form.selectPlaceholder')" clearable>
|
:placeholder="t('progressReport.form.selectPlaceholder')" clearable>
|
||||||
<el-option v-for="item in constructionStageOptions" :key="item.value"
|
<el-option v-for="item in constructionStageOptions" :key="item.value" :value="item.value"
|
||||||
:value="item.value"
|
:label="item.label" />
|
||||||
:label="item.label"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -70,7 +53,8 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<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">
|
||||||
<el-input v-model="formData.projectTotalAmount"
|
<el-input v-model="formData.projectTotalAmount"
|
||||||
:placeholder="t('progressReport.form.inputPlaceholder')">
|
:placeholder="t('progressReport.form.inputPlaceholder')">
|
||||||
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
||||||
@@ -80,7 +64,8 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="12">
|
<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">
|
||||||
<el-input v-model="formData.cumulativeInvestmentToDate"
|
<el-input v-model="formData.cumulativeInvestmentToDate"
|
||||||
:placeholder="t('progressReport.form.inputPlaceholder')">
|
:placeholder="t('progressReport.form.inputPlaceholder')">
|
||||||
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
||||||
@@ -125,14 +110,16 @@
|
|||||||
:placeholder="t('progressReport.form.selectYearPlaceholder')" style="width: 100%" />
|
:placeholder="t('progressReport.form.selectYearPlaceholder')" style="width: 100%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="height: 82px;"
|
<el-form-item style="height: 82px;"
|
||||||
:label="t('progressReport.form.currentYearPlannedInvestment')" required prop="annualPlannedInvestment">
|
:label="t('progressReport.form.currentYearPlannedInvestment')" required
|
||||||
|
prop="annualPlannedInvestment">
|
||||||
<el-input v-model="formData.annualPlannedInvestment"
|
<el-input v-model="formData.annualPlannedInvestment"
|
||||||
:placeholder="t('progressReport.form.inputPlaceholder')">
|
:placeholder="t('progressReport.form.inputPlaceholder')">
|
||||||
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="height: 82px;"
|
<el-form-item style="height: 82px;"
|
||||||
:label="t('progressReport.form.enterpriseCumulativeInvestmentToMonthEnd')" required prop="ytdRemainingInvestment">
|
:label="t('progressReport.form.enterpriseCumulativeInvestmentToMonthEnd')" required
|
||||||
|
prop="ytdRemainingInvestment">
|
||||||
<el-input v-model="formData.ytdRemainingInvestment"
|
<el-input v-model="formData.ytdRemainingInvestment"
|
||||||
:placeholder="t('progressReport.form.inputPlaceholder')">
|
:placeholder="t('progressReport.form.inputPlaceholder')">
|
||||||
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
<template #append>{{ t('progressReport.form.unitSuffix') }}</template>
|
||||||
@@ -210,8 +197,8 @@
|
|||||||
<el-input v-model="formData.supportingDocuments"
|
<el-input v-model="formData.supportingDocuments"
|
||||||
:placeholder="t('progressReport.form.selectAttachmentPlaceholder')" readonly>
|
:placeholder="t('progressReport.form.selectAttachmentPlaceholder')" readonly>
|
||||||
<template #append>
|
<template #append>
|
||||||
<UploadFile :modelValue="formData.supportingDocuments" @change="uploadChange" :fileSize="20"
|
<UploadFile :modelValue="formData.supportingDocuments" @change="uploadChange"
|
||||||
type="simple" :limit="10" :isShowTip="false" />
|
:fileSize="20" type="simple" :limit="10" :isShowTip="false" />
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -323,6 +310,7 @@ const defaultForm = reactive<InvestmentProjectProgress>({
|
|||||||
delFlag: '',
|
delFlag: '',
|
||||||
processInstanceId: '',
|
processInstanceId: '',
|
||||||
status: '',
|
status: '',
|
||||||
|
deptId: ''
|
||||||
})
|
})
|
||||||
const formData = reactive<InvestmentProjectProgress>({ ...defaultForm, ...props.modelValue });
|
const formData = reactive<InvestmentProjectProgress>({ ...defaultForm, ...props.modelValue });
|
||||||
const projectNameData = ref<ProjectPlanApplyFormItem[]>([]);
|
const projectNameData = ref<ProjectPlanApplyFormItem[]>([]);
|
||||||
@@ -363,7 +351,7 @@ const handelSelectChange = (value: string | number) => {
|
|||||||
if (selectedProject) {
|
if (selectedProject) {
|
||||||
formData.implementingBody = selectedProject.projectMainEntity || selectedProject.projectOwnerUnit || '';
|
formData.implementingBody = selectedProject.projectMainEntity || selectedProject.projectOwnerUnit || '';
|
||||||
formData.projectName = selectedProject.projectName || '';
|
formData.projectName = selectedProject.projectName || '';
|
||||||
formData.deptId = selectedProject.deptId;
|
formData.deptId = String(selectedProject.deptId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -143,7 +143,7 @@
|
|||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="t('progressReport.form.currentStageEvidenceMaterials')">
|
<el-form-item :label="t('progressReport.form.currentStageEvidenceMaterials')">
|
||||||
<uploadFile :modelValue="JSON.parse(formData.supportingDocuments || '[]') || []"
|
<uploadFile :modelValue="parseSupportingDocuments(formData.supportingDocuments)"
|
||||||
@change="uploadChange" :fileSize="20" type="simple" :limit="10" :isShowTip="false" disabled>
|
@change="uploadChange" :fileSize="20" type="simple" :limit="10" :isShowTip="false" disabled>
|
||||||
</uploadFile>
|
</uploadFile>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
<el-row :gutter="20" class="form-row">
|
<el-row :gutter="20" class="form-row">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item :label="t('progressReport.form.isLastDeclaration')">
|
<el-form-item :label="t('progressReport.form.isLastDeclaration')">
|
||||||
<span>{{ formData.isFinalApplication == '1' ? t('progressReport.form.yes') :
|
<span>{{ formData.isFinalApplication === 1 ? t('progressReport.form.yes') :
|
||||||
t('progressReport.form.no') }}</span>
|
t('progressReport.form.no') }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -252,6 +252,7 @@ const defaultForm = reactive<InvestmentProjectProgress>({
|
|||||||
delFlag: '',
|
delFlag: '',
|
||||||
processInstanceId: '',
|
processInstanceId: '',
|
||||||
status: '',
|
status: '',
|
||||||
|
deptId: '',
|
||||||
})
|
})
|
||||||
const formData = reactive<InvestmentProjectProgress>({ ...defaultForm, ...props.modelValue });
|
const formData = reactive<InvestmentProjectProgress>({ ...defaultForm, ...props.modelValue });
|
||||||
const projectNameData = ref<ProjectPlanApplyFormItem[]>([]);
|
const projectNameData = ref<ProjectPlanApplyFormItem[]>([]);
|
||||||
@@ -279,20 +280,33 @@ const getProjectNameList = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
getProjectNameList();
|
getProjectNameList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解析 supportingDocuments,处理可能是字符串或数组的情况
|
||||||
|
*/
|
||||||
|
const parseSupportingDocuments = (value: string | { name: string; url: string }[] | undefined): { name: string; url: string }[] => {
|
||||||
|
if (!value) return [];
|
||||||
|
if (Array.isArray(value)) return value;
|
||||||
|
try {
|
||||||
|
return JSON.parse(value) || [];
|
||||||
|
} catch {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 初始化图片
|
* 初始化图片
|
||||||
* */
|
* */
|
||||||
const uploadChange = (_: any, data: any[]) => {
|
const uploadChange = (_: any, data: any[]) => {
|
||||||
if (!data || Object.prototype.toString.call(data) !== '[object Array]' || data.length === 0) {
|
if (!data || Object.prototype.toString.call(data) !== '[object Array]' || data.length === 0) {
|
||||||
formData.supportingDocuments = [];
|
formData.supportingDocuments = '[]';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
formData.supportingDocuments = data.map((item: any) => {
|
formData.supportingDocuments = JSON.stringify(data.map((item: any) => {
|
||||||
return {
|
return {
|
||||||
name: item.name,
|
name: item.name,
|
||||||
url: item.url
|
url: item.url
|
||||||
}
|
}
|
||||||
})
|
}));
|
||||||
}
|
}
|
||||||
// 监听 formData 变化,同步到父组件
|
// 监听 formData 变化,同步到父组件
|
||||||
watch(
|
watch(
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
<el-row :gutter="20" class="instruction-grid">
|
<el-row :gutter="20" class="instruction-grid">
|
||||||
<el-col v-for="field in instructionFields" :key="field.key" :span="field.span || 8">
|
<el-col v-for="field in instructionFields" :key="field.key" :span="field.span || 8">
|
||||||
<el-form-item :label="field.label" label-width="80px">
|
<el-form-item :label="field.label" label-width="80px">
|
||||||
<el-input maxlength="255" v-model="instructionForm[field.key]" :placeholder="t('mixedRegister.placeholder.input')" />
|
<el-input maxlength="255" v-model="instructionForm[field.key]"
|
||||||
|
:placeholder="t('mixedRegister.placeholder.input')" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -24,26 +25,14 @@
|
|||||||
<el-col v-for="field in basicInfoFields" :key="field.key" :span="field.span || 12" class="mb-4">
|
<el-col v-for="field in basicInfoFields" :key="field.key" :span="field.span || 12" class="mb-4">
|
||||||
<el-form-item :label="field.label">
|
<el-form-item :label="field.label">
|
||||||
<!-- 日期时间选择器 -->
|
<!-- 日期时间选择器 -->
|
||||||
<el-date-picker
|
<el-date-picker v-if="field.type && ['date', 'datetime', 'year'].includes(field.type)"
|
||||||
v-if="field.type && ['date', 'datetime'].includes(field.type)"
|
v-model="basicInfoForm[field.key]" :type="field.type"
|
||||||
v-model="basicInfoForm[field.key]"
|
:placeholder="t('mixedRegister.placeholder.select')" v-bind="field.fieldProps" />
|
||||||
:type="field.type"
|
|
||||||
:placeholder="t('mixedRegister.placeholder.select')"
|
|
||||||
v-bind="field.fieldProps"
|
|
||||||
/>
|
|
||||||
<!-- 选择器 -->
|
<!-- 选择器 -->
|
||||||
<el-select
|
<el-select v-else-if="field.type === 'select'" v-model="basicInfoForm[field.key]"
|
||||||
v-else-if="field.type === 'select'"
|
:placeholder="t('mixedRegister.placeholder.select')" v-bind="field.fieldProps">
|
||||||
v-model="basicInfoForm[field.key]"
|
<el-option v-for="item of field.fieldProps?.options" :key="item.value"
|
||||||
:placeholder="t('mixedRegister.placeholder.select')"
|
:label="item.label" :value="item.value" />
|
||||||
v-bind="field.fieldProps"
|
|
||||||
>
|
|
||||||
<el-option
|
|
||||||
v-for="item of field.fieldProps?.options"
|
|
||||||
:key="item.value"
|
|
||||||
:label="item.label"
|
|
||||||
:value="item.value"
|
|
||||||
/>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
<div class="partner-name-cell w-full" v-else-if="isUpdate && field.key === 'projectName'">
|
<div class="partner-name-cell w-full" v-else-if="isUpdate && field.key === 'projectName'">
|
||||||
<el-input v-model="basicInfoForm.projectName" maxlength="255"
|
<el-input v-model="basicInfoForm.projectName" maxlength="255"
|
||||||
@@ -53,9 +42,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- 输入框 -->
|
<!-- 输入框 -->
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<el-input-number v-if="field.type === 'number'" :length="field.length" v-model="basicInfoForm[field.key]"
|
<el-input-number v-if="field.type === 'number'" :length="field.length"
|
||||||
:controls="false" :min="0"/>
|
v-model="basicInfoForm[field.key]" :controls="false" :min="0" />
|
||||||
<el-input v-else maxlength="255" v-model="basicInfoForm[field.key]" :placeholder="t('mixedRegister.placeholder.input')" />
|
<el-input v-else maxlength="255" v-model="basicInfoForm[field.key]"
|
||||||
|
:placeholder="t('mixedRegister.placeholder.input')" />
|
||||||
</template>
|
</template>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|||||||
@@ -31,6 +31,20 @@ export default {
|
|||||||
confirmB: 'Confirm',
|
confirmB: 'Confirm',
|
||||||
cancelB: 'Cancel',
|
cancelB: 'Cancel',
|
||||||
selectText: 'Select',
|
selectText: 'Select',
|
||||||
|
// Added missing translations
|
||||||
|
operateFail: 'Operation failed',
|
||||||
|
operateSuccess: 'Operation successful',
|
||||||
|
success: 'Success',
|
||||||
|
noDataText: 'No data',
|
||||||
|
exportOkText: 'Export task submitted',
|
||||||
|
backBtn: 'Back',
|
||||||
|
saveBtn: 'Save',
|
||||||
|
closeBtn: 'Close',
|
||||||
|
submitBtn: 'Submit',
|
||||||
|
deleteMessage: {
|
||||||
|
confirm: 'Are you sure you want to delete the selected data?',
|
||||||
|
success: 'Delete successful',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
box: {
|
box: {
|
||||||
|
|||||||
@@ -29,7 +29,21 @@ export default {
|
|||||||
isRequired: '必填项',
|
isRequired: '必填项',
|
||||||
confirmB: '确认',
|
confirmB: '确认',
|
||||||
cancelB: '取消',
|
cancelB: '取消',
|
||||||
selectText: '选择'
|
selectText: '选择',
|
||||||
|
// 新增缺失的翻译
|
||||||
|
operateFail: '操作失败',
|
||||||
|
operateSuccess: '操作成功',
|
||||||
|
success: '成功',
|
||||||
|
noDataText: '暂无数据',
|
||||||
|
exportOkText: '导出任务已提交',
|
||||||
|
backBtn: '返回',
|
||||||
|
saveBtn: '保存',
|
||||||
|
closeBtn: '关闭',
|
||||||
|
submitBtn: '提交',
|
||||||
|
deleteMessage: {
|
||||||
|
confirm: '确定删除选中数据吗?',
|
||||||
|
success: '删除成功',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
box: {
|
box: {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ const handleUserSelection = (process: any, params: any,flowId:string): Promise<{
|
|||||||
* @param params 流程参数
|
* @param params 流程参数
|
||||||
* @returns 流程实例ID或错误
|
* @returns 流程实例ID或错误
|
||||||
*/
|
*/
|
||||||
export const flowFn = async (flowIdKey: string, params: { paramMap?: Record<string, any>, startUserId?: string, processInstanceId?: string }): Promise<{ processInstanceId: string } | Error> => {
|
export const flowFn = async (flowIdKey: string, params: { paramMap?: Record<string, any>, startUserId?: string, processInstanceId?: string }): Promise<{ processInstanceId: string }> => {
|
||||||
const flowStore = useGlobalFlowStore();
|
const flowStore = useGlobalFlowStore();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -7,17 +7,12 @@
|
|||||||
|
|
||||||
<!-- Steps Navigation -->
|
<!-- Steps Navigation -->
|
||||||
<div class="flex-2 text-center max-w-[600px]">
|
<div class="flex-2 text-center max-w-[600px]">
|
||||||
<span
|
<span v-for="(step, index) in steps" :key="index" class="inline-block px-5 py-2.5 cursor-pointer"
|
||||||
v-for="(step, index) in steps"
|
|
||||||
:key="index"
|
|
||||||
class="inline-block px-5 py-2.5 cursor-pointer"
|
|
||||||
:class="{ 'border-b-2 border-primary text-primary': activeStep === index }"
|
:class="{ 'border-b-2 border-primary text-primary': activeStep === index }"
|
||||||
@click="activeStep = index"
|
@click="activeStep = index">
|
||||||
>
|
|
||||||
<span
|
<span
|
||||||
class="mr-1.5 inline-block w-6 h-6 text-base font-normal text-center leading-[22px] border rounded-full"
|
class="mr-1.5 inline-block w-6 h-6 text-base font-normal text-center leading-[22px] border rounded-full"
|
||||||
:class="[activeStep === index ? 'bg-primary text-white' : 'border-current']"
|
:class="[activeStep === index ? 'bg-primary text-white' : 'border-current']">
|
||||||
>
|
|
||||||
{{ index + 1 }}
|
{{ index + 1 }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-lg font-medium">{{ $t(step.title) }}</span>
|
<span class="text-lg font-medium">{{ $t(step.title) }}</span>
|
||||||
@@ -47,18 +42,18 @@
|
|||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<!-- Success Result -->
|
<!-- Success Result -->
|
||||||
<el-result v-if="validateFlowStep === 3" icon="success" :title="$t('flow.checkSuccess')" :sub-title="$t('flow.checkSubSuccess')">
|
<el-result v-if="validateFlowStep === 3" icon="success" :title="$t('flow.checkSuccess')"
|
||||||
|
:sub-title="$t('flow.checkSubSuccess')">
|
||||||
<template #extra>
|
<template #extra>
|
||||||
<el-button type="primary" :loading="isSubmitting" @click="submitFlow">{{ $t('flow.submit') }}</el-button>
|
<el-button type="primary" :loading="isSubmitting" @click="submitFlow">{{ $t('flow.submit')
|
||||||
|
}}</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-result>
|
</el-result>
|
||||||
|
|
||||||
<!-- Loading Result -->
|
<!-- Loading Result -->
|
||||||
<el-result
|
<el-result
|
||||||
v-if="validateErrMsg.length === 0 && validateDialogShow && validatingShow && validateFlowStep < 3"
|
v-if="validateErrMsg.length === 0 && validateDialogShow && validatingShow && validateFlowStep < 3"
|
||||||
:title="$t('flow.checkIng')"
|
:title="$t('flow.checkIng')" :sub-title="$t('flow.checkSubIng')">
|
||||||
:sub-title="$t('flow.checkSubIng')"
|
|
||||||
>
|
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<span class="inline-block w-25 h-25" v-loading="true"></span>
|
<span class="inline-block w-25 h-25" v-loading="true"></span>
|
||||||
</template>
|
</template>
|
||||||
@@ -68,7 +63,9 @@
|
|||||||
<el-result v-if="validateErrMsg.length > 0" icon="error" title="检查失败">
|
<el-result v-if="validateErrMsg.length > 0" icon="error" title="检查失败">
|
||||||
<template #sub-title>
|
<template #sub-title>
|
||||||
<div v-for="item in validateErrMsg" :key="item" class="text-red-500">
|
<div v-for="item in validateErrMsg" :key="item" class="text-red-500">
|
||||||
<el-icon><WarnTriangleFilled /></el-icon>
|
<el-icon>
|
||||||
|
<WarnTriangleFilled />
|
||||||
|
</el-icon>
|
||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -97,7 +94,7 @@ const step1Ref = ref();
|
|||||||
const step2Ref = ref();
|
const step2Ref = ref();
|
||||||
const step3Ref = ref();
|
const step3Ref = ref();
|
||||||
|
|
||||||
const validateErrMsg = ref([]);
|
const validateErrMsg = ref<string[]>([]);
|
||||||
|
|
||||||
const activeStep = ref(0);
|
const activeStep = ref(0);
|
||||||
const validateFlowStep = ref(0);
|
const validateFlowStep = ref(0);
|
||||||
@@ -109,7 +106,7 @@ const gotoEdit = () => {
|
|||||||
activeStep.value = validateFlowStep.value;
|
activeStep.value = validateFlowStep.value;
|
||||||
validateDialogShow.value = false;
|
validateDialogShow.value = false;
|
||||||
};
|
};
|
||||||
const publish = (t) => {
|
const publish = (_t?: Event) => {
|
||||||
validateErrMsg.value = [];
|
validateErrMsg.value = [];
|
||||||
|
|
||||||
validateFlowStep.value = 0;
|
validateFlowStep.value = 0;
|
||||||
@@ -176,7 +173,7 @@ let step3NodeConfig = reactive({});
|
|||||||
var paramGroupId = ref();
|
var paramGroupId = ref();
|
||||||
|
|
||||||
const checkStep1 = () => {
|
const checkStep1 = () => {
|
||||||
step1Ref.value.validate(function (valid, arr) {
|
step1Ref.value.validate(function (valid: boolean, arr: string[]) {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
validateFlowStep.value = 1;
|
validateFlowStep.value = 1;
|
||||||
|
|
||||||
@@ -191,7 +188,7 @@ const checkStep1 = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
const checkStep2 = () => {
|
const checkStep2 = () => {
|
||||||
step2Ref.value.validate(function (valid, arr) {
|
step2Ref.value.validate(function (valid: boolean, arr: string[]) {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
validateFlowStep.value = 2;
|
validateFlowStep.value = 2;
|
||||||
@@ -207,7 +204,7 @@ const checkStep2 = () => {
|
|||||||
|
|
||||||
const checkStep3 = () => {
|
const checkStep3 = () => {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
step3Ref.value.validate(function (valid, arr) {
|
step3Ref.value.validate(function (valid: boolean, arr: string[]) {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
validateFlowStep.value = 3;
|
validateFlowStep.value = 3;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-drawer
|
<el-drawer v-model="visible" :append-to-body="true" title="审批人设置" :show-close="false" :size="550"
|
||||||
v-model="visible"
|
:before-close="saveApprover" @open="openEvent">
|
||||||
:append-to-body="true"
|
|
||||||
title="审批人设置"
|
|
||||||
:show-close="false"
|
|
||||||
:size="550"
|
|
||||||
:before-close="saveApprover"
|
|
||||||
@open="openEvent"
|
|
||||||
>
|
|
||||||
<el-tabs type="border-card">
|
<el-tabs type="border-card">
|
||||||
<el-tab-pane label="设置审批人">
|
<el-tab-pane label="设置审批人">
|
||||||
<el-radio-group v-model="approverConfig.assignedType" class="ml-4" @change="assignedTypeChangeEvent">
|
<el-radio-group v-model="approverConfig.assignedType" class="ml-4" @change="assignedTypeChangeEvent">
|
||||||
@@ -26,23 +19,28 @@
|
|||||||
<template v-if="approverConfig.assignedType === 3">
|
<template v-if="approverConfig.assignedType === 3">
|
||||||
<h4>选择角色</h4>
|
<h4>选择角色</h4>
|
||||||
|
|
||||||
<select-show v-model:orgList="approverConfig.nodeUserList" type="role" :multiple="true"></select-show>
|
<select-show v-model:orgList="approverConfig.nodeUserList" type="role"
|
||||||
|
:multiple="true"></select-show>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="approverConfig.assignedType === 1">
|
<template v-if="approverConfig.assignedType === 1">
|
||||||
<h4>选择成员</h4>
|
<h4>选择成员</h4>
|
||||||
|
|
||||||
<select-show v-model:orgList="approverConfig.nodeUserList" type="user" :multiple="true"></select-show>
|
<select-show v-model:orgList="approverConfig.nodeUserList" type="user"
|
||||||
|
:multiple="true"></select-show>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="approverConfig.assignedType === 8">
|
<template v-if="approverConfig.assignedType === 8">
|
||||||
<h4>人员控件</h4>
|
<h4>人员控件</h4>
|
||||||
<el-select v-model="approverConfig.formUserId" clearable class="m-2" placeholder="请选择审批表单" size="large">
|
<el-select v-model="approverConfig.formUserId" clearable class="m-2" placeholder="请选择审批表单"
|
||||||
<el-option v-for="item in step2FormUserList" :key="item.field" :label="item.title" :value="item.field" />
|
size="large">
|
||||||
|
<el-option v-for="item in step2FormUserList" :key="item.field" :label="item.title"
|
||||||
|
:value="item.field" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="approverConfig.assignedType === 7">
|
<template v-if="approverConfig.assignedType === 7">
|
||||||
<h4>审批终点</h4>
|
<h4>审批终点</h4>
|
||||||
<span style="margin-right: 5px; font-size: 14px">到第</span>
|
<span style="margin-right: 5px; font-size: 14px">到第</span>
|
||||||
<el-input-number v-model="approverConfig.deptLeaderLevel" :step="1" :min="1" :max="20" step-strictly size="small" />
|
<el-input-number v-model="approverConfig.deptLeaderLevel" :step="1" :min="1" :max="20" step-strictly
|
||||||
|
size="small" />
|
||||||
<span style="margin-left: 5px; font-size: 14px">级部门主管终止</span>
|
<span style="margin-left: 5px; font-size: 14px">级部门主管终止</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="approverConfig.assignedType === 4">
|
<template v-if="approverConfig.assignedType === 4">
|
||||||
@@ -52,17 +50,15 @@
|
|||||||
<el-radio :label="true" size="large">多选</el-radio>
|
<el-radio :label="true" size="large">多选</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</template>
|
</template>
|
||||||
<template
|
<template v-if="
|
||||||
v-if="
|
|
||||||
((approverConfig.multiple === true && approverConfig.assignedType === 4) ||
|
((approverConfig.multiple === true && approverConfig.assignedType === 4) ||
|
||||||
(approverConfig.assignedType === 1 && approverConfig.nodeUserList.length > 1) ||
|
(approverConfig.assignedType === 1 && approverConfig.nodeUserList.length > 1) ||
|
||||||
approverConfig.assignedType === 2 ||
|
approverConfig.assignedType === 2 ||
|
||||||
approverConfig.assignedType === 3 ||
|
approverConfig.assignedType === 3 ||
|
||||||
(approverConfig.assignedType === 7 && approverConfig.deptLeaderLevel > 1) ||
|
(approverConfig.assignedType === 7 && (approverConfig.deptLeaderLevel ?? 0) > 1) ||
|
||||||
(approverConfig.assignedType === 8 && isMultiUserForm(approverConfig.formUserId))) &&
|
(approverConfig.assignedType === 8 && isMultiUserForm(approverConfig.formUserId))) &&
|
||||||
approverConfig.assignedType !== 5
|
![5, 6].includes(approverConfig.assignedType ?? 0)
|
||||||
"
|
">
|
||||||
>
|
|
||||||
<h4>多人审批时采用的审批方式</h4>
|
<h4>多人审批时采用的审批方式</h4>
|
||||||
<el-radio-group v-model="approverConfig.multipleMode" class="ml-4">
|
<el-radio-group v-model="approverConfig.multipleMode" class="ml-4">
|
||||||
<p style="display: block; width: 100%">
|
<p style="display: block; width: 100%">
|
||||||
@@ -79,19 +75,16 @@
|
|||||||
<el-divider />
|
<el-divider />
|
||||||
|
|
||||||
<h4>审批人为空时</h4>
|
<h4>审批人为空时</h4>
|
||||||
<el-radio-group v-model="approverConfig.nobody.handler" class="ml-4">
|
<el-radio-group v-model="approverConfig.nobody!.handler" class="ml-4">
|
||||||
<el-radio label="TO_PASS" size="large">自动通过</el-radio>
|
<el-radio label="TO_PASS" size="large">自动通过</el-radio>
|
||||||
<el-radio label="TO_REFUSE" size="large">自动拒绝</el-radio>
|
<el-radio label="TO_REFUSE" size="large">自动拒绝</el-radio>
|
||||||
<el-radio label="TO_END" size="large">自动结束</el-radio>
|
<el-radio label="TO_END" size="large">自动结束</el-radio>
|
||||||
<el-radio label="TO_ADMIN" size="large">转交给管理员</el-radio>
|
<el-radio label="TO_ADMIN" size="large">转交给管理员</el-radio>
|
||||||
<el-radio label="TO_USER" size="large">指定人员</el-radio>
|
<el-radio label="TO_USER" size="large">指定人员</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<select-show
|
<select-show v-if="approverConfig.nobody?.handler === 'TO_USER'"
|
||||||
v-if="approverConfig?.nobody.handler === 'TO_USER'"
|
v-model:orgList="approverConfig.nobody!.assignedUser" type="user"
|
||||||
v-model:orgList="approverConfig.nobody.assignedUser"
|
:multiple="approverConfig.assignedType === 4 ? (approverConfig.multiple ?? false) : false"></select-show>
|
||||||
type="user"
|
|
||||||
:multiple="false"
|
|
||||||
></select-show>
|
|
||||||
|
|
||||||
<el-divider />
|
<el-divider />
|
||||||
|
|
||||||
@@ -101,12 +94,8 @@
|
|||||||
<el-radio label="TO_END" size="large">直接结束流程</el-radio>
|
<el-radio label="TO_END" size="large">直接结束流程</el-radio>
|
||||||
<el-radio label="TO_NODE" size="large" v-if="rejectNodeList.length > 0">驳回到指定节点</el-radio>
|
<el-radio label="TO_NODE" size="large" v-if="rejectNodeList.length > 0">驳回到指定节点</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<el-select
|
<el-select v-if="approverConfig.refuse.handler === 'TO_NODE' && rejectNodeList.length > 0"
|
||||||
v-if="approverConfig.refuse.handler === 'TO_NODE' && rejectNodeList.length > 0"
|
v-model="approverConfig.refuse.nodeId" placeholder="驳回节点" class="mb-2 w-1/2">
|
||||||
v-model="approverConfig.refuse.nodeId"
|
|
||||||
placeholder="驳回节点"
|
|
||||||
class="mb-2 w-1/2"
|
|
||||||
>
|
|
||||||
<el-option v-for="item in rejectNodeList" :key="item.id" :label="item.name" :value="item.id" />
|
<el-option v-for="item in rejectNodeList" :key="item.id" :label="item.name" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
@@ -121,7 +110,9 @@
|
|||||||
</el-drawer>
|
</el-drawer>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
// @ts-ignore
|
||||||
import { setTypes } from '../../utils/const';
|
import { setTypes } from '../../utils/const';
|
||||||
|
// @ts-ignore
|
||||||
import { useStore } from '../../stores/index';
|
import { useStore } from '../../stores/index';
|
||||||
import { useFlowStore } from '../../stores/flow';
|
import { useFlowStore } from '../../stores/flow';
|
||||||
import FormPerm from './components/formPerm.vue';
|
import FormPerm from './components/formPerm.vue';
|
||||||
@@ -130,6 +121,37 @@ import selectShow from '/@/components/OrgSelector/index.vue';
|
|||||||
import { validateNull } from '/@/utils/validate';
|
import { validateNull } from '/@/utils/validate';
|
||||||
import other from '/@/utils/other';
|
import other from '/@/utils/other';
|
||||||
import { processFormItemsWithPerms } from '/@/views/flow/workflow/utils/formPermissions';
|
import { processFormItemsWithPerms } from '/@/views/flow/workflow/utils/formPermissions';
|
||||||
|
import { ref, computed, watch } from 'vue';
|
||||||
|
|
||||||
|
// 定义 ApproverConfig 接口
|
||||||
|
interface NodeUser {
|
||||||
|
id: string | number;
|
||||||
|
name: string;
|
||||||
|
type?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ApproverConfig {
|
||||||
|
id?: string;
|
||||||
|
assignedType?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
||||||
|
nodeUserList: NodeUser[];
|
||||||
|
formUserId?: string;
|
||||||
|
formUserName?: string;
|
||||||
|
deptLeaderLevel?: number;
|
||||||
|
multiple?: boolean;
|
||||||
|
multipleMode?: number;
|
||||||
|
nobody?: {
|
||||||
|
handler: string;
|
||||||
|
assignedUser: NodeUser[];
|
||||||
|
};
|
||||||
|
refuse?: {
|
||||||
|
handler: string;
|
||||||
|
nodeId?: string;
|
||||||
|
};
|
||||||
|
formPerms?: Record<string, string>;
|
||||||
|
eventConfig?: any;
|
||||||
|
operList?: { checked: boolean }[];
|
||||||
|
error?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
let flowStore = useFlowStore();
|
let flowStore = useFlowStore();
|
||||||
|
|
||||||
@@ -141,14 +163,14 @@ const processFormPermissions = () => {
|
|||||||
|
|
||||||
// 驳回节点列表
|
// 驳回节点列表
|
||||||
const rejectNodeList = computed(() => {
|
const rejectNodeList = computed(() => {
|
||||||
let values = [];
|
let values: { id: string; name: string }[] = [];
|
||||||
const excType = [1];
|
const excType = [1];
|
||||||
const arr = {};
|
const arr: Record<string, any[]> = {};
|
||||||
const obj = {};
|
const obj: Record<string, any> = {};
|
||||||
|
|
||||||
produceSerialNodeList(undefined, flowStore.step3, arr, obj, true);
|
produceSerialNodeList(undefined, flowStore.step3, arr, obj, true);
|
||||||
|
|
||||||
const k = arr[approverConfig.value.id];
|
const k = approverConfig.value.id ? arr[approverConfig.value.id] : undefined;
|
||||||
|
|
||||||
if (k == undefined) {
|
if (k == undefined) {
|
||||||
return [];
|
return [];
|
||||||
@@ -163,7 +185,7 @@ const rejectNodeList = computed(() => {
|
|||||||
return values;
|
return values;
|
||||||
});
|
});
|
||||||
|
|
||||||
function produceSerialNodeList(parentId, process, nodeArr, nodeObj, noBranch) {
|
function produceSerialNodeList(parentId: any, process: any, nodeArr: Record<string, any[]>, nodeObj: Record<string, any>, noBranch: boolean) {
|
||||||
if (validateNull(process?.id)) {
|
if (validateNull(process?.id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -181,7 +203,7 @@ function produceSerialNodeList(parentId, process, nodeArr, nodeObj, noBranch) {
|
|||||||
if ((parentType == 5 || parentType == 8) && !noBranch) {
|
if ((parentType == 5 || parentType == 8) && !noBranch) {
|
||||||
nodeArr[nodeId] = [];
|
nodeArr[nodeId] = [];
|
||||||
} else {
|
} else {
|
||||||
const arr1 = other.deepClone(p);
|
const arr1 = other.deepClone(p) as any[];
|
||||||
arr1.push(nodeId);
|
arr1.push(nodeId);
|
||||||
nodeArr[nodeId] = arr1;
|
nodeArr[nodeId] = arr1;
|
||||||
}
|
}
|
||||||
@@ -211,7 +233,7 @@ const step2FormList = computed(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const step2FormUserList = computed(() => {
|
const step2FormUserList = computed(() => {
|
||||||
return step2FormList.value.filter((res) => res.type === 'OrgSelector' && res.props?.type === 'user');
|
return step2FormList.value.filter((res: any) => res.type === 'OrgSelector' && res.props?.type === 'user');
|
||||||
});
|
});
|
||||||
|
|
||||||
const openEvent = () => {
|
const openEvent = () => {
|
||||||
@@ -232,7 +254,7 @@ const openEvent = () => {
|
|||||||
// 这里可以进一步使用处理后的表单项
|
// 这里可以进一步使用处理后的表单项
|
||||||
};
|
};
|
||||||
|
|
||||||
let approverConfig = ref({});
|
let approverConfig = ref<ApproverConfig>({ nodeUserList: [] });
|
||||||
|
|
||||||
let store = useStore();
|
let store = useStore();
|
||||||
let { setApproverConfig, setApprover } = store;
|
let { setApproverConfig, setApprover } = store;
|
||||||
@@ -250,18 +272,18 @@ watch(approverConfigData, (val) => {
|
|||||||
approverConfig.value = val.value;
|
approverConfig.value = val.value;
|
||||||
});
|
});
|
||||||
//用户表单是否是多选
|
//用户表单是否是多选
|
||||||
const isMultiUserForm = (id) => {
|
const isMultiUserForm = (id: any) => {
|
||||||
if (!id) {
|
if (!id) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return step2FormUserList.value.filter((res) => res.id === id)[0]?.props.multiple;
|
return step2FormUserList.value.filter((res: any) => res.id === id)[0]?.props.multiple;
|
||||||
};
|
};
|
||||||
//监听用户选择表单值变化
|
//监听用户选择表单值变化
|
||||||
watch(
|
watch(
|
||||||
() => approverConfig.value.formUserId,
|
() => approverConfig.value.formUserId,
|
||||||
(val) => {
|
(val) => {
|
||||||
if (val) {
|
if (val) {
|
||||||
approverConfig.value.formUserName = step2FormUserList.value.filter((res) => res.field === val)[0].field;
|
approverConfig.value.formUserName = step2FormUserList.value.filter((res: any) => res.field === val)[0].field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -284,13 +306,13 @@ const closeDrawer = () => {
|
|||||||
setApprover(false);
|
setApprover(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const checkApproval = (nodeConfig) => {
|
const checkApproval = (nodeConfig: ApproverConfig) => {
|
||||||
if (nodeConfig.assignedType == 1 || nodeConfig.assignedType == 3) {
|
if (nodeConfig.assignedType == 1 || nodeConfig.assignedType == 3) {
|
||||||
//指定成员
|
//指定成员
|
||||||
if (nodeConfig.nodeUserList.length == 0) {
|
if (nodeConfig.nodeUserList.length == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (nodeConfig.assignedType == 8 && nodeConfig.formUserId.length == 0) {
|
} else if (nodeConfig.assignedType == 8 && (nodeConfig.formUserId?.length ?? 0) == 0) {
|
||||||
//表单
|
//表单
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,8 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-card shadow="never" class="header-card">
|
<el-card shadow="never" class="header-card">
|
||||||
<el-form :model="headerForm" label-width="90px" class="header-form" :rules="headerRequiredRule" ref="headerFormRef">
|
<el-form :model="headerForm" label-width="90px" class="header-form" :rules="headerRequiredRule"
|
||||||
|
ref="headerFormRef">
|
||||||
<el-form-item :label="t('mixedRegister.header.title')" prop="title">
|
<el-form-item :label="t('mixedRegister.header.title')" prop="title">
|
||||||
<el-input maxlength="255" v-model="headerForm.title"
|
<el-input maxlength="255" v-model="headerForm.title"
|
||||||
:placeholder="t('mixedRegister.header.titlePlaceholder')" />
|
:placeholder="t('mixedRegister.header.titlePlaceholder')" />
|
||||||
@@ -43,8 +44,7 @@
|
|||||||
<div class="page-title">{{ isUpdate ? t('mixedRegister.updateTitle') : t('mixedRegister.title') }}</div>
|
<div class="page-title">{{ isUpdate ? t('mixedRegister.updateTitle') : t('mixedRegister.title') }}</div>
|
||||||
|
|
||||||
<MixedRegisterSections ref="formRef" :instruction-title="t('mixedRegister.sections.instruction')"
|
<MixedRegisterSections ref="formRef" :instruction-title="t('mixedRegister.sections.instruction')"
|
||||||
:basic-info-title="t('mixedRegister.sections.basic')"
|
:basic-info-title="t('mixedRegister.sections.basic')" :instruction-fields="instructionFields"
|
||||||
:instruction-fields="instructionFields"
|
|
||||||
:instruction-form="instructionForm" :basic-info-fields="basicInfoFields"
|
:instruction-form="instructionForm" :basic-info-fields="basicInfoFields"
|
||||||
:basic-info-form="basicInfoForm" :is-update="isUpdate" />
|
:basic-info-form="basicInfoForm" :is-update="isUpdate" />
|
||||||
</div>
|
</div>
|
||||||
@@ -138,7 +138,7 @@ const instructionFields = computed<Array<{ key: InstructionFieldKey; label: stri
|
|||||||
|
|
||||||
const basicInfoFields = computed<Array<{ key: BasicFieldKey; label: string }>>(() => [
|
const basicInfoFields = computed<Array<{ key: BasicFieldKey; label: string }>>(() => [
|
||||||
{ key: 'groupBelonging', label: t('mixedRegister.basicFields.groupName') },
|
{ key: 'groupBelonging', label: t('mixedRegister.basicFields.groupName') },
|
||||||
{key: 'projectYear', label: t('mixedRegister.basicFields.year')},
|
{ key: 'projectYear', label: t('mixedRegister.basicFields.year'), type: 'year', fieldProps: { valueFormat: 'YYYY' } },
|
||||||
{ key: 'projectName', label: t('mixedRegister.basicFields.projectName') },
|
{ key: 'projectName', label: t('mixedRegister.basicFields.projectName') },
|
||||||
{ key: 'implementEnterprise', label: t('mixedRegister.basicFields.companyFullName') },
|
{ key: 'implementEnterprise', label: t('mixedRegister.basicFields.companyFullName') },
|
||||||
{ key: 'enterpriseCreditCode', label: t('mixedRegister.basicFields.creditCode') },
|
{ key: 'enterpriseCreditCode', label: t('mixedRegister.basicFields.creditCode') },
|
||||||
@@ -277,10 +277,12 @@ const handleSaveDraft = async () => {
|
|||||||
processInstanceId: '',
|
processInstanceId: '',
|
||||||
flowType: flowNameObj.value
|
flowType: flowNameObj.value
|
||||||
})
|
})
|
||||||
Object.assign(formData, {status:0,temporaryStorage:{
|
Object.assign(formData, {
|
||||||
|
status: 0, temporaryStorage: {
|
||||||
businessType: flowNameObj.value,
|
businessType: flowNameObj.value,
|
||||||
title: headerForm.title,
|
title: headerForm.title,
|
||||||
}})
|
}
|
||||||
|
})
|
||||||
await addMixedReformAPI(formData);
|
await addMixedReformAPI(formData);
|
||||||
message.success(t('mixedRegister.messages.submitSuccess') || '提交成功');
|
message.success(t('mixedRegister.messages.submitSuccess') || '提交成功');
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user