Merge remote-tracking branch 'origin/master'

master
王家东 4 weeks ago
commit eaa4753d75
  1. 17
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/controller/ProjectController.java
  2. 4
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/dto/ProjectShenBaoDto.java
  3. 4
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/entity/Project.java
  4. 23
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/ProjectServiceImpl.java
  5. 4
      jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/userext/entity/UserExt.java
  6. 2
      jeecgboot-vue3/src/views/monitor/trace/index.vue
  7. 9
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/xiangmushu/TianBaoShuMingDemo.vue
  8. 100
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/FengMian.api.ts
  9. 95
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/FengMianDemo.vue
  10. 156
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/ProjectBaseInfoDemo.vue
  11. 97
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/TianBaoShuMingDemo.vue
  12. 89
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/index.vue
  13. 865
      jeecgboot-vue3/src/views/projectApplication/kejigongguan/yusuanshu/jeecgComponents.data.ts
  14. 2
      jeecgboot-vue3/src/views/projectApplication/project/ProjectList.vue
  15. 4
      jeecgboot-vue3/src/views/projectFile/zhengwen/ProjectFile4ZhengWen.data.ts

@ -108,6 +108,22 @@ public class ProjectController extends JeecgController<Project, IProjectService>
return Result.OK(project); return Result.OK(project);
} }
@ApiOperation(value = "预算书-获取预算书封面", notes = "预算书-获取预算书封面")
@GetMapping(value = "/getFengMian")
public Result<Project> getFengMian(Project param, HttpServletRequest req) {
Project project = projectService.getById(param.getId());
ProjectType projectType = iProjectTypeService.getById(project.getProjectTypeid());
project.setAnnualName(projectType.getAnnualName());
project.setProjectTypeName(projectType.getTypeName());
project.setAnnualName(projectType.getAnnualName());
project.setProjectTypeName(projectType.getTypeName());
SysDepart sysDepart = iSysDepartService.getById(project.getSysOrgCode());
project.setDepartName(sysDepart.getDepartName());
SysUser sysUser = iSysUserService.getById(project.getProjectCharger());
project.setProjectCharger(sysUser.getRealname());
return Result.OK(project);
}
@ApiOperation(value = "获取项目负责人信息", notes = "获取项目负责人信息") @ApiOperation(value = "获取项目负责人信息", notes = "获取项目负责人信息")
@GetMapping(value = "/getUserInfo") @GetMapping(value = "/getUserInfo")
public Result<UserExt> getUserInfo(Project para, HttpServletRequest req) { public Result<UserExt> getUserInfo(Project para, HttpServletRequest req) {
@ -120,6 +136,7 @@ public class ProjectController extends JeecgController<Project, IProjectService>
); );
userExt.setIdNO(sysUser.getId()); userExt.setIdNO(sysUser.getId());
userExt.setPhone(sysUser.getPhone()); userExt.setPhone(sysUser.getPhone());
userExt.setEmail(sysUser.getEmail());
return Result.OK(userExt); return Result.OK(userExt);
} }

@ -1,5 +1,6 @@
package org.jeecg.modules.demo.project.dto; package org.jeecg.modules.demo.project.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -366,4 +367,7 @@ public class ProjectShenBaoDto implements Serializable {
@Excel(name = "用户表身份证号", width = 15) @Excel(name = "用户表身份证号", width = 15)
@ApiModelProperty(value = "用户表身份证号") @ApiModelProperty(value = "用户表身份证号")
private String idNO; private String idNO;
@ApiModelProperty(value = "用户表负责人email")
private String email;
} }

@ -242,6 +242,10 @@ public class Project implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private String annualName; private String annualName;
@TableField(exist = false)
private String departName;
/** /**
* 批次 * 批次
*/ */

@ -1,7 +1,6 @@
package org.jeecg.modules.demo.project.service.impl; package org.jeecg.modules.demo.project.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -13,7 +12,6 @@ import org.jeecg.modules.demo.project.dto.ProjectShenBaoDto;
import org.jeecg.modules.demo.project.entity.Project; import org.jeecg.modules.demo.project.entity.Project;
import org.jeecg.modules.demo.project.mapper.ProjectMapper; import org.jeecg.modules.demo.project.mapper.ProjectMapper;
import org.jeecg.modules.demo.project.service.IProjectService; import org.jeecg.modules.demo.project.service.IProjectService;
import org.jeecg.modules.demo.projectType.entity.ProjectType;
import org.jeecg.modules.demo.projectType.service.IProjectTypeService; import org.jeecg.modules.demo.projectType.service.IProjectTypeService;
import org.jeecg.modules.demo.userext.entity.UserExt; import org.jeecg.modules.demo.userext.entity.UserExt;
import org.jeecg.modules.demo.userext.service.IUserExtService; import org.jeecg.modules.demo.userext.service.IUserExtService;
@ -74,9 +72,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
// 预算书不存在 // 预算书不存在
project.setBudgetStatus("10"); project.setBudgetStatus("10");
// ProjectType projectType = iProjectTypeService.getById(project.getProjectTypeid());
// project.setAnnualName(projectType.getAnnualName());
// project.setProjectTypeName(projectType.getTypeName());
this.save(project); this.save(project);
userExt.setUserId(loginUser.getId()); userExt.setUserId(loginUser.getId());
userExt.setProjectId(project.getId()); userExt.setProjectId(project.getId());
@ -89,43 +84,43 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
updateDepart4ShenBao(sysDepart); updateDepart4ShenBao(sysDepart);
} }
void updateDepart4ShenBao(SysDepart depart){ void updateDepart4ShenBao(SysDepart depart) {
this.iSysDepartService.updateById(depart); this.iSysDepartService.updateById(depart);
} }
@Override @Override
public void update4shenbao(ProjectShenBaoDto dto) { public void update4shenbao(ProjectShenBaoDto dto) {
log.info(">>> the 修改项目书-文 reqParams:{}", JSON.toJSONString(dto)); log.info(">>> the 修改项目书-文 reqParams:{}", JSON.toJSONString(dto));
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
iUserExtService.remove(new LambdaQueryWrapper<UserExt>().eq(UserExt::getProjectId,dto.getId())); iUserExtService.remove(new LambdaQueryWrapper<UserExt>().eq(UserExt::getProjectId, dto.getId()));
iDepartExtService.remove(new LambdaQueryWrapper<DepartExt>().eq(DepartExt::getProjectId,dto.getId())); iDepartExtService.remove(new LambdaQueryWrapper<DepartExt>().eq(DepartExt::getProjectId, dto.getId()));
SysDepart sysDepart = new SysDepart(); SysDepart sysDepart = new SysDepart();
DepartExt departExt = new DepartExt(); DepartExt departExt = new DepartExt();
// SysUser sysUser = new SysUser(); SysUser sysUser = new SysUser();
UserExt userExt = new UserExt(); UserExt userExt = new UserExt();
Project project = new Project(); Project project = new Project();
BeanUtils.copyProperties(dto, departExt); BeanUtils.copyProperties(dto, departExt);
BeanUtils.copyProperties(dto, sysDepart); BeanUtils.copyProperties(dto, sysDepart);
// BeanUtils.copyProperties(dto, sysUser);
BeanUtils.copyProperties(dto, userExt); BeanUtils.copyProperties(dto, userExt);
BeanUtils.copyProperties(dto, project); BeanUtils.copyProperties(dto, project);
project.setSysOrgCode(loginUser.getOrgId()); project.setSysOrgCode(loginUser.getOrgId());
//负责人
// project.setProjectCharger(loginUser.getId());
this.updateById(project); this.updateById(project);
userExt.setUserId(loginUser.getId()); userExt.setUserId(loginUser.getId());
userExt.setProjectId(project.getId()); userExt.setProjectId(project.getId());
this.iUserExtService.save(userExt); this.iUserExtService.save(userExt);
sysUser.setId(loginUser.getId());
sysUser.setEmail(dto.getEmail());
this.iSysUserService.updateById(sysUser);
departExt.setDepartId(loginUser.getOrgId()); departExt.setDepartId(loginUser.getOrgId());
departExt.setProjectId(project.getId()); departExt.setProjectId(project.getId());
this.iDepartExtService.save(departExt); this.iDepartExtService.save(departExt);
sysDepart.setId(loginUser.getOrgId()); sysDepart.setId(loginUser.getOrgId());
updateDepart4ShenBao(sysDepart); updateDepart4ShenBao(sysDepart);
} }

@ -122,5 +122,9 @@ public class UserExt implements Serializable {
@ApiModelProperty(value = "用户表负责人手机号") @ApiModelProperty(value = "用户表负责人手机号")
private String phone; private String phone;
@TableField(exist = false)
@ApiModelProperty(value = "用户表负责人email")
private String email;
} }

@ -3,7 +3,7 @@
<BasicTable @register="registerTable" :dataSource="dataSource" @change="handlerTableChange"> <BasicTable @register="registerTable" :dataSource="dataSource" @change="handlerTableChange">
<template #tableTitle> <template #tableTitle>
<div slot="message"> <div slot="message">
共追踪到 {{ dataSource.length }} 条近期HTTP请求记录 共追踪到777 {{ dataSource.length }} 条近期HTTP请求记录
<a-divider type="vertical" /> <a-divider type="vertical" />
<a @click="loadDate">立即刷新</a> <a @click="loadDate">立即刷新</a>
</div> </div>

@ -87,14 +87,7 @@
function setValues() { function setValues() {
setFieldsValue({ setFieldsValue({
tinymce: '填 报 说 明\n' + tinymce: "<p align=\"center\"><strong>填 报 说 明</strong></p>\n<p>&nbsp;&nbsp;&nbsp; 1.根据《河南省科技计划项目管理办法(试行)》,申报省科技攻关计划项目必须填报《河南省重点研发与推广专项申请书(科技攻关)》。<br>&nbsp;&nbsp;&nbsp; 2.&ldquo;申请书&rdquo;的各项内容应认真填写,表述准确,实事求是。其中引用的名称、数据等内容均应标明出处,外来语要同时用原文和中文表达,第一次出现的缩写词须注明全称。<br>&nbsp;&nbsp;&nbsp; 3.申请书第二、三、四、五部分不得出现项目负责人、申请单位等相关信息,否则按无效申报处理。<br>&nbsp;&nbsp;&nbsp; 4.若项目申报者有合作单位,请填合作单位概况,且必须在&ldquo;申请书&rdquo;后附合作协议(合同)。<br>&nbsp;&nbsp;&nbsp; 5.&ldquo;申请书&rdquo;中未列但需说明的内容可加附页,相关技术文献等材料应作为附件一并报送。<br>&nbsp;&nbsp;&nbsp; 6.每个项目申请省财政经费预算统一为10万元(原则上企业以自筹经费为主),项目实施周期不超过两年,即截止到2026年12月31日以前。</p>",
'\n' +
' 1.根据《河南省科技计划项目管理办法(试行)》,申报省科技攻关计划项目必须填报《河南省重点研发与推广专项申请书(科技攻关)》。\n' +
' 2.“申请书”的各项内容应认真填写,表述准确,实事求是。其中引用的名称、数据等内容均应标明出处,外来语要同时用原文和中文表达,第一次出现的缩写词须注明全称。\n' +
' 3.申请书第二、三、四、五部分不得出现项目负责人、申请单位等相关信息,否则按无效申报处理。\n' +
' 4.若项目申报者有合作单位,请填合作单位概况,且必须在“申请书”后附合作协议(合同)。\n' +
' 5.“申请书”中未列但需说明的内容可加附页,相关技术文献等材料应作为附件一并报送。\n' +
' 6.每个项目申请省财政经费预算统一为10万元(原则上企业以自筹经费为主),项目实施周期不超过两年,即截止到2026年12月31日以前。',
}); });
} }
function goBack(){ function goBack(){

@ -0,0 +1,100 @@
import {defHttp} from '/@/utils/http/axios';
import {useMessage} from "/@/hooks/web/useMessage";
const {createConfirm} = useMessage();
enum Api {
list = '/project/project/list',
fengMian = '/project/project/getFengMian',
userInfo = '/project/project/getUserInfo',
departInfo = '/project/project/getDepartInfo',
saveshenbao = '/project/project/save4shenbao',
updateshenbao = '/project/project/update4shenbao',
edit = '/project/project/edit',
deleteOne = '/project/project/delete',
deleteBatch = '/project/project/deleteBatch',
importExcel = '/project/project/importExcel',
exportXls = '/project/project/exportXls',
save = '/project/project/add',
}
/**
* 导出api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* 导入api
*/
export const getImportUrl = Api.importExcel;
/**
* 列表接口
* @param params
*/
export const list = (params) =>
defHttp.get({url: Api.list, params});
export const getFengMian = (params) =>
defHttp.get({url: Api.fengMian, params});
export const getUserByProjectId = (params) =>
defHttp.get({url: Api.userInfo, params});
export const getDepartByProjectId = (params) =>
defHttp.get({url: Api.departInfo, params});
/**
* 删除单个
*/
export const deleteOne = (params, handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
* 批量删除
* @param params
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({
url: Api.deleteBatch,
data: params
}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
* 保存或者更新
* @param params
*/
export const saveOrUpdate = (params, isUpdate) => {
// let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({url: url, params});
}
/**
* 保存
* @param params
*/
export const save4shenbao = (params) => {
return defHttp.post({url: Api.saveshenbao, params});
};
/**
* 更新
* @param params
*/
export const update4shenbao = (params) => {
return defHttp.post({url: Api.updateshenbao, params});
};

@ -0,0 +1,95 @@
<template>
<div class="container">
<table border="1">
<thead>
<tr>
<th colspan="2" style="font-size: 20px">驻马店财政科研项目预算申报书</th>
</tr>
</thead>
<tbody>
<tr>
<td>预算年度</td>
<td>{{ data.annualName }}</td>
</tr>
<tr>
<td>项目类别</td>
<td>{{ data.projectTypeName }}</td>
</tr>
<tr>
<td>经费类别</td>
<td>{{ data.projectTypeName }}</td>
</tr>
<tr>
<td>项目名称</td>
<td>{{ data.projectName }}</td>
</tr>
<tr>
<td>申报单位</td>
<td>{{ data.projectName }}</td>
</tr>
<tr>
<td>科研团队名称</td>
<td></td>
</tr>
<tr>
<td>项目负责人</td>
<td>{{ data.projectCharger }}</td>
</tr>
<tr>
<td>申请预算额度(万元)</td>
<td>{{ data.applyFund }}</td>
</tr>
<!-- <tr>
<td>市县/省直部门</td>
<td>行1列2</td>
</tr>-->
<tr>
<td>填报日期</td>
<td>{{ data.createTime }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script setup lang="ts">
import {useRoute} from "vue-router";
import {getFengMian} from './FengMian.api';
import {onMounted, ref} from "vue";
const route = useRoute();
const data = ref({})
async function getData() {
let params = {
id: route.query.id,
};
let obj = await getFengMian(params);
console.log('data', JSON.stringify(obj))
data.value = obj
}
onMounted(() => {
getData()
});
</script>
<style scoped lang="less">
.container {
display: flex;
align-content: center;
justify-content: center;
}
th, td {
width: 500px;
height: 40px;
text-align: center;
line-height: 40px;
border: 1px solid #000;
}
</style>

@ -0,0 +1,156 @@
<template>
<div>
<PageWrapper>
<Description
title="项目基本信息"
:collapseOptions="{ canExpand: false, helpMessage: 'help me' }"
:column="2"
:data="projectBaseInfoData"
:schema="schema"
/>
<!-- <Description
class="mt-4"
title="垂直示例"
layout="vertical"
:collapseOptions="{ canExpand: false, helpMessage: 'help me' }"
:column="2"
:data="mockData"
:schema="schema"
/>-->
<Description @register="register" class="mt-4"/>
<Description @register="register1" class="mt-4"/>
</PageWrapper>
</div>
<div>
<!--引用表格-->
<BasicTable @register="registerTable"></BasicTable>
</div>
</template>
<script lang="ts" setup>
import {onMounted} from 'vue';
import {DescItem, Description, useDescription} from '/@/components/Description/index';
import {PageWrapper} from '/@/components/Page';
import {BasicTable} from '/@/components/Table';
import {useRoute} from "vue-router";
import {getFengMian} from './FengMian.api';
import {useModal} from "@/components/Modal";
import {useListPage} from "@/hooks/system/useListPage";
import {columns} from "@/views/projectObjective/ProjectObjective.data";
import {list} from '@/views/projectObjective/ProjectObjective.api';
const route = useRoute();
//model
const [registerModal, {openModal}] = useModal();
//table
const {tableContext} = useListPage({
tableProps: {
title: '项目绩效目标及分年度目标:',
api: list,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
// schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
}
})
const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext
const projectBaseInfoData: Recordable = {
username: 'oooooo777',
nickName: 'VB',
age: '123',
phone: '15695909xxx',
email: '190848757@qq.com',
addr: '厦门市思明区',
sex: '男',
certy: '3504256199xxxxxxxxx',
tag: 'orange',
};
const mockData: Recordable = {
username: 'test',
nickName: 'VB',
age: '123',
phone: '15695909xxx',
email: '190848757@qq.com',
addr: '厦门市思明区',
sex: '男',
certy: '3504256199xxxxxxxxx',
tag: 'orange',
};
const schema: DescItem[] = [
{
field: 'username',
label: '用户名',
},
{
field: 'nickName',
label: '昵称',
render: (curVal, data) => {
return `${data.username}-${curVal}`;
},
},
{
field: 'phone',
label: '联系电话',
},
{
field: 'email',
label: '邮箱',
},
{
field: 'addr',
label: '地址',
},
];
// export default defineComponent({
// components: {
// Description, PageWrapper, BasicTable
// }
// ,
// setup() {
const [register] = useDescription({
title: 'useDescription',
// data: mockData,
data: projectBaseInfoData,
schema: schema,
});
/*const [register1] = useDescription({
title: '无边框',
bordered: false,
data: mockData,
schema: schema,
});*/
async function getData() {
let params = {
id: route.query.id,
};
let obj = await getFengMian(params);
console.log('data', JSON.stringify(obj))
projectBaseInfoData.value = obj
}
onMounted(() => {
getData()
});
// return {mockData, projectBaseInfoData, schema, register/*, register1*/};
// },
// });
</script>

@ -0,0 +1,97 @@
<template>
<div class="p-4">
<div class="p-4 bg-white">
<BasicForm @register="register" @submit="handleSubmit" />
</div>
</div>
<div type="primary" class="button-container">
<a-button type="primary" @click="goBack">返回</a-button>
</div>
</template>
<script lang="ts">
export default {
title: '富文本 | Markdown',
name: 'MarkdownDemo',
};
</script>
<script lang="ts" setup>
import { FormSchema, useForm, BasicForm } from '/@/components/Form';
import { useMessage } from '/@/hooks/web/useMessage';
import { defineComponent, onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
const { back } = useRouter();
const { createMessage, createSuccessModal } = useMessage();
const schemas: FormSchema[] = [
{
field: 'tinymce',
component: 'JEditor',
// component: 'InputTextArea',
// componentProps: {
// // placeholder: '',
// rows: 12,
// },
// label: '',
// defaultValue: 'dd',
dynamicDisabled: true,
},
];
const [register, { setProps, validate, setFieldsValue }] = useForm({
labelWidth: 120,
schemas: schemas,
actionColOptions: {
span: 24,
},
compact: true,
showResetButton: false,
showSubmitButton: false,
showAdvancedButton: false,
disabled: false,
});
function handleSubmit(values) {
console.log(values);
}
function setDis(flag) {
setProps({ disabled: !!flag });
}
async function getValues() {
try {
const values = await validate();
console.log(values);
createSuccessModal({
title: '校验通过',
content: `${JSON.stringify(values)}`,
});
} catch (error) {
createMessage.warning('检验不通过');
}
}
function setValues() {
setFieldsValue({
tinymce: "<p style=\"text-align: center;\"><strong>填报说明</strong></p>\n<p>一、项目类别是指项目所属计划(专项、基金等)。申请项目经费的单位应符合《河南省省级创新研发专项资金管理办法》(豫财科〔2022〕46号)以及项目申报指南有关条件和要求。</p>\n<p>二、项目名称和项目承担单位名称,应填写正式全称。承担单位名称与单位法人营业执照、单位开户名称及单位公章应当一致。预算数据以&ldquo;万元&rdquo;为单位,精确到小数点后两位。各类标准或单价以&ldquo;元&rdquo;为单位,精确到个位。预算书中不同地方出现的相通设备、材料等实物信息应当填写规范和统一的名称。&ldquo;科研团队&rdquo;的内涵和基本条件按省科技厅规定执行。</p>\n<p>三、&ldquo;单位基本情况表&rdquo;中,单位技术研究资质包括:工程技术研究中心、重点实验室、高新技术企业、企业技术中心、工程研究中心、产品质量监督检验中心、创新型试点企业、创新型科技团队、省知识产权优势企业等,填写申报项目相关领域的研究资质。同类资质只填列最高一个级别。</p>\n<p>企业类型按照《中小企业划型标准规定》(工信部联企业[2011]300号)填报。</p>\n<p>四、项目绩效目标指项目完成后的达到的产出和效果,包括研究、开发及转化的技术指标,经济、社会、环境效益等预期效果,目标应具体可考核。项目绩效目标应当与项目申报书中的相关内容保持一致。跨年度实施的项目应当编列年度工作计划和目标。</p>\n<p>五、&ldquo;项目经费预算表&rdquo;中,项目经费是指在项目组织实施过程中与研究开发活动直接相关的费用,包括直接费用和间接费用。具体经费开支范围按照《河南省省级创新研发专项资金管理办法》(豫财科〔2022〕46号)相关内容执行。</p>\n<p>支出预算表中&ldquo;已完成&rdquo;是指从项目开始实施至项目申报时已完成的支出情况。项目尚未实施的可不填。</p>\n<p>财政拨款需要拨付到项目合作单位的以及需分年度支付的,应填报&ldquo;省财政拨款分单位、年度预算表&rdquo;。项目牵头单位实行统一核算,合作单位经费支出实行报帐的可以不填。</p>\n<p>六、经费支出说明:</p>\n<p>1、对照《河南省省级创新研发专项资金管理办法》(豫财科〔2022〕46号)中&ldquo;经费开支范围&rdquo;和本申报书中&ldquo;项目经费预算表&rdquo;,逐项详细说明。主要包括支出的具体内容、用途以及数量、单价等计算依据。</p>\n<p>2、根据项目经费预算支出情况,对定额以上的设备设施费、材料费、测试化验加工费、国际合作与交流经费,需填写&ldquo;经费支出分项预算明细表&rdquo;。</p>\n<p>七、网报预算申报书时,应同时上传单位证照(事业单位上传法人证书,企业单位上传营业执照)、单位技术研究资质认定文件(扫描件)、企业上年度财务审计报告(扫描件)、资金证明材料等有关附件。</p>",
});
}
function goBack(){
back();
};
onMounted(() => {
setValues();
});
</script>
<style scoped>
.button-container {
text-align: center;
}
</style>

@ -0,0 +1,89 @@
<template>
<div class="p-4">
<a-card :bordered="false" style="height: 100%">
<a-tabs v-model:activeKey="activeKey" @change="tabChange">
<a-tab-pane key="FengMianDemo" tab="封面" force-render></a-tab-pane>
<a-tab-pane key="TianBaoShuMingDemo" tab="填报说明" force-render></a-tab-pane>
<a-tab-pane key="ProjectBaseInfoDemo" tab="项目基本情况表"></a-tab-pane>
<a-tab-pane key="ZhengWenDemo" tab="正文"></a-tab-pane>
<a-tab-pane key="XiangMuHeZuoKaiFaDemo" tab="项目合作开发情况"></a-tab-pane>
<a-tab-pane key="HeZuoDanWeiDemo" tab="合作单位"></a-tab-pane>
<a-tab-pane key="ZhuYaoRenYuanDemo" tab="项目主要参加人员"></a-tab-pane>
<!-- <a-tab-pane key="JeecgPdfView" tab="PDF预览"></a-tab-pane>-->
<a-tab-pane key="XiangMuJiXiaoMuBiaoDemo" tab="项目绩效目标"></a-tab-pane>
<a-tab-pane key="YiJianDemo" tab="意见"></a-tab-pane>
<a-tab-pane key="FuJianDemo" tab="文件上传"></a-tab-pane>
</a-tabs>
<component :is="currentComponent"></component>
</a-card>
</div>
<!-- <div type="primary" class="button-container">
<a-button type="primary" @click="goBack"> 获取路由 </a-button>
</div>-->
</template>
<script lang="ts">
import { defineComponent, ref, computed } from 'vue';
import FengMianDemo from './FengMianDemo.vue';
import TianBaoShuMingDemo from './TianBaoShuMingDemo.vue';
import ProjectBaseInfoDemo from './ProjectBaseInfoDemo.vue';
import JiBenXinXiDemo from '../xiangmushu/JiBenXinXiDemo.vue';
import XiangMuJiXiaoMuBiaoDemo from '../xiangmushu/XiangMuJiXiaoMuBiaoDemo.vue';
import YiJianDemo from '../xiangmushu/YiJianDemo.vue';
import HeZuoDanWeiDemo from '../xiangmushu/HeZuoDanWeiDemo.vue';
import ZhuYaoRenYuanDemo from '../xiangmushu/ZhuYaoRenYuanDemo.vue';
import ZhengWenDemo from '../xiangmushu/ZhengWenDemo.vue';
import XiangMuHeZuoKaiFaDemo from '../xiangmushu/XiangMuHeZuoKaiFaDemo.vue';
import JeecgPdfView from '../xiangmushu/JeecgPdfView.vue';
import FuJianDemo from '../xiangmushu/FuJianDemo.vue';
import { useRouter } from 'vue-router';
export default defineComponent({
name: 'comp-jeecg-basic',
setup() {
const route = useRouter();
const projectId = ref(route.currentRoute.value.query);
const activeKey = ref('FengMianDemo');
const currentComponent = computed(() => {
const componentType = {
TianBaoShuMingDemo: TianBaoShuMingDemo,
FengMianDemo: FengMianDemo,
ProjectBaseInfoDemo: ProjectBaseInfoDemo,
ZhengWenDemo: ZhengWenDemo,
XiangMuHeZuoKaiFaDemo: XiangMuHeZuoKaiFaDemo,
XiangMuJiXiaoMuBiaoDemo: XiangMuJiXiaoMuBiaoDemo,
YiJianDemo: YiJianDemo,
HeZuoDanWeiDemo: HeZuoDanWeiDemo,
ZhuYaoRenYuanDemo: ZhuYaoRenYuanDemo,
JeecgPdfView: JeecgPdfView,
FuJianDemo: FuJianDemo,
};
return componentType[activeKey.value];
});
//使componenttab
function tabChange(key) {
activeKey.value = key;
// alert("activeKey.value-"+activeKey.value)
}
/*function goBack() {
// back();
alert("获取路由:"+JSON.stringify(projectId));
// console.log(":"+JSON.stringify(route.currentRoute.value.query));
// route.back();
}*/
return {
activeKey,
currentComponent,
tabChange,
// goBack,
};
},
});
</script>
<style scoped>
.button-container {
text-align: center;
}
</style>

@ -0,0 +1,865 @@
import { FormSchema, JCronValidator } from '/@/components/Form';
import { usePermission } from '/@/hooks/web/usePermission';
const { isDisabledAuth } = usePermission();
export const schemas: FormSchema[] = [
{
field: 'jdst',
component: 'JDictSelectTag',
label: '性别下拉',
helpMessage: ['component模式'],
componentProps: {
dictCode: 'sex',
},
colProps: {
span: 12,
},
},
{
field: 'jdst',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'jdst1',
component: 'JDictSelectTag',
label: '性别选择',
helpMessage: ['component模式'],
componentProps: {
dictCode: 'sex',
type: 'radioButton',
},
colProps: {
span: 12,
},
},
{
field: 'jdst1',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'jdst2',
component: 'JDictSelectTag',
label: '字典表下拉',
helpMessage: ['component模式'],
componentProps: {
dictCode: 'sys_user,realname,id',
},
colProps: {
span: 12,
},
},
{
field: 'jdst2',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'jdst3',
component: 'JDictSelectTag',
label: '字典表下拉(带条件)',
helpMessage: ['component模式'],
componentProps: {
dictCode: "sys_user,realname,id,username!='admin' order by create_time",
},
colProps: {
span: 12,
},
},
{
field: 'jdst3',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'jsst',
component: 'JSearchSelect',
label: '字典搜索(同步)',
colProps: { span: 12 },
componentProps: {
//dict: "sys_depart,depart_name,id",
dictOptions: [
{
text: '选项一',
value: '1',
},
{
text: '选项二',
value: '2',
},
{
text: '选项三',
value: '3',
},
],
},
},
{
field: 'jsst',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'jsst2',
component: 'JSearchSelect',
label: '字典搜索(异步)',
colProps: { span: 12 },
componentProps: {
dict: 'sys_depart,depart_name,id',
pageSize: 6,
async: true,
},
},
{
field: 'jsst2',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'xldx',
component: 'JDictSelectTag',
label: '字典下拉多选',
colProps: { span: 12 },
componentProps: {
dictCode: 'sex',
mode: 'multiple',
},
},
{
field: 'xldx',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'xldx2',
component: 'JSelectMultiple',
label: '字典下拉多选2',
colProps: { span: 12 },
componentProps: {
dictCode: 'sex',
},
},
{
field: 'xldx2',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'dxxlk',
component: 'JDictSelectTag',
label: '字典下拉单选',
colProps: { span: 12 },
componentProps: {
dictCode: 'sex',
},
},
{
field: 'dxxlk',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
label: '可输入下拉',
field: 'selectInput',
component: 'JSelectInput',
componentProps: {
options: [
{ label: '选项一', value: '1' },
{ label: '选项二', value: '2' },
{ label: '选项三', value: '3' },
],
},
colProps: { span: 12 },
},
{
field: 'selectInput',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'depart3',
component: 'JSelectDept',
label: '选择部门—自定义值',
helpMessage: ['component模式'],
componentProps: { showButton: false, rowKey: 'orgCode', primaryKey: 'orgCode' },
colProps: {
span: 12,
},
},
{
field: 'depart3',
component: 'JEllipsis',
label: '选中部门',
colProps: { span: 12 },
},
{
field: 'depart2',
component: 'JSelectDept',
label: '选择部门',
helpMessage: ['component模式'],
componentProps: { showButton: false },
colProps: {
span: 12,
},
},
{
field: 'depart2',
component: 'JEllipsis',
label: '选中部门',
colProps: { span: 12 },
},
{
field: 'user2',
component: 'JSelectUser',
label: '用户选择组件',
helpMessage: ['component模式'],
componentProps: {
labelKey: 'realname',
rowKey: 'id',
showSelected: true,
},
colProps: {
span: 12,
},
},
{
field: 'user2',
component: 'JEllipsis',
label: '选中用户',
colProps: { span: 12 },
},
{
field: 'user3',
component: 'JSelectUserByDept',
label: '部门选择用户',
helpMessage: ['component模式'],
componentProps: {
labelKey: 'realname',
rowKey: 'username',
},
colProps: {
span: 12,
},
},
{
field: 'user3',
component: 'JEllipsis',
label: '选中用户',
colProps: { span: 12 },
},
{
field: 'role2',
component: 'JSelectRole',
label: '角色选择组件',
helpMessage: ['component模式'],
colProps: {
span: 12,
},
},
{
field: 'role2',
component: 'JEllipsis',
label: '选中角色',
colProps: { span: 12 },
},
{
field: 'position2',
component: 'JSelectPosition',
label: '职务选择组件',
helpMessage: ['component模式'],
colProps: { span: 12 },
componentProps: { async: true, showSelectTable: true },
},
{
field: 'position2',
component: 'JEllipsis',
label: '选中职务',
colProps: { span: 12 },
},
{
field: 'checkbox1',
component: 'JCheckbox',
label: 'JCheckbox组件1',
helpMessage: ['component模式'],
defaultValue: '1,2',
componentProps: {
options: [
{ label: '男', value: '1' },
{ label: '女', value: '2' },
],
},
colProps: {
span: 12,
},
},
{
field: 'checkbox1',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'checkbox2',
component: 'Input',
label: 'JCheckbox组件2',
defaultValue: '1',
helpMessage: ['插槽模式'],
slot: 'JCheckbox',
colProps: {
span: 12,
},
},
{
field: 'checkbox2',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'data1',
label: '日期选择',
component: 'DatePicker',
componentProps: {
showTime: true,
valueFormat: 'YYYY-MM-DD HH:mm:ss',
},
colProps: {
span: 12,
},
},
{
field: 'data1',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'data2',
label: '年份范围选择',
component: 'RangePicker',
componentProps: {
picker: 'year',
valueFormat: 'YYYY',
},
colProps: {
span: 12,
},
},
{
field: 'data2',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'hk',
component: 'Input',
label: '滑块验证码',
helpMessage: ['插槽模式'],
slot: 'dargVerify',
colProps: {
span: 12,
},
},
{
field: 'hk',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'JTreeDict',
component: 'JTreeDict',
label: '树字典',
helpMessage: ['component模式'],
colProps: { span: 12 },
},
{
field: 'JTreeDict',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'ts',
component: 'JTreeSelect',
label: '下拉树选择',
helpMessage: ['component模式'],
componentProps: {
dict: 'sys_permission,name,id',
pidField: 'parent_id',
hasChildField: 'is_leaf',
converIsLeafVal: 0,
},
colProps: {
span: 12,
},
},
{
field: 'ts',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'ts1',
component: 'JTreeSelect',
label: '下拉树多选',
helpMessage: ['component模式'],
componentProps: {
dict: 'sys_permission,name,id',
pidField: 'parent_id',
hasChildField: 'is_leaf',
converIsLeafVal: 0,
multiple: true,
},
colProps: {
span: 12,
},
},
{
field: 'ts1',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'category',
component: 'JCategorySelect',
label: '分类字典树',
helpMessage: ['component模式'],
defaultValue: '',
componentProps: {
pcode: 'B01',
multiple: true,
},
colProps: {
span: 12,
},
},
{
field: 'category',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'JEasyCron',
component: 'JEasyCron',
label: 'JEasyCron',
helpMessage: ['component模式'],
colProps: { span: 12 },
defaultValue: '* * * * * ? *',
rules: [{ validator: JCronValidator }],
},
{
field: 'JEasyCron',
component: 'JEllipsis',
label: '选择值',
colProps: { span: 12 },
},
{
field: 'JInput',
component: 'JInput',
label: '特殊查询组件',
helpMessage: ['插槽模式'],
slot: 'JInput',
colProps: {
span: 12,
},
},
{
field: 'jinputtype',
component: 'Select',
label: '查询类型',
componentProps: {
options: [
{ value: 'like', label: '模糊(like)' },
{ value: 'ne', label: '不等于(ne)' },
{ value: 'ge', label: '大于等于(ge)' },
{ value: 'le', label: '小于等于(le)' },
],
},
colProps: {
span: 6,
},
},
{
field: 'JInput',
component: 'JEllipsis',
label: '输入值',
colProps: { span: 6 },
},
{
field: 'field1',
component: 'Select',
label: '省市区选择',
helpMessage: ['插槽模式'],
slot: 'jAreaLinkage',
colProps: {
span: 12,
},
defaultValue: ['130000', '130200'],
},
{
field: 'field1',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'field0',
component: 'Select',
label: '禁用组件(方式一)',
helpMessage: ['插槽模式'],
slot: 'jAreaLinkage1',
colProps: {
span: 12,
},
defaultValue: ['130000', '130200'],
},
{
field: 'field0',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'field2',
component: 'JAreaLinkage',
label: '禁用组件(方式二)',
helpMessage: ['component模式'],
colProps: {
span: 12,
},
dynamicDisabled: ({ values }) => {
console.log(values);
return isDisabledAuth(['demo.dbarray']);
},
defaultValue: ['140000', '140300', '140302'],
},
{
field: 'field2',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'pca1',
component: 'JAreaSelect',
label: '省市区级联',
helpMessage: ['component模式'],
defaultValue: '140302',
colProps: {
span: 12,
},
},
{
field: 'pca1',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'pop1',
component: 'Input',
label: 'JPopup示例',
helpMessage: ['插槽模式'],
slot: 'JPopup',
colProps: {
span: 12,
},
},
{
field: 'pop1',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'JInputPop',
component: 'JInputPop',
label: 'JInputPop',
helpMessage: ['component模式'],
colProps: { span: 12 },
},
{
field: 'JInputPop',
component: 'JEllipsis',
label: '输入值',
colProps: { span: 12 },
},
{
field: 'JTreeDictAsync',
component: 'JTreeDict',
label: '异步JTreeDict',
helpMessage: ['component模式'],
colProps: { span: 12 },
componentProps: { async: true },
},
{
field: 'JTreeDictAsync',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'JSwitch',
component: 'JSwitch',
label: 'JSwitch',
helpMessage: ['component模式'],
colProps: { span: 12 },
},
{
field: 'JSwitch',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'JSwitchSelect',
component: 'JSwitch',
label: 'JSwitchSelect',
helpMessage: ['component模式'],
colProps: { span: 12 },
componentProps: { query: true },
},
{
field: 'JSwitchSelect',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'userSelect2',
component: 'UserSelect',
label: '高级用户选择',
helpMessage: ['component模式'],
colProps: { span: 12 },
},
{
field: 'userSelect2',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'superQuery',
component: 'Input',
label: '高级查询',
helpMessage: ['插槽模式'],
slot: 'superQuery',
colProps: { span: 12 },
},
{
field: 'superQuery',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'superQuery1',
component: 'Input',
label: '高级查询',
helpMessage: ['插槽模式-自己保存查询条件'],
slot: 'superQuery1',
colProps: { span: 12 },
},
{
field: 'superQuery1',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'pop2',
component: 'JPopupDict',
label: 'JPopupDict示例',
colProps: {
span: 12,
},
componentProps:{
placeholder: '请选择',
dictCode: 'report_user,username,id',
multi: true,
},
},
{
field: 'pop2',
component: 'JEllipsis',
label: '选中值',
colProps: {
span: 12,
},
},
{
field: 'sex',
component: 'JDictSelectTag',
label: '性别(控制下方课程options)',
helpMessage: ['component模式','性别不同,下方课程展示选项不同'],
componentProps: {
dictCode: 'sex',
type: 'radioButton',
onChange: (value) => {
console.log(value);
},
},
colProps: {
span: 12,
},
},
{
field: 'sex',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'course',
component: 'Select',
label: '课程',
dynamicPropskey: 'options',
dynamicPropsVal: ({ model }) => {
let options;
if (model.sex == 1) {
return [
{ value: '0', label: 'java - 男' },
{ value: '1', label: 'vue - 男' },
];
} else if (model.sex == 2) {
return [
{ value: '2', label: '瑜伽 - 女' },
{ value: '3', label: '美甲 - 女' },
];
} else {
return [];
}
},
componentProps: {
disabled: false,
},
colProps: {
span: 12,
},
},
{
field: 'course',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'field100',
component: 'JInputSelect',
label: 'JInputSelect',
helpMessage: ['component模式'],
componentProps: {
selectPlaceholder: '可选择系统变量',
inputPlaceholder: '请输入',
selectWidth:'200px',
options: [
{
label: '登录用户账号',
value: '#{sys_user_code}',
},
{
label: '登录用户名称',
value: '#{sys_user_name}',
},
{
label: '当前日期',
value: '#{sys_date}',
},
{
label: '当前时间',
value: '#{sys_time}',
},
{
label: '登录用户部门',
value: '#{sys_org_code}',
},
{
label: '用户拥有部门',
value: '#{sys_multi_org_code}',
},
{
label: '登录用户租户',
value: '#{tenant_id}',
},
],
},
colProps: {
span: 12,
},
},
{
field: 'field100',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'JAreaLinkage',
component: 'JAreaLinkage',
label: '省市区选择',
colProps: {
span: 12,
},
},
{
field: 'JAreaLinkage',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
{
field: 'orderAuth',
component: 'Input',
label: '指令权限',
helpMessage: ['有权限右侧的"选中值"可见,否则不可见'],
colProps: {
span: 12,
},
},
{
field: 'orderAuth',
auth: 'demo:order:auth',
component: 'JEllipsis',
label: '选中值',
colProps: { span: 12 },
},
];

@ -170,7 +170,7 @@ function go_xiangmushu(record) {
// //
function go_yusuanshu(record) { function go_yusuanshu(record) {
// go('/comp/jeecg/basic?id=' +'666'); // go('/comp/jeecg/basic?id=' +'666');
go('/projectApplication/kejigongguan/xiangmushu?id='+record.id); go('/projectApplication/kejigongguan/yusuanshu?id='+record.id);
} }

@ -22,11 +22,11 @@ export const searchFormSchema: FormSchema[] = [
]; ];
// //
export const formSchema: FormSchema[] = [ export const formSchema: FormSchema[] = [
{ /*{
label: '项目表id', label: '项目表id',
field: 'projectId', field: 'projectId',
component: 'Input', component: 'Input',
}, },*/
{ {
label: '上传附件', label: '上传附件',
field: 'fileUrl', field: 'fileUrl',

Loading…
Cancel
Save