This commit is contained in:
2025-12-27 12:52:38 +08:00
parent b674b78621
commit 2529c5fa6f
44 changed files with 942 additions and 1196 deletions

2
.env
View File

@@ -30,7 +30,7 @@ VITE_OAUTH2_MOBILE_CLIENT='app:app'
VITE_OAUTH2_SOCIAL_CLIENT='social:social'
# 是否开启前端滑块验证码
VITE_VERIFY_ENABLE = true
VITE_VERIFY_ENABLE = false
# 是否开启前端图形验证码
VITE_VERIFY_IMAGE_ENABLE = false

View File

@@ -8,7 +8,7 @@ VITE_OPEN = true
ENV = 'development'
# ADMIN 服务地址
VITE_ADMIN_PROXY_PATH = http://panel1.nanxiislet.com:9999
# VITE_ADMIN_PROXY_PATH = http://panel1.nanxiislet.com:9999
# VITE_ADMIN_PROXY_PATH = http://192.168.2.102:9999
# 罗老师本地
# VITE_ADMIN_PROXY_PATH = http://10.30.148.198:7777
VITE_ADMIN_PROXY_PATH = http://10.30.148.198:7777

View File

@@ -10,3 +10,14 @@ export const getByProcessInstanceId = (processInstanceId: any) => {
}
});
}
// 企业微信登录
export const loginWx = (code: any) => {
return request({
url: '/oauth2/token',
method: 'post',
data:{
grant_type: 'wechat_work',
code:''
}
});
}

View File

@@ -53,3 +53,11 @@ export const getPropertyRightsByProcessInstanceIdAPI = (processInstanceId: strin
params: { processInstanceId },
});
}
// 根据id查询流程详情
export const getProcessInfoByIdAPI = (id: string | number) => {
return request({
url:'/admin/flow/form/processInfo',
method: 'get',
params: { id },
})
}

View File

@@ -16,7 +16,9 @@
>
<template v-if="imageUrl">
<!-- 如果返回的是OSS 地址则不需要增加 baseURL -->
<img :src="imageUrl.includes('http') ? imageUrl : baseURL + imageUrl" class="upload-image" />
<el-image :src="imageUrl.includes('http') ? imageUrl : baseURL + imageUrl" class="upload-image" @error="()=>imageUrl=''">
</el-image>
<div class="upload-handle" @click.stop>
<div class="handle-icon" @click="editImg" v-if="!self_disabled">
<el-icon :size="props.iconSize"><Edit /></el-icon>

View File

@@ -5,18 +5,18 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item prop="actualTotalIncome" :label="t('postInvestmentEvaluationForm.actualTotalRevenue')" required>
<el-input v-model="submitFormData.actualTotalIncome"
<el-input-number :controls="false" v-model="submitFormData.actualTotalIncome"
:placeholder="t('postInvestmentEvaluationForm.inputPlaceholder')">
<template #append>{{ t('postInvestmentEvaluationForm.unitSuffix') }}</template>
</el-input>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="actualInvestmentGain" :label="t('postInvestmentEvaluationForm.actualInvestmentIncome')" required>
<el-input v-model="submitFormData.actualInvestmentGain"
<el-input-number :controls="false" v-model="submitFormData.actualInvestmentGain"
:placeholder="t('postInvestmentEvaluationForm.inputPlaceholder')">
<template #append>{{ t('postInvestmentEvaluationForm.unitSuffix') }}</template>
</el-input>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
@@ -125,7 +125,7 @@
<div class="info-row">
<div class="info-label required">{{ t('postInvestmentEvaluationForm.basicInfo.projectDirection') }}
</div>
<div class="info-value required">{{ formData.projectInvestmentDirection || 'XXX' }}</div>
<div class="info-value required">{{ initTypeString(projectDirectionOptions,formData.projectInvestmentDirection) }}</div>
<div class="info-label required">{{ t('postInvestmentEvaluationForm.basicInfo.directionSubdivision')
}}
</div>
@@ -143,7 +143,7 @@
<div class="info-label required">{{
t('postInvestmentEvaluationForm.basicInfo.majorInvestmentProject') }}
</div>
<div class="info-value required">{{ formData.majorInvestmentProjects || 'XXX' }}</div>
<div class="info-value required"> {{ initTypeString(yesOrNo,formData.majorInvestmentProjects) }}</div>
<div class="info-label required">{{ t('postInvestmentEvaluationForm.basicInfo.keyProject') }}</div>
<div class="info-value required">{{ initTypeString(projectImportantOptions,formData.keyProject) || 'XXX' }}</div>
</div>
@@ -151,7 +151,7 @@
<div class="info-label required">{{ t('postInvestmentEvaluationForm.basicInfo.isWithinMainBusiness')
}}
</div>
<div class="info-value required">{{ formData.isMainBusiness || 'XXX' }}</div>
<div class="info-value required">{{ initTypeString(yesOrNo,formData.isMainBusiness) }}</div>
<div class="info-label required">{{ t('postInvestmentEvaluationForm.basicInfo.mainBusinessType') }}
</div>
<div class="info-value required">{{ initTypeString(mainBusinessOptions,formData.mainBusinessTypes) || 'XXX' }}</div>
@@ -274,7 +274,7 @@
<div class="info-value">{{ formData.decisionType || 'XXX' }}</div>
<div class="info-label">{{
t('postInvestmentEvaluationForm.decisionInfo.isProjectApprovalProcedureCompleted') }}</div>
<div class="info-value">{{ formData.isProjectApprovalCompleted || 'XXX'
<div class="info-value">{{ initTypeString(yesOrNo,formData.isProjectApprovalCompleted) || 'XXX'
}}</div>
</div>
<div class="info-row">
@@ -292,7 +292,7 @@
<div class="info-label">{{
t('postInvestmentEvaluationForm.decisionInfo.isDecisionProcedureCompleted')
}}</div>
<div class="info-value">{{ formData.isDecisionProcedureCompleted || 'XXX' }}</div>
<div class="info-value">{{ initTypeString(yesOrNo,formData.isDecisionProcedureCompleted) || 'XXX' }}</div>
<div class="info-label">{{
t('postInvestmentEvaluationForm.decisionInfo.decisionProcedureDocumentNumber') }}</div>
<div class="info-value">{{ formData.decisionProcedureFileNo || 'XXX' }}
@@ -531,7 +531,8 @@ import {
constructionNatureOptions, constructionStageOptions,
Enums, investmentAreaOptions, investmentCategoryOptions, mainBusinessOptions, projectDirectionDetailsOptions,
projectImportantOptions, projectNatureOptions,
projectSourceOptions, projectStatusOptions, strategicIndustryOptions
projectSourceOptions, projectStatusOptions, strategicIndustryOptions,projectDirectionOptions,
yesOrNo
} from '/@/hooks/enums';
import { PostInvestmentEvaluation, ProjectInvestmentInfo } from '/@/views/invBid/postInvestmentEvaluation/interface/type';
import { InvestmentProjectProgress } from '/@/views/invMid/progressReport/interface/type';
@@ -648,7 +649,7 @@ const formData = reactive<ProjectInvestmentInfo>({ ...defaultForm });
* 提交数据表单
* */
const submitFormData = ref<PostInvestmentEvaluation>({} as PostInvestmentEvaluation);
const requiredRule = [{ required: true, message: `${t('该字段必填')}` },{validator: (rule: any, value:any,callback: (e?: Error) => void) => {
const requiredRule = [{ required: true, message: `该字段必填` },{validator: (rule: any, value:any,callback: (e?: Error) => void) => {
// 检查是否为空值
if (value === '' || value === null || value === undefined) {
callback()
@@ -659,7 +660,7 @@ const requiredRule = [{ required: true, message: `${t('该字段必填')}` },{va
if (!isNaN(numValue) && isFinite(numValue)) {
callback()
} else {
callback(new Error(`${t('common.isNumber')}`))
callback(new Error(`必须是一个数字`))
}
}}]
const rules = ref<FormRules<PostInvestmentEvaluation>>({
@@ -763,7 +764,7 @@ defineExpose({
if (res){
return submitFormData.value;
}
return false;
return false
},
})
const uploadChange = (type:number,_:any,data:any[],index?:number) => {

View File

@@ -32,7 +32,7 @@
{{ detail.workUnit || '-' }}
</el-descriptions-item>
<el-descriptions-item :label="t('expertApply.table.level')">
{{ levelLabel(detail.level) }}
<span>{{ level.find((item:any) => item.value === detail.level)?.label || '--' }}</span>
</el-descriptions-item>
<el-descriptions-item :label="t('expertLibrary.table.status')">
<el-tag :type="['info', 'primary', 'success', 'danger'][detail.status]">{{ statusLabel(detail.status) }}</el-tag>
@@ -82,6 +82,7 @@
<script lang="ts" setup>
import { ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import {level} from "/@/hooks/enums";
const baseURL = import.meta.env.VITE_API_URL

View File

@@ -251,7 +251,7 @@
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')" required prop="strategicEmergingIndustry">
<el-select v-model="formData.strategicEmergingIndustry" :placeholder="t('reserveRegistration.basicInfo.selectPlaceholder')" >
<el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value"/>
<el-option v-for="item in strategicIndustryOptions" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-form-item>
</el-col>
@@ -572,12 +572,12 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.establishmentDocumentNumber')" :prop="formData.isCompleteEstablishmentProcedures === '1' ? 'establishmentDocumentNumber':''">
<el-form-item :label="t('reserveRegistration.decisionInfo.establishmentDocumentNumber')" :prop="formData.isCompleteEstablishmentProcedures === '0' ? 'establishmentDocumentNumber':''">
<el-input maxlength="255" v-model="formData.establishmentDocumentNumber" :placeholder="t('reserveRegistration.decisionInfo.inputPlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.establishmentDocumentInfo')" :prop="formData.isCompleteEstablishmentProcedures === '1'?'establishmentDocumentInfo':''">
<el-form-item :label="t('reserveRegistration.decisionInfo.establishmentDocumentInfo')" :prop="formData.isCompleteEstablishmentProcedures === '0'?'establishmentDocumentInfo':''">
<el-input maxlength="255" v-model="formData.establishmentDocumentInfo" :placeholder="t('reserveRegistration.decisionInfo.inputPlaceholder')" />
</el-form-item>
</el-col>
@@ -597,14 +597,14 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.decisionProgramDocumentNumber')" :prop="formData.isCompleteDecisionProcedures === '1'?'decisionProgramDocumentNumber' : ''">
<el-form-item :label="t('reserveRegistration.decisionInfo.decisionProgramDocumentNumber')" :prop="formData.isCompleteDecisionProcedures === '0'?'decisionProgramDocumentNumber' : ''">
<el-input maxlength="255" v-model="formData.decisionProgramDocumentNumber" :placeholder="t('reserveRegistration.decisionInfo.inputPlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('reserveRegistration.decisionInfo.decisionDocumentInfo')" :prop="formData.isCompleteDecisionProcedures === '1'?'decisionDocumentInfo':''">
<el-form-item :label="t('reserveRegistration.decisionInfo.decisionDocumentInfo')" :prop="formData.isCompleteDecisionProcedures === '0'?'decisionDocumentInfo':''">
<el-input maxlength="255" v-model="formData.decisionDocumentInfo" :placeholder="t('reserveRegistration.decisionInfo.inputPlaceholder')" />
</el-form-item>
</el-col>
@@ -646,7 +646,8 @@ import {
projectSourceOptions,
constructionNatureOptions,
investmentAreaOptions, yesOrNo, decisionTypeOptions, projectImportantOptions, cooperationPartnerNatureOptions,
cityStrategyOptions, mainBusinessOptions, projectDirectionDetailsOptions,projectDirectionOptions
cityStrategyOptions, mainBusinessOptions, projectDirectionDetailsOptions, projectDirectionOptions,
strategicIndustryOptions
} from '/@/hooks/enums';
import UserSelect from '/@/components/UserSelect/index.vue';
import ProjectNameList from '/@/components/ProjectNameList/index.vue';

View File

@@ -103,12 +103,12 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.keyProject')">
{{ formData.keyProject === 'yes' ? '是' : '' }}
{{ projectImportantOptions.find(item => item.value === formData.keyProject)?.label || formData.keyProject || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.majorInvestmentProject')">
{{ formData.majorInvestmentProject || '--' }}
{{ yesOrNo.find(item => item.value === formData.majorInvestmentProject)?.label || formData.majorInvestmentProject || '--' }}
</el-form-item>
</el-col>
</el-row>
@@ -116,7 +116,7 @@
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('reserveRegistration.basicInfo.withinMainBusiness')">
{{ formData.withinMainBusiness || '--' }}
{{ yesOrNo.find(item => item.value === formData.withinMainBusiness)?.label || formData.withinMainBusiness || '--' }}
</el-form-item>
</el-col>
</el-row>
@@ -124,7 +124,7 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.mainBusinessType')">
{{ formData.mainBusinessType || '--' }}
{{ mainBusinessOptions.find(item => item.value === formData.mainBusinessType)?.label || formData.mainBusinessType || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
@@ -138,12 +138,12 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.projectDirection')">
{{ formData.projectDirection || '--' }}
{{ projectDirectionOptions.find(item => item.value === formData.projectDirection)?.label || formData.projectDirection || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.directionSubdivision')">
{{ formData.directionSubdivision || '--' }}
{{ projectDirectionDetailsOptions.find(item => item.value === formData.directionSubdivision)?.label || formData.directionSubdivision || '--' }}
</el-form-item>
</el-col>
</el-row>
@@ -151,12 +151,12 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.strategicEmergingIndustry')">
{{ formData.strategicEmergingIndustry || '--' }}
{{ yesOrNo.find(item => item.value === formData.strategicEmergingIndustry)?.label || formData.strategicEmergingIndustry || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.urbanStrategy')">
{{ formData.urbanStrategy || '--' }}
{{ cityStrategyOptions.find(item => item.value === formData.urbanStrategy)?.label || formData.urbanStrategy || '--' }}
</el-form-item>
</el-col>
</el-row>
@@ -164,7 +164,7 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.isManufacturing')">
{{ formData.isManufacturing || '--' }}
{{ yesOrNo.find(item => item.value === formData.isManufacturing)?.label || formData.isManufacturing || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
@@ -191,7 +191,7 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.basicInfo.isControllingShareholder')">
{{ formData.isControllingShareholder || '--' }}
{{ yesOrNo.find(item => item.value === formData.isControllingShareholder)?.label || formData.isControllingShareholder || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
@@ -307,12 +307,12 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.decisionType')">
{{ formData.decisionType || '--' }}
{{ decisionTypeOptions.find(item => item.value === formData.decisionType)?.label || formData.decisionType || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.isCompleteEstablishmentProcedures')">
{{ formData.isCompleteEstablishmentProcedures === 'yes' ? '是' : '' }}
{{ yesOrNo.find(item => item.value === formData.isCompleteEstablishmentProcedures)?.label || formData.isCompleteEstablishmentProcedures || '--' }}
</el-form-item>
</el-col>
</el-row>
@@ -333,7 +333,7 @@
<el-row :gutter="20" class="form-row">
<el-col :span="12">
<el-form-item :label="t('reserveRegistration.decisionInfo.isCompleteDecisionProcedures')">
{{ formData.isCompleteDecisionProcedures === 'yes' ? '是' : '' }}
{{ yesOrNo.find(item => item.value === formData.isCompleteDecisionProcedures)?.label || formData.isCompleteDecisionProcedures || '--' }}
</el-form-item>
</el-col>
<el-col :span="12">
@@ -369,14 +369,21 @@
</template>
<script lang="ts" setup>
import { reactive, watch, ref } from 'vue';
import { reactive, watch, ref, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import {
projectNatureOptions,
investmentCategoryOptions,
projectSourceOptions,
constructionNatureOptions,
investmentAreaOptions
investmentAreaOptions,
yesOrNo,
decisionTypeOptions,
projectImportantOptions,
cityStrategyOptions,
mainBusinessOptions,
projectDirectionDetailsOptions,
projectDirectionOptions
} from '/@/hooks/enums'
import type { ExternalCooperationUnitItemT } from '/@/api/investment/cooperationUnit'
@@ -433,7 +440,10 @@ export interface ProjectBasicInfoFormData {
isCompleteDecisionProcedures: string;
reviewOpinions: ReviewOpinions;
processInstanceId: string;
cooperationUnits?: ExternalCooperationUnitItemT[]
cooperationUnits?: ExternalCooperationUnitItemT[];
parentId?: string;
status: number;
deptId: string;
}
export interface PartnerInfo {
@@ -442,6 +452,7 @@ export interface PartnerInfo {
nature: string;
controller: string;
share: string;
cooperationController: string;
}
export interface ReviewOpinions {
@@ -451,9 +462,15 @@ export interface ReviewOpinions {
submitUnitMainLeadershipOpinion: string;
}
const props = defineProps<{
const props = withDefaults(defineProps<{
modelValue?: ProjectBasicInfoFormData;
}>();
mainTitle?: string;
}>(), {
mainTitle: ''
});
const mainTitle = computed(() => props.mainTitle);
watch(mainTitle, () => undefined);
const defaultPartnerRow: PartnerInfo = {
id: '',
@@ -519,6 +536,10 @@ const defaultFormData: ProjectBasicInfoFormData = {
submitUnitLeadershipOpinion: '',
submitUnitMainLeadershipOpinion: '',
},
parentId: '',
status: 1,
deptId: '',
cooperationUnits: [],
};
const formData = reactive<ProjectBasicInfoFormData>({ ...defaultFormData });
@@ -570,6 +591,19 @@ watch(
.form-row:last-of-type {
margin-bottom: 0;
}
/* 新增确保el-form-item内容自动换行 */
:deep(.el-form-item) {
word-wrap: break-word;
word-break: break-all;
overflow-wrap: break-word;
}
/* 对于表格中的内容也确保换行 */
:deep(.el-table .cell) {
word-wrap: break-word;
word-break: break-all;
overflow-wrap: break-word;
white-space: pre-wrap;
}
:deep(.el-form-item__label) {
font-weight: 500;

View File

@@ -5,8 +5,7 @@
<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>
@@ -21,8 +20,7 @@
<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 />
@@ -40,8 +38,7 @@
<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>
@@ -68,8 +65,7 @@
<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>
@@ -78,10 +74,8 @@
<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>
@@ -91,13 +85,23 @@
<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>
@@ -113,39 +117,31 @@
</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">
@@ -155,10 +151,16 @@
</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>
@@ -369,11 +371,9 @@ defineExpose({
.table-cell.value {
flex: 1;
}
.table-row {
margin: 0;
}
.table-row.two-columns .table-cell.label {
width: 160px;
}
@@ -405,7 +405,6 @@ defineExpose({
.exit-plan-table :deep(.el-date-editor) {
width: 100%;
}
.options {
width: 20px;
height: 20px;
@@ -413,7 +412,6 @@ defineExpose({
border: 1px solid var(--el-border-color);
border-radius: 50%;
}
.active {
background-color: var(--el-color-primary);
color: white;
@@ -423,7 +421,6 @@ defineExpose({
height: 100%;
position: relative;
}
:deep(.el-form-item__label:before) {
left: 4px;
position: absolute;

View File

@@ -11,11 +11,9 @@
<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 />
@@ -29,73 +27,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>
@@ -103,51 +101,38 @@
<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>
@@ -155,30 +140,22 @@
<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>
@@ -186,21 +163,16 @@
<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>
@@ -208,25 +180,32 @@
<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>
@@ -234,17 +213,13 @@
<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>
@@ -254,22 +229,16 @@
<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>
@@ -277,17 +246,25 @@
<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>
@@ -298,23 +275,19 @@
<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>
@@ -323,37 +296,23 @@
<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>
@@ -362,10 +321,8 @@
<!--项目概述-->
<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>
@@ -373,12 +330,16 @@
<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>
@@ -391,44 +352,31 @@
</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>
@@ -461,95 +409,56 @@
{{ $index + 1 }}
</template>
</el-table-column>
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.planYear') }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.planYear')" min-width="140">
<template #default="{ row }">
<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 }" />
<el-date-picker
v-model="row.plannedInvestmentYear"
type="year"
value-format="YYYY"
:placeholder="t('planApply.placeholder.select')"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column min-width="160">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.plannedImageQuota') +
'(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.plannedImageQuota')+'(万元)'" min-width="160">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.plannedImageAmount" :placeholder="t('planApply.placeholder.input')"/>
</template>
</el-table-column>
<el-table-column min-width="160">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.annualPlanPayment') +
'(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.annualPlanPayment')+'(万元)'" min-width="160">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.plannedPaymentAmount" :placeholder="t('planApply.placeholder.input')"/>
</template>
</el-table-column>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.fundingSources')" align="center">
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.capitalFunding') +
'(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.capitalFunding')+'(万元)'" min-width="140">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.selfFunding" :placeholder="t('planApply.placeholder.input')"/>
</template>
</el-table-column>
<el-table-column min-width="150">
<template #header>
<span class="required-field">{{
t('planApply.annualInvestmentInfo.table.externalRaisedFunds') + '(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.externalRaisedFunds')+'(万元)'" min-width="150">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.externalFunding" :placeholder="t('planApply.placeholder.input')"/>
</template>
</el-table-column>
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.financialFunding') +
'(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.financialFunding')+'(万元)'" min-width="140">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.fiscalFunding" :placeholder="t('planApply.placeholder.input')"/>
</template>
</el-table-column>
<el-table-column min-width="140">
<template #header>
<span class="required-field">{{ t('planApply.annualInvestmentInfo.table.otherFunding') +
'(万元)' }}</span>
</template>
<el-table-column :label="t('planApply.annualInvestmentInfo.table.otherFunding')+'(万元)'" min-width="140">
<template #default="{ row }">
<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 }" />
<el-input-number :precision="2" :length="20" :controls="false" min="0" v-model="row.otherFunding" :placeholder="t('planApply.placeholder.input')"/>
</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>
@@ -559,20 +468,15 @@
<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>
@@ -580,47 +484,36 @@
<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>
@@ -629,7 +522,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="mode === 'view'" />
<el-input v-model="formData.entity.submitUnitOpinion" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -637,7 +530,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="mode === 'view'" />
<el-input v-model="formData.entity.groupInvestmentDeptOpinion" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -645,7 +538,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="mode === 'view'" />
<el-input v-model="formData.entity.submitUnitLeadershipOpinion" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -653,8 +546,7 @@
<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="mode === 'view'" />
<el-input v-model="formData.entity.submitUnitMainLeadershipOpinion" readonly />
</el-form-item>
</el-col>
</el-row>
@@ -665,7 +557,7 @@
</template>
<script lang="ts" setup>
import { ref, watch, nextTick, computed } from 'vue';
import { ref, watch,nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import type { InvestmentProjects, ProjectPlanApplyFormData } from '../interface/types';
import ProjectNameList from '/@/components/ProjectNameList/index.vue';
@@ -682,7 +574,6 @@ 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';
@@ -693,7 +584,6 @@ const props = withDefaults(
modelValue?: ProjectPlanApplyFormData;
rules?: FormRules;
isUpdate?: boolean;
mode?: 'edit' | 'view';
}>(),
{
modelValue: () => ({
@@ -782,7 +672,6 @@ const props = withDefaults(
}),
rules: () => ({}),
isUpdate: false,
mode: 'edit',
}
);
@@ -790,8 +679,6 @@ const emit = defineEmits<{
(e: 'update:modelValue', value: ProjectPlanApplyFormData): void;
}>();
const mode = computed(() => props.mode);
const defaultForm: ProjectPlanApplyFormData = {
entity: {
id: null,
@@ -884,12 +771,12 @@ const selectedAnnualInvestmentIndex = ref<number>(formData.value.investmentProje
const handleAddAnnualInvestment = () => {
const newItem: InvestmentProjects = {
plannedInvestmentYear: '',
plannedImageAmount: null,
plannedPaymentAmount: null,
selfFunding: null,
externalFunding: null,
fiscalFunding: null,
otherFunding: null,
plannedImageAmount: '',
plannedPaymentAmount: '',
selfFunding: '',
externalFunding: '',
fiscalFunding: '',
otherFunding: '',
fiscalFundingSource: '',
otherFundingSource: '',
};
@@ -898,8 +785,7 @@ const handleAddAnnualInvestment = () => {
};
const year = computed(()=>formData.value.entity.planInvestmentYear)
// 修改计算逻辑,确保正确处理初始值
const safeParseFloat = (value: string | number | null): number => {
if (value === null) return 0;
const safeParseFloat = (value: string | number): number => {
const parsed = typeof value === 'string' ? parseFloat(value) : value;
return isNaN(parsed) ? 0 : parsed;
};
@@ -982,70 +868,8 @@ watch(
},
{ deep: true }
);
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 validateForm = () => {
return useForm.value?.validate();
};
const projectNameFn = (row: any) => {
Object.assign(formData.value.entity, row);
@@ -1209,17 +1033,4 @@ const handleProjectMainUnitChange = (value: any) => {
.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

@@ -438,7 +438,7 @@ import {projectNatureOptions,
cityStrategyOptions, Enums
} from "/@/hooks/enums"
import type { FormInstance, FormRules } from 'element-plus';
import FlowFormView from '/@/components/workbench/common/FlowFormView.vue'
import FlowFormView from '/@/components/workbench/common/FlowFormView.vue';
const { t } = useI18n();
const useForm = ref<FormInstance | undefined>();
const props = withDefaults(defineProps<{
@@ -523,6 +523,9 @@ const defaultForm: ProjectPlanApplyFormData = {
submitUnitLeadershipOpinion: '',
submitUnitMainLeadershipOpinion: '',
planImageQuota:'',
status:0,
deptId:0,
processInstanceId:'',
},
investmentProjects: [
{

View File

@@ -207,13 +207,8 @@
<el-row :gutter="20" class="form-row">
<el-col :span="24">
<el-form-item :label="t('progressReport.form.currentStageEvidenceMaterials')">
<el-input v-model="formData.supportingDocuments"
:placeholder="t('progressReport.form.selectAttachmentPlaceholder')" readonly>
<template #append>
<UploadFile :modelValue="formData.supportingDocuments" @change="uploadChange" :fileSize="20"
type="simple" :limit="10" :isShowTip="false" />
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>

View File

@@ -1,8 +1,7 @@
<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">
@@ -18,15 +17,12 @@
<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>
@@ -37,16 +33,14 @@
</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>
@@ -78,16 +72,12 @@
<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')">
@@ -143,9 +133,8 @@
<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>
@@ -161,8 +150,7 @@
<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>
@@ -309,7 +297,7 @@ watch(
(newVal) => {
if (newVal) {
if (typeof newVal.annualReport === 'number') newVal.annualReport = newVal.annualReport.toString()
Object.assign(formData, newVal);
Object.assign(formData, defaultForm, newVal);
}
},
{ immediate: true, deep: true }

View File

@@ -1,12 +1,12 @@
export interface InvestmentProjects {
id?: number;
plannedInvestmentYear: 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;
plannedImageAmount: string;
plannedPaymentAmount: string;
selfFunding: string;
externalFunding: string;
fiscalFunding: string;
otherFunding: string;
fiscalFundingSource: string;
otherFundingSource: string;
}

View File

@@ -53,7 +53,7 @@
</div>
<!-- 输入框 -->
<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'" align="left" 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')" />
</template>
@@ -69,6 +69,7 @@
import type { FormInstance } from 'element-plus';
import { useI18n } from 'vue-i18n';
import LibrarySelect from '/@/views/investment/mixedReformRegister/components/LibrarySelect.vue';
import{ElInputNumber} from 'element-plus'
const { t } = useI18n();
type FieldConfig = {
@@ -76,7 +77,7 @@ type FieldConfig = {
label: string;
span?: number;
type?: string;
fieldProps?: any;
fieldProps?: any; length?: number;
};
const props = defineProps<{

View File

@@ -30,6 +30,8 @@ import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import {queryMineStarted, queryMineTask} from "/@/api/flow/task";
import {useMessage} from "/@/hooks/message";
import request from "/@/utils/request";
import {examineDict} from "/@/hooks/enums";
const { t } = useI18n();
const router = useRouter();
@@ -46,27 +48,7 @@ const emit = defineEmits<{
const activeTab = ref('pending');
const tableData = ref<any[]>([]);
const loading = ref(false);
/**
* 根据任务名称判断类型
* @param name 任务名称
* @returns 任务类型
*/
const getTaskType = (name: string): string => {
if (name.includes('投资申报') || name.includes('项目投资')) {
return 'investment';
}
if (name.includes('专家') || name.includes('专家登记')) {
return 'expert';
}
if (name.includes('投资储备') || name.includes('储备')) {
return 'reserve';
}
if (name.includes('合作单位') || name.includes('合作')) {
return 'cooperation';
}
// 默认类型
return 'default';
};
/**
* 根据类型获取审批页面路由
@@ -91,20 +73,29 @@ const getApprovalRoute = (type: string, taskId: string): string => {
* @param row 行数据
*/
const handleRowClick = (row: any) => {
const taskType = row.type || getTaskType(row.name);
console.log(row);
const taskId = row.taskId || row.id;
const route = getApprovalRoute(taskType, taskId);
const route = getApprovalRoute(row.flowType, taskId);
const routePath = examineDict[row.flowType]
if (!routePath){
useMessage().error('未定义的审批类型!')
return
}
console.log(routePath)
// 跳转到对应的审批页面
router.push({
path: route.split('?')[0],
path: routePath,
query: {
id: taskId,
type: taskType,
processInstanceId: row.processInstanceId,
tab: activeTab.value, // 传递当前标签页信息,用于返回时定位
},
});
};
// request('admin/sys/code/list',{
// method:'get',
// }).then(res=>{
// console.log('test',res)
// })
const getQueryMineTask = () =>{
return new Promise((resolve, reject) =>{
queryMineTask({

View File

@@ -15,8 +15,7 @@
</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">
@@ -31,8 +30,7 @@
<!-- 撤回区域可撤回状态显示 -->
<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">
@@ -63,12 +61,11 @@
<!-- <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">
{{ item.approveDesc }}
<span>{{ item.approveDesc }}</span>
</div>
</template>
<div class="record-opinion" v-else>
@@ -82,8 +79,7 @@
</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>
@@ -378,7 +374,6 @@ onMounted(() => {
display: flex;
/* gap: 8px; */
margin-bottom: 16px;
.el-button {
flex: 1;
}
@@ -508,7 +503,13 @@ onMounted(() => {
font-size: 14px;
}
.record-status {
.record-item .record-content .record-status {
max-width: 100%;
text-wrap: wrap;
word-wrap: break-word; /* 允许长单词换行 */
word-break: break-all; /* 打断所有单词 */
white-space: pre-wrap; /* 保留空白符和换行符 */
overflow-wrap: break-word; /* 确保超长内容能换行 */
font-size: 14px;
font-weight: 500;
line-height: 1;
@@ -526,7 +527,15 @@ onMounted(() => {
color: var(--el-text-color-regular);
}
.record-opinion {
.record-item .record-content .record-opinion {
max-width: 100%;
text-wrap: wrap;
word-wrap: break-word; /* 允许长单词换行 */
word-break: break-all; /* 打断所有单词 */
white-space: pre-wrap; /* 保留空白符和换行符 */
overflow-wrap: break-word; /* 确保超长内容能换行 */
overflow-x: hidden;
height: auto;
color: var(--el-text-color-regular);
font-size: 14px;
line-height: 1.6;

View File

@@ -82,8 +82,8 @@ const setShowAside = computed(() => {
if(layout !== 'classic'){
return true
}
// 首页和工作台不显示侧边栏
return (route.path !== '/home' && route.path !== '/workbench/index')
// 首页不显示侧边栏
return route.path !== '/home'
});
// 设置显示/隐藏 logo

View File

@@ -55,7 +55,7 @@
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="/workbench/index">{{ $t('user.dropdown1') }}</el-dropdown-item>
<el-dropdown-item command="/home">{{ $t('user.dropdown1') }}</el-dropdown-item>
<el-dropdown-item command="personal">{{ $t('user.dropdown2') }}</el-dropdown-item>
<el-dropdown-item divided command="logOut">{{ $t('user.dropdown5') }}</el-dropdown-item>
</el-dropdown-menu>

View File

@@ -22,30 +22,30 @@
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="用户名" prop="username">
<el-input v-model="formData.username" clearable disabled></el-input>
<el-input v-model="formData.name" clearable disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="手机" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机" clearable></el-input>
<el-form-item label="账号" prop="phone">
<el-input disabled v-model="formData.username" placeholder="请输入账号" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入邮箱" clearable></el-input>
<el-form-item label="公司" prop="orgName">
<el-input v-model="formData.orgName" placeholder="请输入公司" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="昵称" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入昵称" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名" clearable></el-input>
<el-form-item label="部门" prop="deptName">
<el-input v-model="formData.deptName" placeholder="请输入部门" clearable></el-input>
</el-form-item>
</el-col>
<!-- <el-col :span="24" class="mb20">-->
<!-- <el-form-item label="姓名" prop="name">-->
<!-- <el-input v-model="formData.name" placeholder="请输入姓名" clearable></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24" class="mb20">
<el-form-item>
<el-button type="primary" @click="handleSaveUser"> 更新个人信息 </el-button>
@@ -154,9 +154,9 @@ const formData = ref({
userId: '',
username: '',
name: '',
email: '',
orgName: '',
avatar: '',
nickname: '',
deptName: '',
wxDingUserid: '',
wxCpUserid: '',
phone: ('' as string) || undefined,
@@ -177,9 +177,9 @@ const ruleForm = reactive({
{ required: true, message: '手机号不能为空', trigger: 'blur' },
{ validator: rule.validatePhone, trigger: 'blur' },
],
nickname: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '昵称不能为空', trigger: 'blur' }],
email: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '邮箱不能为空', trigger: 'blur' }],
name: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '姓名不能为空', trigger: 'blur' }],
deptName: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '部门不能为空', trigger: 'blur' }],
orgName: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '邮箱不能为空', trigger: 'blur' }],
userId: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '姓名不能为空', trigger: 'blur' }],
});
const validatorPassword2 = (rule: any, value: any, callback: any) => {
if (value !== passwordFormData.newpassword1) {

View File

@@ -21,7 +21,7 @@
>
<el-table-column type="index" :label="$t('projectReviewPolicy.index')" width="60" />
<el-table-column prop="projectType" :label="$t('projectReviewPolicy.projectType')">
<el-table-column prop="projectType" label="投资类别">
<template #default="{ row, $index }">
<el-select
v-model="row.projectType"
@@ -30,7 +30,7 @@
style="width: 100%"
>
<el-option
v-for="item in projectTypeOptions"
v-for="item in investmentCategoryOptions"
:key="item.value"
:label="item.label"
:value="item.value"
@@ -109,6 +109,7 @@ import {
deleteProjectReviewPolicy
} from '/@/api/config/projectReviewPolicy';
import { debounce } from 'lodash';
import { investmentCategoryOptions } from '/@/hooks/enums';
const { t } = useI18n();
const message = useMessage();

View File

@@ -33,15 +33,15 @@
<!-- Content Area -->
<el-scrollbar class="h-[calc(100vh-20px)]">
<step1 v-show="activeStep === 0" :groupId="paramGroupId" ref="step1Ref" />
<step2 v-show="activeStep === 1" ref="step2Ref" />
<step3 v-show="activeStep === 2" :nodeConfigObj="step3NodeConfig" ref="step3Ref" />
<!-- <step2 v-show="activeStep === 1" ref="step2Ref" />-->
<step3 v-show="activeStep === 1" :nodeConfigObj="step3NodeConfig" ref="step3Ref" />
</el-scrollbar>
<!-- Validation Dialog -->
<el-dialog v-model="validateDialogShow" :title="$t('flow.processCheck')">
<el-steps :active="validateFlowStep" finish-status="success" simple class="mt-5">
<el-step :title="$t('flow.basicInformation')" />
<el-step :title="$t('flow.formDesign')" />
<!-- <el-step :title="$t('flow.formDesign')" />-->
<el-step :title="$t('flow.processDesign')" />
</el-steps>
@@ -181,7 +181,7 @@ const checkStep1 = () => {
validateFlowStep.value = 1;
setTimeout(function () {
checkStep2();
checkStep3();
}, 500);
} else {
validatingShow.value = false;
@@ -251,5 +251,7 @@ const submitFlow = () => {
};
// Add steps data
const steps = [{ title: 'flow.basicInformation' }, { title: 'flow.formDesign' }, { title: 'flow.processDesign' }];
const steps = [{ title: 'flow.basicInformation' },
// { title: 'flow.formDesign' },
{ title: 'flow.processDesign' }];
</script>

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import selectShow from '/@/components/OrgSelector/index.vue';
import uploadImg from "/@/components/Upload/Image.vue"
interface UserVo {
id: string;
name: string;
@@ -28,6 +28,7 @@ const props = defineProps<{
nodeUser: Record<string, any>;
row: FlowNode[];
disableSelect: boolean;
disabled: boolean;
}>();
// Create a map to store active tabs for each node
@@ -71,7 +72,7 @@ import { Check, Plus, Refresh } from '@element-plus/icons-vue';
<div v-if="node.userVoList?.length" class="flex flex-wrap gap-2 mb-3">
<div v-for="(item1, index1) in node.userVoList" :key="index1" class="w-10 text-center">
<div class="flex flex-col items-center">
<upload-img v-model:image-url="item1.avatar" width="30px" height="30px"></upload-img>
<upload-img v-model:image-url="item1.avatar" width="30px" height="30px" :disabled="disabled"></upload-img>
<div class="mt-1 w-full text-xs truncate">{{ item1.name }}</div>
</div>
</div>
@@ -89,7 +90,7 @@ import { Check, Plus, Refresh } from '@element-plus/icons-vue';
<span class="ml-1 text-gray-500">(添加了评论) {{ item1.showTime }}</span>
</div>
</div>
<div class="p-3 text-sm bg-gray-50 rounded">{{ item1.approveDesc }}</div>
<div class="p-3 text-sm bg-gray-50 rounded break-words break-all whitespace-pre-wrap">{{ item1.approveDesc }}</div>
</div>
</div>

View File

@@ -28,6 +28,10 @@ let props = defineProps({
type: Array,
dafault: () => [],
},
disabled: {
type: Boolean,
default: false,
},
});
const row = ref([]);
@@ -88,5 +92,5 @@ defineExpose({ validate, formatSelectNodeUser });
</script>
<template>
<flow-node-format :row="row" :node-user="nodeUser" :disableSelect="disableSelect" ref="flowNodeFormatRef"></flow-node-format>
<flow-node-format :row="row" :node-user="nodeUser" :disableSelect="disableSelect" ref="flowNodeFormatRef" :disabled="disabled"></flow-node-format>
</template>

View File

@@ -59,16 +59,17 @@ const handleSubmit = async () => {
return;
}
const submitFormData = await formDataRef.value.validateRefFn();
const submitFormData:PostInvestmentEvaluation|boolean = await formDataRef.value.validateRefFn();
// 提交表单数据
if (submitFormData) {
submitFormData.attachmentUrl = JSON.stringify(submitFormData.attachmentUrl);
submitFormData.deptId = formData.value.deptId;
await addInvestmentEvaluation(submitFormData as PostInvestmentEvaluation);
message.success(t('common.success'));
message.success(t('成功'));
router.back();
}
} catch (error: any) {
message.error(error.msg || 'Submission failed');
message.error(error.msg || '失败');
}
};

View File

@@ -513,6 +513,9 @@ const createEmptyDetail = (): ProjectPlanApplyFormData => ({
submitUnitLeadershipOpinion: '',
submitUnitMainLeadershipOpinion: '',
planImageQuota:'',
deptId:0,
status:0,
processInstanceId:'',
},
investmentProjects: [
{

View File

@@ -40,6 +40,8 @@ export interface PostInvestmentEvaluation {
/** 创建时间 */
createTime?: string; // date-time
/**部门id*/
deptId?: string; // integer(int64)
}
/**
@@ -225,6 +227,8 @@ export interface ProjectInvestmentInfo {
/** 投资项目进度实体列表 */
investmentProjectsProgressEntities?: InvestmentProjectProgress[];
/**部门id*/
deptId?: string; // integer(int64)
}
export interface requestData {
page: number,

View File

@@ -76,12 +76,12 @@
</el-col>
<el-col :span="20">
<el-form-item>
<el-input v-model="formData.projectName" :placeholder="t('committeeReview.form.selectPlaceholder')" readonly>
<template #append>
<el-icon class="cursor-pointer interactive-icon" @click="handleSelect">
<FolderOpened />
</el-icon>
</template>
<el-input v-model="formData.projectName" :placeholder="t('committeeReview.form.inputPlaceholder')">
<!-- <template #append>-->
<!-- <el-icon class="cursor-pointer interactive-icon" @click="handleSelect">-->
<!-- <FolderOpened />-->
<!-- </el-icon>-->
<!-- </template>-->
</el-input>
</el-form-item>
</el-col>
@@ -177,10 +177,10 @@
@select="handleProjectSelect"
/>
<LibrarySelect
v-model="librarySelectVisible"
@select="handleLibrarySelect"
/>
<!-- <LibrarySelect-->
<!-- v-model="librarySelectVisible"-->
<!-- @select="handleLibrarySelect"-->
<!-- />-->
<templet-table-comom/>
</div>
</template>

View File

@@ -27,15 +27,12 @@
<!-- 标题描述上传附件 -->
<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"
@@ -44,8 +41,7 @@
</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>
@@ -207,51 +203,40 @@ 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().catch(() => false);
if (!headerValid) return;
const valid = await formDataRef.value?.validateForm().catch(() => false);
if (!valid) return;
const headerValid = await headerFormRef.value?.validate();
const valid = await formDataRef.value?.validateForm();
if (!valid && !headerValid) return;
submitLoading.value = true;
let flowIdKey = ''
const data = await investmentProjectsPlanUserDeptBelong()
@@ -311,13 +296,9 @@ const handleInitiateApproval = async () => {
const saveLoading = ref<boolean>(false);
const handleSaveDraft = async () => {
try {
const headerValid = await headerFormRef.value?.validate().catch(() => false);
if (!headerValid) return;
const valid = await formDataRef.value?.validateForm().catch(() => false);
if (!valid) return;
const headerValid = await headerFormRef.value?.validate();
const valid = await formDataRef.value?.validateForm();
if (!valid && !headerValid) return;
saveLoading.value = true;
const flowName = props.isUpdate ? 'investmentPlanUpdates' : 'investmentPlanRegistration';
const flowNameObj = flowNameOptions.filter(item => item.label === flowName)[0]
@@ -345,9 +326,6 @@ const handleSaveDraft = async () => {
saveLoading.value = false;
message.error(err.msg);
});
} catch (error) {
console.log(error, 'error');
}
};
const handleLoadTemplate = () => {

View File

@@ -27,19 +27,15 @@
<!-- 标题描述上传附件 -->
<el-row class="mb10">
<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 :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-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>
@@ -50,7 +46,7 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
import ProjectProgressReportForm from '/@/components/investment/common/ProjectProgressReportForm.vue';
@@ -68,10 +64,6 @@ 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: '',
@@ -111,7 +103,6 @@ const formData = reactive<InvestmentProjectProgress>({
delFlag: '',
processInstanceId: '',
status: '',
deptId: '',
});
// 必填规则
const requiredRule = [{ required: true, message: `${t('该字段必填')}` }];
@@ -127,10 +118,6 @@ 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 = '';
@@ -152,14 +139,10 @@ const handleInitiateApproval = async () => {
flowIdKey = 'VITE_FLOWID_31';
}
headerForm.attachments = JSON.stringify(headerForm.attachments);
const flowResult = await flowFn(flowIdKey, {
const {processInstanceId} = 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,
@@ -171,6 +154,7 @@ const handleInitiateApproval = async () => {
valid.processInstanceId = processInstanceId;
valid.supportingDocuments = JSON.stringify(valid.supportingDocuments);
valid.status = 1;
valid.flowType = flowNameObj.value
await addInvestmentProjectsProgressAPI(valid).then(()=>{
message.success(t('common.success'));
}).finally(()=>{

View File

@@ -37,8 +37,7 @@ 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,9 +26,8 @@
</el-row>
<el-row class="mb10">
<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-form :model="headerForm" label-width="80px" class="w-full">
<el-form-item :label="t('projectExitFeedback.headerForm.title')">
<el-input v-model="headerForm.title"
:placeholder="t('projectExitFeedback.headerForm.titlePlaceholder')" />
</el-form-item>
@@ -37,8 +36,7 @@
: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>
@@ -49,13 +47,12 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { reactive } 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";
@@ -63,10 +60,6 @@ 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: '',
@@ -77,21 +70,16 @@ 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 flowResult = await flowFn('VITE_FLOWID_36', {
const {processInstanceId} = await flowFn('VITE_FLOWID_36',{
paramMap:{
// miu0ilc1tfa61_assignee_select: [
// {
@@ -103,11 +91,6 @@ 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,
@@ -118,7 +101,7 @@ const handleInitiateApproval = async () => {
})
formData.value.processInstanceId = processInstanceId;
const exitAttachment = JSON.stringify(formData.value.exitAttachment);
const params = { ...formData.value, exitAttachment } as ProjectTask;
const params = { ...formData.value, exitAttachment }
addProjectExitPlanFeedback(params).then(()=>{
message.success(t('common.success'));
}).catch((err: any) => {

View File

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

View File

@@ -26,9 +26,8 @@
</el-row>
<el-row class="mb10">
<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-form :model="headerForm" label-width="80px" class="w-full">
<el-form-item :label="t('projectExitPlan.headerForm.title')">
<el-input v-model="headerForm.title"
:placeholder="t('projectExitPlan.headerForm.titlePlaceholder')" />
</el-form-item>
@@ -37,8 +36,7 @@
: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>
@@ -49,7 +47,7 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
@@ -65,10 +63,6 @@ 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: '',
@@ -84,7 +78,6 @@ 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>>({
@@ -94,16 +87,12 @@ 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 flowResult = await flowFn(folowIdKey, {
const {processInstanceId} = await flowFn(folowIdKey,{
paramMap:{
// miu0ilc1tfa61_assignee_select: [
// {
@@ -115,11 +104,6 @@ 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,

View File

@@ -774,7 +774,7 @@ onMounted(() => {
const projectMainEntityOptions = ref([]);
const getDeptTree = async () => {
const res = await selectTreeCompanyTree();
projectMainEntityOptions.value = res.data || [];
projectMainEntityOptions.value = res.data?.filter((item:any) => item.id !== '-7283586818552608318');
};
getDeptTree()
watch(editId, (id) => {

View File

@@ -149,16 +149,6 @@
</el-select>
</template>
</el-table-column>
<el-table-column v-if="isUpdate" prop="expertStatus" min-width="120" :label="t('expertApply.table.expertStatus')">
<template #default="scope">
<el-select v-model="scope.row.expertStatus" :placeholder="t('expertApply.table.selectPlaceholder')"
style="width: 100%;">
<el-option :label="t('expertApply.expertStatusOptions.normal')" value="normal" />
<el-option :label="t('expertApply.expertStatusOptions.invalid')" value="invalid" />
</el-select>
</template>
</el-table-column>
</el-table>
<!-- 选择专家弹窗 -->
<SelectExpertDialog v-model:visible="expertDialogVisible" @confirm="onExpertSelected" />
@@ -230,7 +220,6 @@ const createEmptyExpert = () => ({
attachments: '',
evidences: '',
level: '',
expertStatus: 'normal',
externalStatus: '',
attachmentUrl: '',
testimonyMaterials: '',
@@ -267,7 +256,6 @@ const onExpertSelected = (row: any) => {
target.professionalTitle = row?.professionalTitle ?? target.professionalTitle;
target.workUnit = row?.workUnit ?? target.workUnit;
target.level = row?.level ?? target.level;
target.expertStatus = row?.expertStatus ?? target.expertStatus;
target.attachments = row?.attachmentUrl ? JSON.parse(row.attachmentUrl) : []
target.evidences = row?.testimonyMaterials ? JSON.parse(row.testimonyMaterials) : []
};
@@ -312,7 +300,6 @@ const toSubmitExpert = (expert: ReturnType<typeof createEmptyExpert>) => ({
attachmentUrl: JSON.stringify(expert.attachments),
testimonyMaterials: JSON.stringify(expert.evidences),
level: expert.level || '',
expertStatus: expert.expertStatus || 'normal',
externalStatus: expert.externalStatus || '',
createBy: expert.createBy || '',
createTime: expert.createTime || '',
@@ -460,7 +447,6 @@ watch(()=>tempId.value,()=>{
professionalTitle: item.professionalTitle,
workUnit: item.workUnit,
level: item.level,
expertStatus: item.expertStatus || 'normal',
attachments: item.attachmentUrl ? JSON.parse(item.attachmentUrl) : [],
evidences: item.testimonyMaterials ? JSON.parse(item.testimonyMaterials) : []
}

View File

@@ -26,7 +26,7 @@
<el-table-column :label="t('expertLibrary.table.level')" prop="level" min-width="100"
show-overflow-tooltip>
<template #default="{ row }">
<span>{{ levelLabel(row.level) }}</span>
<span>{{ level.find((item:any) => item.value === row.level)?.label || '--' }}</span>
</template>
</el-table-column>
<el-table-column :label="t('expertLibrary.table.status')" prop="externalStatus" min-width="120"
@@ -60,6 +60,7 @@ import ExpertDetailDialog from '/@/components/investment/ExpertDetailDialog.vue'
import { useUserInfo } from '/@/stores/userInfo';
import { dayjs } from 'element-plus';
import FlowFormView from '/@/components/workbench/common/FlowFormView.vue';
import {level} from "/@/hooks/enums";
const { t } = useI18n();
const route = useRoute()

View File

@@ -179,46 +179,16 @@ const detailMeta = reactive({
date: new Date().toISOString().slice(0, 10),
});
const handleView = (row: any) => {
// 解析附件,支持对象数组和字符串数组两种格式
let attachmentUrl: any[] = [];
try {
attachmentUrl = row.attachmentUrl ? JSON.parse(row.attachmentUrl) : [];
} catch {
attachmentUrl = [];
}
const attachments = attachmentUrl.map((item: any) => {
// 如果已经是对象格式 { name, url },直接使用
if (typeof item === 'object' && item !== null) {
return { url: item.url || '', name: item.name || '' };
}
// 如果是字符串格式,尝试从 URL 中提取文件名
if (typeof item === 'string') {
const fileName = item.split('fileName=')[1] || item.split('/').pop() || '附件';
return { url: item, name: fileName };
}
return { url: '', name: '' };
});
// 解析佐证材料,支持对象数组和字符串数组两种格式
let testimonyMaterials: any[] = [];
try {
testimonyMaterials = row.testimonyMaterials ? JSON.parse(row.testimonyMaterials) : [];
} catch {
testimonyMaterials = [];
}
const evidences = testimonyMaterials.map((item: any) => {
// 如果已经是对象格式 { name, url },直接使用
if (typeof item === 'object' && item !== null) {
return { url: item.url || '', name: item.name || '' };
}
// 如果是字符串格式,尝试从 URL 中提取文件名
if (typeof item === 'string') {
const fileName = item.split('fileName=')[1] || item.split('/').pop() || '佐证材料';
return { url: item, name: fileName };
}
return { url: '', name: '' };
});
// 转换为详情组件需要的格式
const attachmentUrl = row.attachmentUrl ? JSON.parse(row.attachmentUrl) : []
const attachments = attachmentUrl.map((url: string) => {
return { url, name: url.split('fileName=')[1] }
})
// 转换为详情组件需要的格式
const testimonyMaterials = row.testimonyMaterials ? JSON.parse(row.testimonyMaterials) : []
const evidences = testimonyMaterials.map((url: string) => {
return { url, name: url.split('fileName=')[1] }
})
currentDetail.value = { ...row,
attachments,
evidences,

View File

@@ -109,14 +109,9 @@ export default {
attachments: 'Attachments',
evidences: 'Supporting Materials',
level: 'Level',
expertStatus: 'Expert Status',
inputPlaceholder: 'Please enter',
selectPlaceholder: 'Please select',
},
expertStatusOptions: {
normal: 'Normal',
invalid: 'Invalid',
},
},
expertLibrary: {
title: 'Expert Repository',

View File

@@ -109,14 +109,9 @@ export default {
attachments: '附件',
evidences: '佐证材料',
level: '级别',
expertStatus: '专家状态',
inputPlaceholder: '请输入',
selectPlaceholder: '请选择',
},
expertStatusOptions: {
normal: '正常',
invalid: '作废',
},
},
expertLibrary: {
title: '专家智库',

View File

@@ -138,7 +138,7 @@ const instructionFields = computed<Array<{ key: InstructionFieldKey; label: stri
const basicInfoFields = computed<Array<{ key: BasicFieldKey; label: string }>>(() => [
{key: 'groupBelonging', label: t('mixedRegister.basicFields.groupName')},
{key: 'projectYear', label: t('mixedRegister.basicFields.year')},
{key: 'projectYear', label: t('mixedRegister.basicFields.year'),type:'number',length:4},
{key: 'projectName', label: t('mixedRegister.basicFields.projectName')},
{key: 'implementEnterprise', label: t('mixedRegister.basicFields.companyFullName')},
{key: 'enterpriseCreditCode', label: t('mixedRegister.basicFields.creditCode')},

View File

@@ -57,11 +57,11 @@
min-width="180" />
<el-table-column prop="status" :label="t('workbenchPage.pending.table.status')" min-width="140">
<template #default="scope">
<el-tag v-if="scope.row.status == 1" type="primary">待审批</el-tag>
<el-tag v-if="scope.row.status == 1" type="primary">进行中</el-tag>
<el-tag v-else type="success">已结束</el-tag>
</template>
</el-table-column>
<el-table-column :label="t('workbenchPage.pending.table.actions')" width="120" fixed="right">
<el-table-column label="查看" width="120" fixed="right">
<template #default="{ row }">
<el-button link type="primary" @click="handleView(row)">
{{ t('workbenchPage.pending.actions.view') }}
@@ -75,6 +75,27 @@
<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination"></pagination>
</el-card>
</div>
<!-- <el-dialog v-model="visible" width="80%" title="流程节点">-->
<!-- <flow-node-format :selectUserNodeId="flowUserData.root.map(item => item.id)" :flow-id="flowIdCon" ref="flowNodeFormatRef"></flow-node-format>-->
<!-- </el-dialog>-->
<!-- v-if="visible" 确保关闭时销毁组件 -->
<el-drawer v-model="visible" v-if="visible" direction="rtl" size="600px">
<template #header>
<h3>{{ currentData?.name }}</h3>
</template>
<template #default>
<el-card class="box-card">
<FormCreate :rule="rule" v-model="formData" v-model:api="fApi" />
</el-card>
<flow-node-format
:disableSelect="true"
:processInstanceId="currentData.processInstanceId"
:flow-id="currentData.flowId"
ref="flowNodeFormatRef"
:disabled="true"
></flow-node-format>
</template>
</el-drawer>
</div>
</template>
@@ -86,13 +107,15 @@ import { queryMineStarted } from '/@/api/flow/task';
import { BasicTableProps, useTable } from '/@/hooks/table';
import { useUserInfo } from '/@/stores/userInfo';
import { flowNameOptions } from '/@/hooks/enums';
import { getProcessInfoByIdAPI } from '/@/api/workbench/miOwLibr/ownershipCreate';
import FlowNodeFormat from "/@/views/flow/form/tools/FlowNodeFormatData.vue";
import FormCreate from "/@/views/flow/workflow/components/FormCreate.vue";
const { t } = useI18n();
const message = useMessage();
const loading = ref(false);
const stores = useUserInfo();
const { userInfos } = storeToRefs(stores);
const state: BasicTableProps = reactive<BasicTableProps>({
pageList: queryMineStarted,
queryForm: {
@@ -117,9 +140,18 @@ const handleSearch = () => {
state.queryForm.title = keyword.value
getDataList(true)
};
const currentData = ref<any>(null);
const visible = ref(false);
/**查看流程*/
const handleView = (row: any) => {
message.info(`${row.title} ${t('workbenchPage.pending.messages.viewPlaceholder')}`);
getProcessInfoByIdAPI(row.id).then(res =>{
currentData.value = {
name: res.data.name,
processInstanceId: res.data.processInstanceId,
flowId: res.data.flowId
}
visible.value = true
})
};
const handleReview = (row: any) => {

View File

@@ -57,34 +57,6 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
open: env.VITE_OPEN === 'true', // 是否自动打开浏览器
hmr: true, // 启用热更新
proxy: {
'/api/auth': {
target: env.VITE_ADMIN_PROXY_PATH, // 目标服务器地址
ws: true, // 是否启用 WebSocket
changeOrigin: true, // 是否修改请求头中的 Origin 字段
rewrite: (path) => path.replace(/^\/api\/auth/, '/admin'),
configure: (proxy, options) => {
proxy.on('proxyReq', (proxyReq, req, res) => {
console.log('代理请求admin:', req.url, '->', options.target + req.url);
});
proxy.on('proxyRes', (proxyRes, req, res) => {
console.log('代理响应admin:', req.url, '状态:', proxyRes.statusCode);
});
},
},
'/api/task': {
target: env.VITE_ADMIN_PROXY_PATH, // 目标服务器地址
ws: true, // 是否启用 WebSocket
changeOrigin: true, // 是否修改请求头中的 Origin 字段
rewrite: (path) => path.replace(/^\/api\/task/, '/admin'),
configure: (proxy, options) => {
proxy.on('proxyReq', (proxyReq, req, res) => {
console.log('代理请求task:', req.url, '->', options.target + req.url);
});
proxy.on('proxyRes', (proxyRes, req, res) => {
console.log('代理响应task:', req.url, '状态:', proxyRes.statusCode);
});
},
},
'/api': {
target: env.VITE_ADMIN_PROXY_PATH, // 目标服务器地址
ws: true, // 是否启用 WebSocket