11 Commits
master ... prod

Author SHA1 Message Date
dj
f053eb80cd refactor(project-management): 注释掉打印按钮
在 StepsMoblie.vue 文件中,添加了对打印按钮的注释。使用 <!-- --> 注释掉该按钮,以便在需要时可以轻松恢复功能。
2025-09-02 23:24:21 +08:00
dj
29a7766635 refactor(special-fund):优化专项资金详情获取逻辑
-移除了接口成功调用时的重复通知
- 增加了接口调用失败时的错误通知
- 优化了代码结构,提高了用户体验
2025-08-31 21:02:40 +08:00
dj
8c20ecacab feat(mobile): 专项资金、项目管理、需求详情页面增加手机端驳回提示
- 在专项资金详情、项目管理详情和需求详情页面中添加了手机端驳回提示
- 提示内容为:"当前版本不支持手机端驳回重新提交,请在电脑网页上执行重新提交操作"
- 该提示在数据状态为 3 时显示
2025-08-29 12:00:13 +08:00
dj
05ac715461 feat(mobile): 增加需求征集操作限制提示
- 在移动端需求征集页面添加操作限制提示
- 提示用户当前版本不支持手机端需求上报
- 建议用户在电脑网页上执行需求上报操作
-调整了移动端按钮布局
2025-08-28 21:56:31 +08:00
dj
cffe7d61e3 refactor: 优化多个组件的返回逻辑
- 在 Requirement、Summary、Fund 组件中,将 history.back() 替换为 router.push(),以指定具体的路由名称- 在 ProjectApply 组件中,根据 step 值选择不同的路由页面
- 这些修改提高了组件的可测试性和灵活性,避免了依赖浏览器历史记录
2025-08-27 09:45:15 +08:00
dj
dc4b33cf89 style:移除主项目选择框的多余属性
移除了主项目选择框(el-select)组件的 remote 属性,该属性在当前场景下不需要,删除后可以简化代码结构。
2025-08-26 17:47:49 +08:00
dj
6b3e74fab9 feat(project-demand): 修改需求征集表单的编辑权限
- 扩展了表单编辑权限,允许 'Requirement/add' 路由的用户进行编辑
-调整了提交按钮的显示逻辑,移除了多余的条件判断
- 优化了文件删除按钮的显示条件,增加了对路由名称的判断
2025-08-24 17:09:17 +08:00
25f1f40957 更新 README.md 2025-08-22 16:42:26 +00:00
1ead008f53 更新 README.md 2025-08-22 15:35:00 +00:00
dj
a76ab5adaf refactor(project-demand): 动态修改需求征集页面标题
- 新增功能:根据需求状态动态修改页面标签和面包屑标题
- 优化了标题修改的逻辑,提高用户体验
- 更新了 API代理配置,指向新的服务器地址
2025-08-22 18:17:51 +08:00
dj
f2ac70f9e3 feat(project-demand): 根据需求状态显示不同表单
- 添加了 v-if="formData.state=='3'" 条件,以根据需求状态显示不同表单元素
- 为征集名称、类型、截止时间等字段添加了只读显示逻辑
- 调整了专项资金相关字段的显示逻辑
- 优化了附件上传和文件列表的显示条件
- 根据状态控制提交、返回按钮的显示
2025-08-22 17:38:46 +08:00
12 changed files with 488 additions and 216 deletions

View File

@@ -609,7 +609,19 @@ const getTitleName = (type) => {
}
}
const handleBack = () => {
history.back()
if (props.step === '20') {
router.push({
name: 'Initiation'
})
} else if (props.step === '40') {
router.push({
name: 'Implementation'
})
}else if(props.step === '50'){
router.push({
name: 'Filing'
})
}
}
const compositeParam = (item) => {
return {

View File

@@ -6,12 +6,14 @@
<el-row gutter="30">
<el-col :span="6">
<el-form-item label="征集名称" prop="requirementName">
<el-input v-model="formData.requirementName" placeholder="请输入征集名称" clearable @change="changeRequirementData"></el-input>
<el-input v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.requirementName" placeholder="请输入征集名称" clearable @change="changeRequirementData"></el-input>
<span v-else>{{ formData.requirementName }}</span>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -40px">
<el-form-item label="征集类型" prop="collectType">
<el-select v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable @change="changeRequirementData">
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.collectType" placeholder="请选择征集类型" clearable filterable @change="changeRequirementData" >
<el-option
v-for="item in cacheStore.getDict('collect_type')"
:key="item.value"
@@ -19,11 +21,12 @@
:value="item.value"
/>
</el-select>
<span v-else>{{ formData.collectType }}</span>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: 10px">
<el-form-item label="需求上报截止时间" prop="deadline">
<el-config-provider>
<el-config-provider v-if="formData.state=='3'||routerName==='Requirement/add'">
<el-date-picker
style="width: 100%"
v-model="formData.deadline"
@@ -33,19 +36,21 @@
:disabled-date="disabledDate" @change="changeRequirementData"
/>
</el-config-provider>
<span v-else>{{ formData.deadline }}</span>
</el-form-item>
</el-col>
<el-col :span="6" style="margin-left: -20px">
<el-form-item label="是否专项资金" prop="isSpecialFund">
<el-select v-model="formData.isSpecialFund" placeholder="请选择是否专项资金" clearable filterable @change="changeRequirementData">
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.isSpecialFund" placeholder="请选择是否专项资金" clearable filterable @change="changeRequirementData">
<el-option :value="true" label="是"></el-option>
<el-option :value="false" label="否"></el-option>
</el-select>
<span v-else>{{ formData.isSpecialFund?' ':' ' }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专项资金名称" prop="specialFundId" v-if="formData.isSpecialFund">
<el-select v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable @change="changeRequirementData">
<el-select v-if="formData.state=='3'||routerName==='Requirement/add'" v-model="formData.specialFundId" placeholder="请选择专项资金名称" clearable filterable @change="changeRequirementData">
<el-option
v-for="item in specialFundOption"
:key="item.value"
@@ -53,16 +58,17 @@
:value="item.value">
</el-option>
</el-select>
<span v-else>{{ formData.specialFund }}</span>
</el-form-item>
</el-col>
<el-col :span="6" v-if="formData.isSpecialFund">
<el-col :span="6" v-if="formData.isSpecialFund&&(formData.state=='3'||routerName==='Requirement/add')">
<!-- <el-form-item>-->
<a @click="addSpecialFund" style="width: 116px;text-align: right;display: inline-block">新增专项资金</a>
<!-- </el-form-item>-->
</el-col>
<el-col :span="24">
<el-form-item label="征集公司" :required="true" prop="" class="company-select">
<div style="width: 100%">
<div style="width: 100%" v-if="formData.state=='3'||routerName==='Requirement/add'">
<el-button color="#DED0B2" @click="showCompany">{{ selectedCompanyList.length === 0 ? '请选择征集公司' : '更改' }}
</el-button>
</div>
@@ -75,19 +81,21 @@
</el-col>
<el-col :span="24" style="margin-bottom: -18px">
<el-form-item label="征集说明" prop="" required>
<el-input
<el-input v-if="formData.state=='3'||routerName==='Requirement/add'"
v-model="formData.collectExplain"
style="width:100%;margin-right: 50px"
:rows="5"
type="textarea"
placeholder="请输入征集说明" @change="changeRequirementData"
/>
<div v-else v-html="formData.collectExplain" style="white-space: pre-wrap;">
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<baseTitle title="附件文件" style="margin-right: 10px"></baseTitle>
<file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/>
<file-upload v-if="checkFormPrem('fileList')&&(formData.state=='3'||routerName==='Requirement/add')" @getFile="getFile"/>
<div style="margin-right: 50px">
<fvTable style="width: 100%;max-height: 160px;" height="160" v-if="showTable"
:tableConfig="tableConfig" :data="formData.fileList"
@@ -121,9 +129,9 @@
</div>
<div style="width: 100%;height: 30px"></div>
<div class="oper-page-btn">
<el-button color="#DED0B2" v-if="routerName==='Requirement/add'&&formData.state=='3'" @click="handleSubmit(demandForm)">提交</el-button>
<el-button color="#DED0B2" v-if="routerName==='Requirement/add'" @click="handleSubmit(demandForm)">提交</el-button>
<el-button color="#DED0B2" v-else-if="routerName==='Requirement/edit'&&formData.state=='3'" @click="handleResubmit(demandForm)">重新提交</el-button>
<el-button @click="handleBack">返回</el-button>
<el-button @click="handleBack" v-if="formData.state=='3'||routerName==='Requirement/add'">返回</el-button>
</div>
<company-picker :multiple="true" ref="companyRef" title="请选择征集公司" @ok="sureSelectedCompany" @cancelOrClear="cancelSelectedCompany"
v-model:value="selectedCompanyList"/>
@@ -166,7 +174,6 @@ const opentionData = ref({})
const showExpendText = ref('')
const showMoreCompany = ref(false)
const selectedCompanyList = ref([])
// const companyList = ref([])
const changeDiagram = ref(false)
const tagsViewStore = useTagsView()
const authStore = useAuthStore()
@@ -243,8 +250,10 @@ const tableConfig = reactive({
return (
<div>
<el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
<popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
onDelete={() => handleDelete(row)}/>
{
formData.value.state=='3'||routerName.value==='Requirement/add'? <popover-delete name={row.originalFileName} type={'文件'} btnType={'danger'}
onDelete={() => handleDelete(row)}/>:''
}
</div>
)
}
@@ -569,7 +578,9 @@ const getDetailInfo = async () => {
}
const handleBack = () => {
history.back()
router.push({
name: 'Requirement'
})
}
const handleDelete = (row) => {
// deleteFile(row.fileId).then(res => {
@@ -586,6 +597,38 @@ const handleDelete = (row) => {
// });
}
// 新增:动态修改标签和面包屑标题
// watch(
// () => formData.value.state,
// async (state) => {
// if (state === '3') {
// console.log("🚀 ~ file:'32423 ")
// const newTitle = '需求征集-编辑'
// if (router.currentRoute.value.meta) {
// router.currentRoute.value.meta.title = newTitle
// }
// tagsViewStore.visitedViews.forEach(view => {
// if (view.path === router.currentRoute.value.path) {
// view.meta.title = newTitle
// }
// })
// tagsViewStore.visitedViews = [...tagsViewStore.visitedViews]
// } else {
// const defaultTitle = '需求征集-详情'
// if (router.currentRoute.value.meta) {
// router.currentRoute.value.meta.title = defaultTitle
// }
// tagsViewStore.visitedViews.forEach(view => {
// if (view.path === router.currentRoute.value.path) {
// view.meta.title = defaultTitle
// }
// })
// tagsViewStore.visitedViews = [...tagsViewStore.visitedViews]
// }
// },
// { immediate: true }
// )
onMounted(async () => {
loading.value = true
await init()

View File

@@ -1,11 +1,30 @@
<template>
<div style="padding: 0 10px;">
<div class="page-container">
<div class="notice-wrapper">
<div v-if="collectData.formData&&collectData.formData.state==4" class="notice">
<div class="alert-icon"></div>
<div class="alert-content">
<div class="alert-title">操作限制提示</div>
<div class="alert-message">当前版本不支持手机端需求上报请在电脑网页上执行需求上报操作</div>
</div>
</div>
<div v-if="formData && formData.state == 3" class="notice">
<div class="alert-icon"></div>
<div class="alert-content">
<div class="alert-title">操作限制提示</div>
<div class="alert-message">当前版本不支持手机端驳回重新提交请在电脑网页上执行重新提交操作</div>
</div>
</div>
</div>
<div style="padding: 0 10px;" >
<baseTitle title="需求征集信息"></baseTitle>
<CollectionDetailMoblie :formData="collectData.formData" :data="collectData" type="singleDetail"
:fileListShow="fileListShow"
:processViewer="processViewer" :loading="loading" v-model:value="auditOpinion"/>
<OpinionMoblie v-if="collectData.taskId" :formData="formData" :taskId="collectData.taskId" :taskUserOptionList="collectData.taskUserOptionList" v-model:value="auditOpinion"></OpinionMoblie>
</div>
</div>
</template>
<script setup lang="jsx">
@@ -104,6 +123,47 @@ onMounted(async () => {
</script>
<style lang="scss" scoped>
.page-container {
position: relative;
}
.notice-wrapper {
//margin-bottom: 8px; /* 从15px改为8px */
}
.notice {
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
padding: 15px 20px;
border-left: 6px solid #ff7875;
display: flex;
align-items: center;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-radius: 0 4px 4px 0;
.alert-icon {
font-size: 24px;
margin-right: 15px;
flex-shrink: 0;
}
.alert-content {
flex: 1;
.alert-title {
font-size: 16px;
font-weight: 700;
margin-bottom: 4px;
color: #d9363e;
}
.alert-message {
font-size: 14px;
color: #666;
}
}
}
:deep(.el-empty__description) {
margin-top: 0;
}
@@ -141,5 +201,4 @@ onMounted(async () => {
// }
//}
}
</style>

View File

@@ -221,7 +221,7 @@
:style="{marginLeft:!formData.isSpecialFund?route.query.id?'-10px':'-10px':route.query.id?'0':'-40px'}">
<el-form-item label="主项目" prop="masterProjectId">
<el-select v-model="formData.masterProjectId" clearable placeholder="请选择主项目"
@change="changeCollectData" remote filterable :remote-method="filterMasterProject">
@change="changeCollectData" filterable :remote-method="filterMasterProject">
<el-option
v-for="item in masterProjectList"
:key="item.value"
@@ -586,7 +586,9 @@ const optionalChargeLeaderPickerOkOrCancel = (userList) => {
}
const handleBack = () => {
history.back()
router.push({
name: 'Summary'
})
}
const disabledDate = (time) => {
return time.getTime() < new Date(formData.value.startTime).getTime();

View File

@@ -1,7 +1,7 @@
<template>
<!-- <baseTitle title="审核意见"></baseTitle>-->
<!-- <fvForm :schema="schema" @getInstance="(e)=>form = e"></fvForm>-->
<div class="oper-page-btn" style="display: flex">
<div class="oper-page-btn-mobile" style="display: flex">
<el-button type="danger" @click="handleReject">驳回</el-button>
<el-button color="#DED0B2" @click="handleAgree">同意</el-button>
</div>
@@ -233,4 +233,10 @@ const handleAgree = async () => {
padding: 0 !important;
}
}
.oper-page-btn-mobile {
position: fixed;
top: 20px;
right: 15px;
z-index: 5;
}
</style>

View File

@@ -1,7 +1,14 @@
<template>
<!-- <special-fund-detail :formData="fundData.formData" :data="fundData" :showTable="showTable" :processViewer="fundProcessViewer"-->
<!-- :loading="loading"/>-->
<div class="page-container">
<div class="notice-wrapper">
<div v-if="fundData && fundData.state == 3" class="notice">
<div class="alert-icon"></div>
<div class="alert-content">
<div class="alert-title">操作限制提示</div>
<div class="alert-message">当前版本不支持手机端驳回重新提交请在电脑网页上执行重新提交操作</div>
</div>
</div>
</div>
<div v-loading="loading" style="padding: 0 10px;">
<baseTitle title="专项资金详情"></baseTitle>
<el-form :model="formData" ref="form" label-width="left">
@@ -21,15 +28,15 @@
<span>{{ toThousands(formData.residualAmount) }}</span>
</el-form-item>
</el-col>
<!-- <baseTitle title="介绍"></baseTitle>-->
<!-- <el-col :span="24">-->
<!-- <el-form-item>-->
<!-- <el-card style="width: 100%">-->
<!-- <div v-html="formData.introduce">-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <baseTitle title="介绍"></baseTitle>-->
<!-- <el-col :span="24">-->
<!-- <el-form-item>-->
<!-- <el-card style="width: 100%">-->
<!-- <div v-html="formData.introduce">-->
<!-- </div>-->
<!-- </el-card>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="24">
<el-form-item label="专项资金情况说明" >
<div style="white-space: pre-wrap">{{formData.introduce}}
@@ -101,6 +108,7 @@
<file-preview ref="filePreviewRef" :fullscreen="true" v-if="filePreviewShow" :fileName="filePreviewParam.fileName" :fileUrl="filePreviewParam.fileUrl"
:fileType="filePreviewParam.fileType"/>
</div>
</div>
</template>
<script setup lang="jsx">
@@ -276,6 +284,47 @@ const getDetail = async () => {
getDetail()
</script>
<style scoped>
.page-container {
position: relative;
}
.notice-wrapper {
/* 与index页面一致 */
}
.notice {
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
padding: 15px 20px;
border-left: 6px solid #ff7875;
display: flex;
align-items: center;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-radius: 0 4px 4px 0;
}
.notice .alert-icon {
font-size: 24px;
margin-right: 15px;
flex-shrink: 0;
}
.notice .alert-content {
flex: 1;
}
.notice .alert-title {
font-size: 16px;
font-weight: 700;
margin-bottom: 4px;
color: #d9363e;
}
.notice .alert-message {
font-size: 14px;
color: #666;
}
:deep(.el-table--fit ) {
height: 300px !important;
}

View File

@@ -2,7 +2,7 @@
<div id="printBox">
<div style="display: flex;justify-content: space-between">
<baseTitle title="项目基本信息"></baseTitle>
<el-button v-print="print" color="#ded0b2" icon="Printer" style="margin-top: 15px" @click="handlePrint(print)"> 打印</el-button>
<!-- <el-button v-print="print" color="#ded0b2" icon="Printer" style="margin-top: 15px" @click="handlePrint(print)"> 打印</el-button>-->
</div>
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left" style="margin-left: 15px"></fvForm>
<div class="steps-box">

View File

@@ -1,4 +1,14 @@
<template>
<div class="page-container">
<div class="notice-wrapper">
<div v-if="detailData && detailData.state == 3" class="notice">
<div class="alert-icon"></div>
<div class="alert-content">
<div class="alert-title">操作限制提示</div>
<div class="alert-message">当前版本不支持手机端驳回重新提交请在电脑网页上执行重新提交操作</div>
</div>
</div>
</div>
<div style="padding: 0 10px;">
<StepsMoblie :active="route.query.id==='-1'?currentStep-1:currentStep" @setDetail="setDetail"
@stepChange="stepChange"
@@ -56,6 +66,7 @@
:taskUserOptionList="detailData.taskUserOptionList"
v-model:value="auditOpinion"/>
</div>
</div>
</template>
@@ -175,6 +186,47 @@ const stepChange = (data) => {
</script>
<style scoped lang="scss">
.page-container {
position: relative;
}
.notice-wrapper {
/* 与special页面一致 */
}
.notice {
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
padding: 15px 20px;
border-left: 6px solid #ff7875;
display: flex;
align-items: center;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-radius: 0 4px 4px 0;
}
.notice .alert-icon {
font-size: 24px;
margin-right: 15px;
flex-shrink: 0;
}
.notice .alert-content {
flex: 1;
}
.notice .alert-title {
font-size: 16px;
font-weight: 700;
margin-bottom: 4px;
color: #d9363e;
}
.notice .alert-message {
font-size: 14px;
color: #666;
}
.detail-block {
padding-top: 15px;
}
@@ -191,11 +243,6 @@ const stepChange = (data) => {
flex: 1;
font-size: 16px;
}
//.is-active {
// color: black;
// //background-color: #DED0B2;
//}
}
}
</style>

View File

@@ -1,4 +1,14 @@
<template>
<div class="page-container">
<div class="notice-wrapper">
<div v-if="summaryData && summaryData.state == 3" class="notice">
<div class="alert-icon"></div>
<div class="alert-content">
<div class="alert-title">操作限制提示</div>
<div class="alert-message">当前版本不支持手机端驳回重新提交请在电脑网页上执行重新提交操作</div>
</div>
</div>
</div>
<div style="padding: 0 10px; box-sizing: border-box;">
<baseTitle title="项目基本信息"></baseTitle>
<fvForm :schema="schema" @getInstance="(e)=>baseForm = e" label-position="left" label-width="left"></fvForm>
@@ -15,6 +25,7 @@
:taskUserOptionList="summaryData.taskUserOptionList"
v-model:value="auditOpinion"/>
</div>
</div>
</template>
<script setup lang="jsx">
@@ -323,5 +334,44 @@ getInfo()
</script>
<style scoped>
.page-container {
position: relative;
}
.notice-wrapper {
/* 与special页面一致 */
}
.notice {
background: linear-gradient(90deg, #fff3f3 0%, #fff8f8 100%);
padding: 15px 20px;
border-left: 6px solid #ff7875;
display: flex;
align-items: center;
width: 100%;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-radius: 0 4px 4px 0;
}
.notice .alert-icon {
font-size: 24px;
margin-right: 15px;
flex-shrink: 0;
}
.notice .alert-content {
flex: 1;
}
.notice .alert-title {
font-size: 16px;
font-weight: 700;
margin-bottom: 4px;
color: #d9363e;
}
.notice .alert-message {
font-size: 14px;
color: #666;
}
</style>

View File

@@ -234,7 +234,9 @@ const getFile = (val) => {
})
}
const handleBack = () => {
history.back()
router.push({
name: 'Fund'
})
}
const submitParam = (item) => {
@@ -325,11 +327,7 @@ const init = async () => {
}
const getDetailInfo = async () => {
getFundDetailProcess(route.query.id).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
formData.value = res.data.formData
opentionData.value = res.data
@@ -337,6 +335,12 @@ const getDetailInfo = async () => {
nextTick(() => {
showTable.value = true
})
}else{
ElNotification({
title: '提示',
message: res.msg,
type: 'error'
})
}
})
}

View File

@@ -73,7 +73,7 @@ export default defineConfig({
open: true,
proxy: {
// '/api/workflow': {
// target: 'http://frp.feashow.cn:31800/',
// target: 'http://frp.toomewhy.top:38000/',
// // target: 'http://clay.frp.feashow.cn/',
// // target: 'http://192.168.31.175:8000',
// changeOrigin: true,