Bladeren bron

fix: bug

master
yxhc 4 weken geleden
bovenliggende
commit
1e0fdaab2c
7 gewijzigde bestanden met toevoegingen van 558 en 198 verwijderingen
  1. +2
    -0
      src/http/apis/declareMange/index.js
  2. +93
    -124
      src/pages/declareManage/projectDeclare/declarePage/components/basicInfo.vue
  3. +284
    -0
      src/pages/declareManage/projectDeclare/declarePage/components/plannedUseResources.vue
  4. +21
    -2
      src/pages/declareManage/projectDeclare/declarePage/index.vue
  5. +29
    -6
      src/pages/declareManage/projectDeclare/index.vue
  6. +3
    -3
      src/pages/projectCollection/projectCollectionEnter/components/projectContentDialog.vue
  7. +126
    -63
      src/pages/projectStoreManage/projectStore/projectDetail/components/basicInfo.vue

+ 2
- 0
src/http/apis/declareMange/index.js Bestand weergeven

@@ -37,6 +37,8 @@ const exportList = {
export const declareExport = (state, params) =>
http.get(exportList[state], { params, responseType: 'blob' }) // 导出列表

export const firstCreatProjectEdit = (userId) => http.post(`/api/v1/user-info/first-creat-project-edit/${userId}`)

const projectStartList = {
1: '/api/v1/declared/start', // 项目申报-新增
2: '/api/v1/declared/restart' // 重新申报


+ 93
- 124
src/pages/declareManage/projectDeclare/declarePage/components/basicInfo.vue Bestand weergeven

@@ -1,7 +1,14 @@
<script name="basicInfo" setup>
import { nextTick, reactive, ref, onMounted, watch } from 'vue'
import store from '@/store'
import { fileFormatVerification, handleFileSuccess, handleFilePreview, handleFileError, reviewFileParam, fileTypes } from '@/utils/uploadAction.js'
import {
fileFormatVerification,
handleFileSuccess,
handleFilePreview,
handleFileError,
reviewFileParam,
fileTypes
} from '@/utils/uploadAction.js'
import { storeToRefs } from 'pinia'
import { useRoute } from 'vue-router'
import { govStripList } from '@/http/apis/declareMange'
@@ -11,6 +18,7 @@ import RelatedProjectDialog from '@/pages/projectCollection/projectCollectionEnt
import ProjectContentDialog from '@/pages/projectCollection/projectCollectionEnter/components/projectContentDialog.vue'
import { getOrganizationByCode } from '@/http/apis/commonApi'
import { templateTypePage } from '@/http/apis/performanceEvaluation/indicatorTemplate'

const props = defineProps({
detailData: {
type: Object,
@@ -26,11 +34,7 @@ const props = defineProps({
type: Number
}
})
const {
fourSystem,
businessTerritory
// projectConTypeOptions
} = store.dictStore.globalDicts || {},
const
route = useRoute(),
uploadUrl = store.dictStore.uploadUrl,
userInfo = storeToRefs(store.userStore).userInfo || {},
@@ -81,9 +85,9 @@ const {
{ required: true, message: '请选择是否首次新建', trigger: 'change' }
],

isInnovateWholeProvinceShare: [
{ required: true, message: '请选择是否为一地创新全省共享项目', trigger: 'change' }
],
// isInnovateWholeProvinceShare: [
// { required: true, message: '请选择是否为一地创新全省共享项目', trigger: 'change' }
// ],
isTemporaryAugment: [
{ required: true, message: '请选择是否为临时增补', trigger: 'change' }
],
@@ -120,18 +124,7 @@ const {
{ required: true, message: '请选择上级主管单位', trigger: 'change' }
],
buildDuration: [{ required: true, message: '请选择建设起止年限', trigger: 'change' }],
fourSystems: [{ required: true, message: '请选择四大体系', trigger: 'change' }],
templateType: [{ required: true, message: '请选择绩效评价类型', trigger: 'change' }],
isDigitalReform: [
{
required: true,
message: '请选择是否数字化改革项目',
trigger: 'change'
}
],
bizDomain: [
{ required: true, message: '请选择综合业务领域', trigger: 'change' }
],
buildLevel: [{ required: true, message: '请选择建设层级', trigger: 'change' }],
lowestLevel: [{ required: true, message: '请选择贯通层级', trigger: 'change' }],
baseProjBasis: [{ required: true, message: '请选择立项依据', trigger: 'change' }],
@@ -140,12 +133,14 @@ const {
financialCode: [{ required: true, message: '请填写财政编码', trigger: 'blur' }],
isCloud: [{ required: true, message: '请选择是否上云', trigger: 'change' }],
cloudType: [{ required: true, message: '请选择云类型', trigger: 'change' }],
systemPosition: [{ required: true, message: '请输入系统定位', trigger: 'blur' }],
projectIntroduction: [{ required: true, message: '请输入项目简介', trigger: 'blur' }],
projectOverview: [{ required: true, message: '请输入项目概述', trigger: 'blur' }],
baseHistorProjs: [{ required: true, message: '请至少关联一个历年项目' }],
beseExpectedResults: [{ required: true, message: '请至少添加一个项目内容与预期成效' }],
projectYear: [{ required: true, message: '请选择预算年度' }],
declareAmount: [{ required: true, message: '请输入申报金额', trigger: 'blur' }, { validator: moneyValidator, trigger: 'blur' }],
declareAmount: [{ required: true, message: '请输入申报金额', trigger: 'blur' }, {
validator: moneyValidator,
trigger: 'blur'
}],
annualPlanAmount: [
{ required: true, message: '请输入年度支付金额', trigger: 'blur' },
{ validator: moneyValidator, trigger: 'blur' }
@@ -234,7 +229,7 @@ const {
projectType: data.projectType,
isFirst: data.isFirst,
baseConstructionType: data?.baseConstructionType?.split(';') || undefined,
isInnovateWholeProvinceShare: data.isInnovateWholeProvinceShare,
// isInnovateWholeProvinceShare: data.isInnovateWholeProvinceShare,
isTemporaryAugment: data.isTemporaryAugment,
responsibleMan: data.responsibleMan,
responsibleManMobile: data.responsibleManMobile,
@@ -249,10 +244,7 @@ const {
higherSuperOrgCode: data.higherSuperOrgCode,
higherSuperOrg: data.higherSuperOrg,
buildDuration: data.beginTime && data.endTime ? [data.beginTime, data.endTime] : [],
fourSystems: data.fourSystems,
templateType: data.templateType,
isDigitalReform: data.isDigitalReform,
bizDomain: data.bizDomain && data.isDigitalReform === 1 ? data.bizDomain.split(',') : undefined,
buildLevel: data.buildLevel,
lowestLevel: data.lowestLevel,
buildBasis: undefined,
@@ -268,9 +260,7 @@ const {
baseBasisEstablish: data.baseBasisEstablish || '',
developCode: data.developCode,
financialCode: data.financialCode,
isCloud: data.isCloud,
cloudType: data.cloudType && data.cloudType.split(',') || [],
systemPosition: data.systemPosition,
projectOverview: data.projectOverview,
projectIntroduction: data.projectIntroduction,
baseHistorProjs: data?.baseHistorProjId?.split(';').map((i, k) => {
return {
@@ -526,9 +516,6 @@ onMounted(() => {
getCode('orgCreditCode')
})
watch(() => props.declareAmount, val => {
if (val >= 1000) {
formData.value.isDigitalReform = 1
}
})

defineExpose({ validForm, formData, setFormData })
@@ -577,7 +564,10 @@ watch(() => formData.value, val => {
</el-col>
<el-col :span="12">
<el-form-item label="项目类型" prop="projectType">
<el-radio-group v-model="formData.projectType" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio-group
v-model="formData.projectType"
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
>
<el-radio label="01">首次建设</el-radio>
<el-radio label="02">迭代升级</el-radio>
</el-radio-group>
@@ -586,30 +576,42 @@ watch(() => formData.value, val => {
<el-col :span="12">
<el-form-item label="内容类别" prop="baseConstructionType">
<el-checkbox-group v-model="formData.baseConstructionType">
<el-checkbox v-for="(item,index) in dictionaryList?.filter(i => i.type === 'CONTENT_TYPE')" :key="index" :label="item.value">{{ item.label }}</el-checkbox>
<el-checkbox
v-for="(item,index) in dictionaryList?.filter(i => i.type === 'CONTENT_TYPE')"
:key="index"
:label="item.value"
>{{ item.label }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<template v-if="formData.baseProjIsConfidentiality==='01'">
<el-col :span="12">
<el-form-item label="是否首次新建" prop="isFirst">
<el-radio-group v-model="formData.isFirst" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" @change="changeIsFirst">
<el-radio-group
v-model="formData.isFirst"
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
@change="changeIsFirst"
>
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否一地创新全省共享项目" label-width="auto" prop="isInnovateWholeProvinceShare">
<el-radio-group v-model="formData.isInnovateWholeProvinceShare" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio :label="true">是</el-radio>
<el-radio :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="是否一地创新全省共享项目" label-width="auto" prop="isInnovateWholeProvinceShare">-->
<!-- <el-radio-group v-model="formData.isInnovateWholeProvinceShare" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">-->
<!-- <el-radio :label="true">是</el-radio>-->
<!-- <el-radio :label="false">否</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col v-if="route.name!='planEdit'" :span="12">
<el-form-item label="是否临时增补" prop="isTemporaryAugment">
<el-radio-group v-model="formData.isTemporaryAugment" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio-group
v-model="formData.isTemporaryAugment"
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
>
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
@@ -690,7 +692,11 @@ watch(() => formData.value, val => {
</el-col>
<el-col :span="12">
<el-form-item label="上级主管单位类型" prop="baseProvManDeprtType">
<el-radio-group v-model="formData.baseProvManDeprtType" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" @change="changeBaseProvManDeprtType">
<el-radio-group
v-model="formData.baseProvManDeprtType"
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
@change="changeBaseProvManDeprtType"
>
<el-radio label="1">省级</el-radio>
<el-radio label="2">非省级</el-radio>
</el-radio-group>
@@ -698,7 +704,11 @@ watch(() => formData.value, val => {
</el-col>
<el-col :span="12">
<el-form-item label="上级主管单位" prop="higherSuperOrg">
<el-input v-if="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" v-model="formData.higherSuperOrg" disabled />
<el-input
v-if="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
v-model="formData.higherSuperOrg"
disabled
/>
<el-input
v-else-if="formData.baseProvManDeprtType==='1'"
v-model="formData.higherSuperOrg"
@@ -717,7 +727,11 @@ watch(() => formData.value, val => {
</el-col>
<el-col :span="12">
<el-form-item label="本级主管单位" prop="superOrg">
<el-input v-if="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" v-model="formData.superOrg" disabled />
<el-input
v-if="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
v-model="formData.superOrg"
disabled
/>
<el-input
v-else
v-model="formData.superOrg"
@@ -731,20 +745,20 @@ watch(() => formData.value, val => {
</el-col>
<el-col :span="12">
<el-form-item label="本级主管单位统一社会信用代码" prop="superOrgCreditCode">
<el-input v-model="formData.superOrgCreditCode" placeholder="请填写" :disabled="isDisabledCreditCode['superOrgCreditCode']||$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" />
<el-input
v-model="formData.superOrgCreditCode"
placeholder="请填写"
:disabled="isDisabledCreditCode['superOrgCreditCode']||$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
/>
</el-form-item>
</el-col>
<template v-if="formData.baseProjIsConfidentiality==='01'">
<el-col :span="24">
<el-form-item label="四大体系" prop="fourSystems">
<el-radio-group v-model="formData.fourSystems" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio v-for="(v,k) in fourSystem" :key="k" :label="k*1">{{ v }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="绩效评价类型" prop="templateType">
<el-radio-group v-model="formData.templateType" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio-group
v-model="formData.templateType"
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
>
<el-radio
v-for="(v,k) in templateTypeListData"
:key="k"
@@ -755,32 +769,6 @@ watch(() => formData.value, val => {
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否数字化改革项目" prop="isDigitalReform">
<el-radio-group v-model="formData.isDigitalReform" :disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="formData.isDigitalReform === 1" label="综合业务领域" prop="bizDomain">
<el-select
v-model="formData.bizDomain"
placeholder="请选择"
class="w-full"
multiple
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)"
>
<el-option
v-for="(v, k) in businessTerritory"
:key="k"
:label="v"
:value="k"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="建设层级" prop="buildLevel">
<el-radio-group v-model="formData.buildLevel">
@@ -793,7 +781,10 @@ watch(() => formData.value, val => {
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="!(formData?.baseConstructionType?.includes('03')&&!formData?.baseConstructionType?.includes('01'))" :span="24">
<el-col
v-if="!(formData?.baseConstructionType?.includes('03')&&!formData?.baseConstructionType?.includes('01'))"
:span="24"
>
<el-form-item v-if="formData?.baseConstructionType?.includes('01')" label="贯通层级" prop="lowestLevel">
<el-radio-group v-model="formData.lowestLevel">
<el-radio
@@ -826,7 +817,9 @@ watch(() => formData.value, val => {
@selection-change="selectionChange"
>
<template #fileName="{scope}">
<el-form-item v-if="formData.baseProjBasis&&formData.baseProjBasis.map(i=>i.value).includes(scope.row.value)">
<el-form-item
v-if="formData.baseProjBasis&&formData.baseProjBasis.map(i=>i.value).includes(scope.row.value)"
>
<el-input
:value="formData.baseProjBasis[formData.baseProjBasis.findIndex(i=>i.value===scope.row.value)]?.fileList?.[0]?.name"
placeholder="请输入"
@@ -917,38 +910,9 @@ watch(() => formData.value, val => {
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="是否上云" prop="isCloud">
<el-radio-group v-model="formData.isCloud">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="formData.isCloud===1" :span="24">
<el-form-item label="云类型" prop="cloudType">
<el-checkbox-group v-model="formData.cloudType">
<el-checkbox label="1">政务云(非信创)</el-checkbox>
<el-checkbox label="2">政务云(信创)</el-checkbox>
<el-checkbox label="3">其他</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="系统定位" prop="systemPosition">
<el-form-item label="项目概述" prop="projectOverview">
<el-input
v-model="formData.systemPosition"
:rows="4"
type="textarea"
placeholder="请输入"
show-word-limit
maxlength="2000"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目简介" prop="projectIntroduction">
<el-input
v-model="formData.projectIntroduction"
v-model="formData.projectOverview"
:rows="4"
type="textarea"
placeholder="请输入"
@@ -991,7 +955,7 @@ watch(() => formData.value, val => {
</table-list>
</el-form-item>
</el-col>
<el-col :span="24">
<el-col v-if="($route.name==='declarePlan')||([10012,10016,10013].includes(detailData.status))" :span="24">
<el-form-item label="项目内容与预期成效" prop="beseExpectedResults">
<table-list
:pagination="false"
@@ -1012,7 +976,8 @@ watch(() => formData.value, val => {
plain
icon="Plus"
@click="()=>showProjectContentDialog()"
>添加</el-button>
>添加
</el-button>
</p>
</el-form-item>
</el-col>
@@ -1095,10 +1060,12 @@ watch(() => formData.value, val => {
<el-button
type="primary"
@click="getTableData"
>查询</el-button>
>查询
</el-button>
<el-button
@click="reset"
>重置</el-button>
>重置
</el-button>
</div>
</el-form-item>
</el-col>
@@ -1146,14 +1113,16 @@ watch(() => formData.value, val => {
</template>

<style lang="less">
.el-upload-list{
.el-upload-list {
width: 100%;
}
.basicUploadItem{
.el-upload-list__item-file-name{

.basicUploadItem {
.el-upload-list__item-file-name {
white-space: pre-wrap;
}
.el-form-item__error{

.el-form-item__error {
top: 60%;
width: 100%;
text-align: center;


+ 284
- 0
src/pages/declareManage/projectDeclare/declarePage/components/plannedUseResources.vue Bestand weergeven

@@ -0,0 +1,284 @@
<template>

<el-form
ref="ruleFormRef"
:model="formData"
label-position="right"
label-width="180px"
label-suffix=":"
scroll-to-error
:rules="rules"
:validate-on-rule-change="false"
>
<el-form-item label="移动端入口" prop="mobileTerminalEntry">
<el-checkbox-group v-model="formData.mobileTerminalEntry">
<el-checkbox
v-for="item in mobileType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-checkbox-group>
</el-form-item>

<el-form-item label="是否使用云资源">
<el-switch
v-model="formData.isCloudResource"
active-value="1"
inactive-value="0"
/>
</el-form-item>
<el-form-item v-if="formData.isCloudResource==='1'" prop="cloudResource">
<el-table :data="formData.cloudResource" style="width: 100%">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="state" label="*云资源类型">
<template #default="scope">
<el-form-item
:prop="`cloudResource[${scope.$index}].cloudResourceType`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.cloudResource[scope.$index].cloudResourceType"
placeholder="云资源类型"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="city" label="*基础规格">
<template #default="scope">
<el-form-item
:prop="`cloudResource[${scope.$index}].baseSpecification`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.cloudResource[scope.$index].baseSpecification"
placeholder="基础规格"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="address" label="*台数">
<template #default="scope">
<el-form-item
:prop="`cloudResource[${scope.$index}].serversCount`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.cloudResource[scope.$index].serversCount"
placeholder="台数"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="zip" label="描述">
<template #default="scope">
<el-form-item>
<el-input
v-model="formData.cloudResource[scope.$index].description"
placeholder="描述"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作">
<template #default="scope">
<el-button link type="primary" @click="formData.cloudResource.splice(scope.$index,1)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="primary"
plain
icon="Plus"
class="w-full mb-8"
@click="formData.cloudResource.push({})"
>添加云资源
</el-button>
</el-form-item>

<el-form-item label="是否产生数据">
<el-switch
v-model="formData.isProduceData"
active-value="1"
inactive-value="0"
/>
</el-form-item>

<el-form-item v-if="formData.isProduceData==='1'" prop="isProduceData">
<el-table :data="formData.produceData" style="width: 100%">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="state" label="*数据目录名称">
<template #default="scope">
<el-form-item
:prop="`produceData[${scope.$index}].dataDirectoryName`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.produceData[scope.$index].dataDirectoryName"
placeholder="数据目录名称"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="city" label="*数据项">
<template #default="scope">
<el-form-item
:prop="`produceData[${scope.$index}].dataItem`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.produceData[scope.$index].dataItem"
placeholder="数据项"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作">
<template #default="scope">
<el-button link type="primary" @click="formData.produceData.splice(scope.$index,1)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="primary"
plain
icon="Plus"
class="w-full mb-8"
@click="formData.produceData.push({})"
>添加数据项
</el-button>
</el-form-item>

<el-form-item label="是否使用公共组件">
<el-switch
v-model="formData.isCommonComponent"
active-value="1"
inactive-value="0"
/>
</el-form-item>

<el-form-item v-if="formData.isCommonComponent==='1'" prop="isProduceData">
<el-table :data="formData.commonComponent" style="width: 100%">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="state" label="*公告组件名称">
<template #default="scope">
<el-form-item
:prop="`commonComponent[${scope.$index}].componentName`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.commonComponent[scope.$index].componentName"
placeholder="数据目录名称"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="city" label="*公共组件类型">
<template #default="scope">
<el-form-item
:prop="`commonComponent[${scope.$index}].componentType`"
:rules="[{required:true,message:''}]"
>
<el-input
v-model="formData.commonComponent[scope.$index].componentType"
placeholder="数据项"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作">
<template #default="scope">
<el-button link type="primary" @click="formData.commonComponent.splice(scope.$index,1)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button
type="primary"
plain
icon="Plus"
class="w-full mb-8"
@click="formData.commonComponent.push({})"
>添加组件
</el-button>
</el-form-item>

</el-form>
</template>
<script setup>
import { ref } from 'vue'

const ruleFormRef = ref()
const formData = ref({
mobileTerminalEntry: [],
cloudResource: [
{
cloudResourceType: '', // - 云资源类型
baseSpecification: '', // - 基础规格
serversCount: '', // - 台数
description: '' // - 描述
}
],
produceData: [
{
dataDirectoryName: '', // - 数据目录名称
dataItem: '' // - 数据项
}
],
commonComponent: [
{
componentName: '', // - 组件名称
componentType: '' // - 公共组件类型
}
],
isCloudResource: '0',
isProduceData: '0',
isCommonComponent: '0'
})
const rules = {
mobileTerminalEntry: [{ required: true, message: '请选择移动端入口' }],
cloudResource: [{ required: true, message: '请至少添加一个云资源' }],
produceData: [{ required: true, message: '请至少添加一个产生数据' }],
commonComponent: [{ required: true, message: '请至少添加一个公共组件' }]
}

function validForm (callback) {
ruleFormRef.value.validate(valid => {
callback(valid)
})
}

defineExpose({ validForm, formData })

// const submit = async (formEl) => {
// if (!formEl) return
// await formEl.validate((valid, fields) => {
// if (valid) {
// console.log('submit!')
// } else {
// console.log('error submit!', fields)
// }
// })
// }
const mobileType = ref([
{
label: '浙里办',
value: '1'
},
{
label: '浙政钉',
value: '2'
},
{
label: '其他',
value: '3'
},
{
label: '无移动端',
value: '4'
}
])

</script>
<style scoped lang="less">

</style>

+ 21
- 2
src/pages/declareManage/projectDeclare/declarePage/index.vue Bestand weergeven

@@ -5,6 +5,7 @@ import { useRoute, useRouter } from 'vue-router'
import { storeToRefs } from 'pinia'
import store from '@/store'
import BasicInfo from './components/basicInfo.vue'
import plannedUseResources from './components/plannedUseResources.vue'
import FundsInfo from './components/fundsInfo.vue'
import FundsAllocation from './components/fundsAllocation.vue'
import AnnualPaymentPlan from './components/annualPaymentPlan.vue'
@@ -34,6 +35,7 @@ const { proxy } = getCurrentInstance(),
formConfig = ref({}),
collapseModal = ref(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']),
basicInfoRef = ref(), // 基本信息
planndedUseResourcesRef = ref(), // 计划使用资源
fundsInfoRef = ref(), // 资金申报情况
fundsAllocationRef = ref(), // 资金分配情况
provincialExamineRef = ref(), // 重大项目省级联审
@@ -154,6 +156,11 @@ const { proxy } = getCurrentInstance(),
}
})
}))
planndedUseResourcesRef.value && form.push(new Promise((resolve, reject) => {
planndedUseResourcesRef.value.validForm((valid) => {
if (valid) resolve()
})
}))
}
Promise.all([...form]).then(async () => {
if (basicInfoRef.value.formData?.baseProjIsConfidentiality === '02') {
@@ -266,7 +273,8 @@ const { proxy } = getCurrentInstance(),
...basicInfoRef.value.formData,
...fundsInfoRef.value.formData,
...fundsAllocationRef.value.formData,
bizDomain: basicInfoRef.value.formData?.isDigitalReform === 1 ? basicInfoRef.value.formData.bizDomain.join(',') : undefined,
...planndedUseResourcesRef.value?.formData,
// bizDomain: basicInfoRef.value.formData?.isDigitalReform === 1 ? basicInfoRef.value.formData.bizDomain.join(',') : undefined,
baseConstructionType: basicInfoRef.value.formData?.baseConstructionType?.join(';') || '',
baseProvManDeprtType: basicInfoRef.value.formData.baseProvManDeprtType * 1 || undefined,
projectYear: fundsInfoRef.value.formData?.projectYear * 1,
@@ -277,7 +285,7 @@ const { proxy } = getCurrentInstance(),
// buildBasis: buildBasis && JSON.stringify(buildBasis),
baseProjBasis: basicInfoRef.value.formData?.baseProjBasis?.map(i => i.value)?.join(';') || undefined,
baseProjBasisFile: basicInfoRef.value.formData?.baseProjBasis?.map(i => i.fileList && JSON.stringify(changFilesParam(i.fileList)))?.join(';') || '',
cloudType: basicInfoRef.value.formData?.isCloud && basicInfoRef.value.formData?.cloudType?.length && basicInfoRef.value.formData.cloudType.join(',') || undefined,
// cloudType: basicInfoRef.value.formData?.isCloud && basicInfoRef.value.formData?.cloudType?.length && basicInfoRef.value.formData.cloudType.join(',') || undefined,
baseHistorProjId: basicInfoRef.value.formData?.baseHistorProjs?.map(i => i.baseProjId)?.join(';') || '',
baseHistorProjName: basicInfoRef.value.formData?.baseHistorProjs?.map(i => i.baseProjName)?.join(';') || '',
baseHistorProjYear: basicInfoRef.value.formData?.baseHistorProjs?.map(i => i.baseProjSetYear)?.join(';') || '',
@@ -606,6 +614,7 @@ onMounted(async () => {
<el-row>
<el-col class="leftCol" :span="24">
<el-collapse v-model="collapseModal">

<el-collapse-item name="1" class="mb-16">
<template #title>
<div class="collapse-title">基本信息</div>
@@ -748,8 +757,18 @@ onMounted(async () => {
<div class="p-24">
<applications ref="applicationsRef" :is-first="basicInfoRef?.formData?.isFirst" :core-business="coreBusinessRef?.formData?.coreBusiness" />
</div>

</el-collapse-item>
<el-collapse-item v-if="($route.name==='declarePlan')||([10012,10016,10013].includes(detailData.status))" name="1" class="mb-16">
<template #title>
<div class="collapse-title">计划使用资源</div>
</template>
<div class="p-24">
<planned-use-resources ref="planndedUseResourcesRef" />
</div>
</el-collapse-item>
</template>

</el-collapse>
</el-col>
</el-row>


+ 29
- 6
src/pages/declareManage/projectDeclare/index.vue Bestand weergeven

@@ -1,14 +1,17 @@
<script setup name = 'projectDeclare'>
<script setup name='projectDeclare'>
import { ref, reactive, h, onMounted, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { getProjectList, draftList, declareExport, removeProject } from '@/http/apis/declareMange'
import { getProjectList, draftList, declareExport, removeProject, firstCreatProjectEdit } from '@/http/apis/declareMange'
import store from '@/store'
import useExportExc from '@/utils/useExportExc'
import { ElMessageBox } from 'element-plus'

const {
statusOptionsCascader, statusOptions,
projectConTypeOptions
} = store.dictStore.globalDicts || {},
{ proxy } = getCurrentInstance(),
dialogVideVisible = ref(false),
// 搜索栏表单数据
searchForm = reactive({
stage: undefined,
@@ -195,7 +198,18 @@ const {
$router = useRouter(),
// 去项目申报页
toDeclarePage = () => {
$router.push({ name: 'declarePage' })
if (store.userStore.userInfo.isFirstCreateProject === 0) {
$router.push({ name: 'declarePage' })
return
}
ElMessageBox.alert('您是第一次使用项目申报,请先观看教学视频', {
showCancelButton: false
}).then(() => {
dialogVideVisible.value = true
// 请求接口
firstCreatProjectEdit(store.userStore.userInfo.userId)
store.userStore.userInfo.isFirstCreateProject = 0
})
},
tableListRef = ref(),
// 导出excel文件
@@ -394,13 +408,15 @@ onMounted(async () => {
plain
:loading="exportLoading"
@click="handleExcel"
>导出</el-button>
>导出
</el-button>
<el-button
type="primary"
size="small"
icon="plus"
@click="toDeclarePage"
>项目申报</el-button>
>项目申报
</el-button>
</div>
</div>
</template>
@@ -414,12 +430,19 @@ onMounted(async () => {
<template #action="{ scope }">
<a @click="checkDetail(scope.row)">详情</a>
<a v-if="!tabStatus" @click="editProject(scope.row)">编辑</a>
<a v-if="tabStatus && [10002,10005,10007,10013,20005].includes(scope.row.status)" @click="reDeclare(scope.row)">重新申报</a>
<a
v-if="tabStatus && [10002,10005,10007,10013,20005].includes(scope.row.status)"
@click="reDeclare(scope.row)"
>重新申报</a>
<a v-if="tabStatus && [10007].includes(scope.row.status)" @click="remove(scope.row)">删除</a>
</template>
</table-list>
</el-card>
</el-row>

<el-dialog v-model="dialogVideVisible" title="项目申报教学视频" width="800">
<video src="http://www.heletech.com.cn/img/%E5%AE%98%E7%BD%91%E4%BB%8B%E7%BB%8D.mp4" controls></video>
</el-dialog>
</template>
<style lang='less' scoped>



+ 3
- 3
src/pages/projectCollection/projectCollectionEnter/components/projectContentDialog.vue Bestand weergeven

@@ -11,7 +11,7 @@ const
data: Object
}),
form = ref({
perIndicator: []
perIndicator: [{}, {}, {}]
}),
formRef = ref(),
rules = {
@@ -76,7 +76,7 @@ watch(
} else {
formRef.value?.resetFields()
form.value = {
perIndicator: []
perIndicator: [{}, {}, {}]
}
}
}
@@ -186,7 +186,7 @@ watch(
</el-form-item>
</template>
<template #action="{scope}">
<a class="text-danger cursor-pointer" @click="del(scope.$index)">移除</a>
<a v-if="scope.$index>2" class="text-danger cursor-pointer" @click="del(scope.$index)">移除</a>
</template>
</table-list>
</el-form>


+ 126
- 63
src/pages/projectStoreManage/projectStore/projectDetail/components/basicInfo.vue Bestand weergeven

@@ -15,7 +15,24 @@ const props = defineProps({
default: () => []
}
})
const { statusOptions, cloudTypeOptions, fourSystem, businessTerritory, projectTypeOptions } = store.dictStore.globalDicts || {},

function getMobileText (list) {
if (list && list instanceof Array) {
const map = {
1: '浙里办',
2: '浙政钉',
3: '其他',
4: '无移动端'
}
const newlist = list.map(i => {
return map[i]
})
return newlist.join(',')
}
return '-'
}

const { statusOptions, projectTypeOptions } = store.dictStore.globalDicts || {},
column = reactive([
{
label: '序号',
@@ -89,102 +106,106 @@ watch(() => props.detailData, val => {
<template>
<el-descriptions :column="2" border>
<el-descriptions-item label="是否涉密">
{{ detailData.baseProjIsConfidentiality==='02'?'是':'否' }}
{{ detailData.baseProjIsConfidentiality === '02' ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item label="项目ID">
{{ detailData.projectCode ||'-' }}
{{ detailData.projectCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目名称">
{{ detailData.projectName ||'-' }}
{{ detailData.projectName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目类型">
{{ detailData?.projectType&&projectTypeOptions[detailData?.projectType] }}
{{ detailData?.projectType && projectTypeOptions[detailData?.projectType] }}
</el-descriptions-item>
<el-descriptions-item label="内容类别">
{{ detailData?.baseConstructionType?.split(';').map(i=>dictionaryList?.filter(j => j.type === 'CONTENT_TYPE').find(k=>k.value===i)?.label).join('、') ||'-' }}
{{
detailData?.baseConstructionType?.split(';').map(i => dictionaryList?.filter(j => j.type === 'CONTENT_TYPE').find(k => k.value === i)?.label).join('、') || '-'
}}
</el-descriptions-item>
<template v-if="detailData?.baseProjIsConfidentiality !== '02'">
<el-descriptions-item label="是否首次新建">
{{ detailData.isFirst?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="是否一地创新全省共享项目">
{{ detailData.isInnovateWholeProvinceShare?'是':'否' }}
{{ detailData.isFirst ? '是' : '否' }}
</el-descriptions-item>
</template>
<el-descriptions-item label="行政区划编码">
{{ detailData.areaCode ||'-' }}
{{ detailData.areaCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="行政区划名称">
{{ detailData.area ||'-' }}
{{ detailData.area || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目负责人">
{{ detailData.responsibleMan||'-' }}
{{ detailData.responsibleMan || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目负责人手机号码">
{{ detailData.responsibleManMobile||'-' }}
{{ detailData.responsibleManMobile || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目联系人">
{{ detailData.contactName||'-' }}
{{ detailData.contactName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目联系人手机号码">
{{ detailData.contactPhone||'-' }}
{{ detailData.contactPhone || '-' }}
</el-descriptions-item>
<el-descriptions-item label="上级业务主管单位">
{{ detailData.higherSuperOrg||'-' }}
{{ detailData.higherSuperOrg || '-' }}
</el-descriptions-item>
<el-descriptions-item label="上级业务主管单位浙政钉ID">
{{ detailData.higherSuperOrgCode||'-' }}
{{ detailData.higherSuperOrgCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="本级主管部门单位">
{{ detailData.superOrg||'-' }}
{{ detailData.superOrg || '-' }}
</el-descriptions-item>
<el-descriptions-item label="本级主管单位浙政钉ID">
{{ detailData.superOrgCode||'-' }}
{{ detailData.superOrgCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="本级主管单位统一社会信用代码">
{{ detailData.superOrgCreditCode||'-' }}
{{ detailData.superOrgCreditCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="建设单位:">
{{ detailData.buildOrgName||'-' }}
{{ detailData.buildOrgName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="建设单位浙政钉ID">
{{ detailData.buildOrgCode||'-' }}
{{ detailData.buildOrgCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="建设单位统一信用代码">
{{ detailData.orgCreditCode||'-' }}
{{ detailData.orgCreditCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="主管单位">
{{ detailData.superOrg||'-' }}
{{ detailData.superOrg || '-' }}
</el-descriptions-item>
<el-descriptions-item label="上级主管单位类型">
{{ detailData.baseProvManDeprtType===1?'省级': detailData.baseProvManDeprtType===2?'非省级':'-' }}
{{ detailData.baseProvManDeprtType === 1 ? '省级' : detailData.baseProvManDeprtType === 2 ? '非省级' : '-' }}
</el-descriptions-item>
<el-descriptions-item label="上级条线主管单位">
{{ detailData.higherSuperOrg||'-' }}
{{ detailData.higherSuperOrg || '-' }}
</el-descriptions-item>
<el-descriptions-item label="项目状态">
{{ statusOptions[detailData.status]?.name||'-' }}
{{ statusOptions[detailData.status]?.name || '-' }}
</el-descriptions-item>
<el-descriptions-item label="预算年度">
{{ detailData.projectYear ||'-' }}
{{ detailData.projectYear || '-' }}
</el-descriptions-item>
<template v-if="detailData?.baseProjIsConfidentiality !== '02'">
<el-descriptions-item label="建设起止年限">
{{ detailData.beginTime }}~{{ detailData.endTime }}
</el-descriptions-item>
<el-descriptions-item label="建设层级">
{{ dictionaryList?.filter(i => i.type === 'BUILD_LEVEL').find(i=>i.value===detailData?.buildLevel)?.label ||'-' }}
</el-descriptions-item>
<el-descriptions-item label="贯通层级">
{{ dictionaryList?.filter(i => i.type === 'BUILD_LEVEL').find(i=>i.value===detailData?.lowestLevel)?.label ||'-' }}
{{
dictionaryList?.filter(i => i.type === 'BUILD_LEVEL').find(i => i.value === detailData?.buildLevel)?.label || '-'
}}
</el-descriptions-item>
<el-descriptions-item label="系统定位" span="2">
<span style="word-break:break-all">{{ detailData.systemPosition||'-' }}</span>
<el-descriptions-item label="贯通层级" span="2">
{{
dictionaryList?.filter(i => i.type === 'BUILD_LEVEL').find(i => i.value === detailData?.lowestLevel)?.label || '-'
}}
</el-descriptions-item>
<el-descriptions-item label="项目简介" span="2">
<span style="word-break:break-all">{{ detailData.projectIntroduction||'-' }}</span>
<el-descriptions-item label="项目概述" span="2">
<span style="word-break:break-all">{{ detailData.projectOverview || '-' }}</span>
</el-descriptions-item>
<el-descriptions-item v-if="detailData.buildBasis&&JSON.parse(detailData.buildBasis)?.length" label="立项依据" span="2">
<el-descriptions-item
v-if="detailData.buildBasis&&JSON.parse(detailData.buildBasis)?.length"
label="立项依据"
span="2"
>
<table-list
:column="column"
:data="detailData.buildBasis&&JSON.parse(detailData.buildBasis)"
@@ -223,36 +244,23 @@ watch(() => props.detailData, val => {
</table-list>
</el-descriptions-item>
<el-descriptions-item label="立项依据说明" span="2">
<span style="word-break:break-all">{{ detailData.baseBasisEstablish||'-' }}</span>
<span style="word-break:break-all">{{ detailData.baseBasisEstablish || '-' }}</span>
</el-descriptions-item>

<el-descriptions-item label="发改编码">
{{ detailData.developCode ||'-' }}
{{ detailData.developCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="财政编码">
{{ detailData.financialCode ||'-' }}
</el-descriptions-item>
<el-descriptions-item label="是否数字化改革项目">
{{ detailData.isDigitalReform?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="综合业务领域">
{{ detailData.bizDomain?.split(',').map(i=>businessTerritory[i]).join(',')||'-' }}
{{ detailData.financialCode || '-' }}
</el-descriptions-item>
<el-descriptions-item label="是否上云">
{{ detailData.isCloud?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item v-if="detailData.isCloud" label="云类型">
{{ detailData.cloudType&&detailData.cloudType.split(',').map(i=>cloudTypeOptions[i]).join('、')|| '-' }}
</el-descriptions-item>
<el-descriptions-item
label="四大体系"
>{{ fourSystem[detailData.fourSystems] }}</el-descriptions-item>
<el-descriptions-item label="绩效评价类型">
{{ templateTypeListData?.find(i=>i.id===detailData.templateType)?.name||"-" }}
{{ templateTypeListData?.find(i => i.id === detailData.templateType)?.name || "-" }}
</el-descriptions-item>
<el-descriptions-item
label="是否临时增补项目"
:span="2"
>{{ detailData.isTemporaryAugment?'是':'否' }}</el-descriptions-item>
>{{ detailData.isTemporaryAugment ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item label="历年项目名称" :span="2">
<table-list
:column="column1"
@@ -272,8 +280,16 @@ watch(() => props.detailData, val => {
:empty-temp="false"
/>
</el-descriptions-item>
<el-descriptions-item v-if="detailData?.projectApplicationForm&&JSON.parse(detailData.projectApplicationForm)?.length" label="项目申报书">
<p v-for="(item,index) in detailData.projectApplicationForm&&JSON.parse(detailData.projectApplicationForm)" :key="index" class="mb-4">

<el-descriptions-item
v-if="detailData?.projectApplicationForm&&JSON.parse(detailData.projectApplicationForm)?.length"
label="项目申报书"
>
<p
v-for="(item,index) in detailData.projectApplicationForm&&JSON.parse(detailData.projectApplicationForm)"
:key="index"
class="mb-4"
>
<accessory :file-name="item.originalFileName" :file-id="item.id" :is-down-load="isDownLoadFile" />
</p>
</el-descriptions-item>
@@ -282,14 +298,22 @@ watch(() => props.detailData, val => {
label="预审申请单"
span="2"
>
<accessory :file-name="detailData.pretrialFileName" :file-id="detailData.pretrialFileId" :is-down-load="isDownLoadFile" />
<accessory
:file-name="detailData.pretrialFileName"
:file-id="detailData.pretrialFileId"
:is-down-load="isDownLoadFile"
/>
</el-descriptions-item>
<el-descriptions-item
v-if="false"
label="上级条线主管单位审核意见"
span="2"
>
<p v-for="(item,index) in detailData.higherLineSuperOrgReviewComments&&JSON.parse(detailData.higherLineSuperOrgReviewComments)" :key="index" class="mb-4">
<p
v-for="(item,index) in detailData.higherLineSuperOrgReviewComments&&JSON.parse(detailData.higherLineSuperOrgReviewComments)"
:key="index"
class="mb-4"
>
<accessory :file-name="item.originalFileName" :file-id="item.id" :is-down-load="isDownLoadFile" />
</p>
</el-descriptions-item>
@@ -298,7 +322,46 @@ watch(() => props.detailData, val => {
label="建设方案审查意见文件"
span="2"
>
<accessory :file-name="detailData.constructFileName" :file-id="detailData.constructFileId" :is-down-load="isDownLoadFile" />
<accessory
:file-name="detailData.constructFileName"
:file-id="detailData.constructFileId"
:is-down-load="isDownLoadFile"
/>
</el-descriptions-item>

<el-descriptions-item label="移动端入口" :span="2">
{{ getMobileText(detailData.mobileTerminalEntry) }}
</el-descriptions-item>

<el-descriptions-item label="是否使用云资源" :span="2">
{{ detailData.isCloudResource===1?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="云资源" :span="2">
<el-table :data="detailData.cloudResource" style="width: 100%">
<el-table-column prop="cloudResourceType" label="云资源类型" />
<el-table-column prop="baseSpecification" label="基础规格" />
<el-table-column prop="serversCount" label="台数" />
<el-table-column prop="description" label="描述" />
</el-table>
</el-descriptions-item>

<el-descriptions-item label="是否产生数据" :span="2">
{{ detailData.isProduceData===1?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="数据列表" :span="2">
<el-table :data="detailData.produceData" style="width: 100%">
<el-table-column prop="dataDirectoryName" label="数据目录名称" />
<el-table-column prop="dataItem" label="数据项" />
</el-table>
</el-descriptions-item>
<el-descriptions-item label="是否是用公共组件" :span="2">
{{ detailData.isCommonComponent===1?'是':'否' }}
</el-descriptions-item>
<el-descriptions-item label="公共组件列表" :span="2">
<el-table :data="detailData.commonComponent" style="width: 100%">
<el-table-column prop="componentName" label="数据目录名称" />
<el-table-column prop="componentType" label="数据项" />
</el-table>
</el-descriptions-item>
</template>
</el-descriptions>


Laden…
Annuleren
Opslaan