Browse Source

新增优化需求

master
zhouhaibin 13 hours ago
parent
commit
0c2ba9d801
  1. 3
      package.json
  2. 40
      src/api/common/api.ts
  3. 2
      src/views/ProcessApprovalSubPage/component/ApprovalFromPage.vue
  4. 7
      src/views/ProcessApprovalSubPage/component/PlanFileDetail.vue
  5. 10
      src/views/ProcessApprovalSubPage/planFileApproval.vue
  6. 30
      src/views/ProcessApprovalSubPage/uploadURTfileApproval.vue
  7. 14
      src/views/activiti/task/list.data.ts
  8. 2
      src/views/dashboard/workbench/components/basic_bar.vue
  9. 7
      src/views/myWork/completed/index.vue
  10. 90
      src/views/projectBoard/urt/qingkuang/index.vue
  11. 24
      src/views/projectBoard/urt/qingkuang/qingkuang.api.ts
  12. 231
      src/views/projectBoard/urt/qingkuang/qingkuang.data.ts
  13. 100
      src/views/projectBoard/urt/urt/index.vue
  14. 24
      src/views/projectBoard/urt/urt/urt.api.ts
  15. 182
      src/views/projectBoard/urt/urt/urt.data.ts
  16. 6
      src/views/projectLib/projectPlan/addPlanFile.vue
  17. 2
      src/views/projectLib/projectPlan/projectPlan.api.ts
  18. 4
      src/views/projectLib/projectPlan/uploadURTfile.vue
  19. 6
      src/views/projectLib/projectPlan/viewPlanDetail.vue
  20. 6
      src/views/projectSummary/planSummary/SetWanCheng.vue
  21. 2
      src/views/projectSummary/planSummary/ShowDetailPage.vue
  22. 127
      src/views/projectSummary/planSummary/index.vue
  23. 47
      src/views/projectSummary/planSummary/planSummary.data.ts
  24. 32
      src/views/projectSummary/planSummary/setElstepchild.vue
  25. 17
      src/views/projectSummary/planSummary/settu.vue

3
package.json

@ -112,7 +112,8 @@
"xe-utils": "^3.5.11",
"xlsx": "^0.18.5",
"element-plus": "2.2.28",
"vue3-tree-org":"^4.2.2"
"vue3-tree-org":"^4.2.2",
"streamsaver":"^2.0.6"
},
"devDependencies": {
"@commitlint/cli": "^17.6.6",

40
src/api/common/api.ts

@ -1,5 +1,11 @@
import { defHttp } from '@/utils/http/axios';
import { message } from 'ant-design-vue';
import * as streamSaver from "streamsaver"
import { getToken } from '@/utils/auth';
import { useGlobSetting } from '@/hooks/setting';
const { apiUrl } = useGlobSetting();
/**
*
* @param url
@ -28,7 +34,40 @@ export const downloadFile = (url, fileName?, parameter?) => {
}
});
};
export const downloadResource = async (url, fileName,parameter) =>{
url = apiUrl + url+"?path="+encodeURIComponent(parameter.path)+"&fileName="+parameter.fileName
let filename = fileName
if (!fileName) {
filename = url.substring(url.lastIndexOf('/') + 1);
}
console.log(filename,'filename')
return fetch(url, {
method: 'GET',
cache: 'no-cache',
headers:{
Authorization: `Bearer ${getToken()}`,
// clientId: clientId,
},
}).then(res => {
const fileStream = streamSaver.createWriteStream(filename,{
//增加小视图,体现下载进度条与总大小
size : res.headers.get("content-length")
})
const readableStream = res.body
if (window.WritableStream && readableStream.pipeTo) {
return readableStream.pipeTo(fileStream)
}
window.writer = fileStream.getWriter()
const reader = res.body.getReader()
const pump = () => reader.read()
.then(res => res.done
? window.writer.close()
: window.writer.write(res.value).then(pump))
pump()
})
}
/**
* excel导出
* @param url
@ -41,6 +80,7 @@ export const getFileblob = (url, parameter) => {
url: url,
params: parameter,
responseType: 'blob',
timeout: 1000 * 60 * 5, // 5分钟超时
},
{ isTransformResponse: false }
);

2
src/views/ProcessApprovalSubPage/component/ApprovalFromPage.vue

@ -29,7 +29,7 @@ onUpdated(()=>{
options: dataTo.buttons,
}
})
if(projectName.value=="可研报告稿编制"&&taskName.value=="总咨询单位"){
if(projectName.value=="可研报告送审稿编制"&&taskName.value=="总咨询单位"){
updateSchema({
field: 'modifyNum',
ifShow: ({ values }) => {

7
src/views/ProcessApprovalSubPage/component/PlanFileDetail.vue

@ -15,7 +15,7 @@ import { BasicTable, ActionItem, TableAction, useTable } from '@/components/Tabl
import { PlaninfoFiletableColumns } from '@/views/projectLib/projectPlan/projectPlan.data';
import { planFilePageList ,getplaninfoByid } from '@/views/projectLib/projectPlan/projectPlan.api'
import { BasicColumn } from '@/components/Table';
import { downloadFile } from "@/api/common/api"
import { downloadFile,downloadResource } from "@/api/common/api"
let dataTo = defineProps(["stage", "planinfoid"])
//
@ -39,7 +39,7 @@ const [registerResourceTable,{setColumns}] = useTable({
onMounted(async()=>{
let details = await getplaninfoByid({planinfoid:dataTo.planinfoid})
console.log("sdsdadad",details)
if(details[0].taskName=="可研报告稿编制"){
if(details[0].taskName=="可研报告送审稿编制"){
setColumns(PlaninfoFiletableColumns)
}else{
setColumns(PlaninfoFiletableColumns12)
@ -63,7 +63,8 @@ function handleDetailpage(record) {
//
console.log("我这一行的数据是", param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
// downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
downloadResource("/huzhouUploadfileinfo/downloadfile", record.documentName,param)
}
const PlaninfoFiletableColumns12: BasicColumn[] = [
{

10
src/views/ProcessApprovalSubPage/planFileApproval.vue

@ -196,7 +196,7 @@
}
if (data[0].taskName.indexOf('可研报告初稿编制') >= 0) {
tableDataFiles.value.push('《项目建议书》');
} else if (data[0].taskName.indexOf('可研报告稿编制') >= 0) {
} else if (data[0].taskName.indexOf('可研报告送审稿编制') >= 0) {
tableDataFiles.value.push('《项目建议书》');
tableDataFiles.value.push('《补充说明》');
@ -404,12 +404,12 @@
// type ==0type ==1
let dataSource = await getDataSource();
if (
dataSource[0].taskName.indexOf('可研技术审查报告确认') == -1 ||
dataSource[0].taskName.indexOf('可研报告初稿编制') == -1 ||
dataSource[0].taskName.indexOf('可研报告稿编制') == -1
dataSource[0].taskName.indexOf('可研技术审查报告确认') == -1 &&
dataSource[0].taskName.indexOf('可研报告初稿编制') == -1 &&
dataSource[0].taskName.indexOf('可研报告送审稿编制') == -1
) {
if (fileList.length != tableDataFiles.value.length) {
message.error('上传的文件不符合要求请检查');
message.error('上传的文件数量与项目计划资料数量不一致,请检查');
return;
}
}

30
src/views/ProcessApprovalSubPage/uploadURTfileApproval.vue

@ -3,7 +3,7 @@
<el-divider content-position="left">项目名称 {{ dataTo.record.projectName }} </el-divider>
<BasicForm @register="registerMoneyForm" />
<el-divider content-position="left">联合技术审查文件详情</el-divider>
<PlanFileDetail :planinfoid="projectId" :stage="1" :key="planFileDetailKey"/>
<PlanFileDetail :planinfoid="projectId" :stage="1" :key="planFileDetailKey" />
</div>
<!-- <div>
<el-divider content-position="left">联合技术审查审批文件详情</el-divider>
@ -68,8 +68,9 @@
import PlanFileDetail from '@/views/ProcessApprovalSubPage/component/PlanFileDetail.vue';
import { EstimateAmountFormSchemas } from '@/views/projectLib/projectPlan/projectPlan.data';
import { queryProjectInfoById } from '@/views/projectLib/projectInfo/projectInfo.api';
import {getplaninfoByid} from '@/views/projectLib/projectPlan/projectPlan.api';
import { getplaninfoByid } from '@/views/projectLib/projectPlan/projectPlan.api';
import { useForm, BasicForm } from '@/components/Form';
import { message } from 'ant-design-vue';
let dataTo = defineProps(['record']);
console.log('routerouterouteroute', dataTo.record);
@ -90,7 +91,7 @@
let fileAdviceList = reactive<Array<any>>([]);
const [
registerMoneyForm,
{ getFieldsValue: getMoneyFieldsValue, setFieldsValue: setMoneyFieldsValue, setProps},
{ getFieldsValue: getMoneyFieldsValue, setFieldsValue: setMoneyFieldsValue, setProps },
] = useForm({
//
schemas: EstimateAmountFormSchemas,
@ -116,14 +117,14 @@
procesType: dataTo.record.procesType,
});
showApprovalForm.value = resButton.showApprovalForm;
let resList=await getplaninfoByid({planinfoid:projectId})
let resList = await getplaninfoByid({ planinfoid: projectId });
let param: any = {
projectid: resList[0].projectId
projectid: resList[0].projectId,
};
let res = await queryProjectInfoById(param);
setMoneyFieldsValue(res);
setProps({disabled: resButton.isEdit == true ? false : true})
planFileDetailKey.value +=1
setProps({ disabled: resButton.isEdit == true ? false : true });
planFileDetailKey.value += 1;
});
function removeFile(option) {
@ -172,6 +173,21 @@
params.append('taskId', taskid);
params.append('processInstanceId', processInstanceId);
if (fileList.length > 0) {
let cunzai = false;
fileList.forEach((x) => {
console.log('xxxxxxxxxx', x, x.file);
if (x.file.name.includes('部门联审意见')) {
cunzai = true;
}
});
if (!cunzai) {
message.error('请上传《部门联审意见》');
return;
}
if (fileList.length <= 1) {
message.error('请上传终稿');
return;
}
fileList.forEach((x) => {
params.append('file', x.file);
});

14
src/views/activiti/task/list.data.ts

@ -18,13 +18,13 @@ export const searchFormSchema: FormSchema[] = [
// 表格列数据
export const columns: BasicColumn[] = [
{
title: '流水号',
dataIndex: 'processInstanceId',
sortField: 'art.proc_inst_id_',
width: 100,
sorter: true,
},
// {
// title: '流水号',
// dataIndex: 'processInstanceId',
// sortField: 'art.proc_inst_id_',
// width: 100,
// sorter: true,
// },
// {
// title: '业务',
// dataIndex: 'businessTitle',

2
src/views/dashboard/workbench/components/basic_bar.vue

@ -50,7 +50,7 @@ option = {
},
data: parameter.data.totalMoney, //
itemStyle: {
color: 'rgba(128, 128, 128, 2)',
color: '#2E54A1',
}
},

7
src/views/myWork/completed/index.vue

@ -52,6 +52,13 @@ function getTableAction(record): ActionItem[] {
},
onClick: handleEdit.bind(null, record),
},
{
label: "作废",
ifShow: ()=>{
return record.isrecall=="3"
},
onClick: handleEdit.bind(null, record),
},
{
label: record.processStatus=="已完成"?'查看':'详情',
ifShow: ()=>{

90
src/views/projectBoard/urt/qingkuang/index.vue

@ -0,0 +1,90 @@
<template>
<div>
<a-tabs v-model:activeKey="activeKey" type="card" @change="handleTabChange">
<a-tab-pane key="1" tab="任务牵头处室">
<BasicTable @register="registerTable">
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
</template>
</BasicTable>
</a-tab-pane>
<a-tab-pane key="2" tab="联审部门">
<BasicTable @register="registerURTTable">
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
</template>
</BasicTable>
</a-tab-pane>
</a-tabs>
</div>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table';
import { useModal, BasicModal } from '@/components/Modal';
import { qingkuangcolumns, qingkuangUrtcolumns } from './qingkuang.data';
import { getSuperLeaderApproveInfo, getURTUnApprovedDaysPage } from './qingkuang.api';
const activeKey = ref('1');
const [registerTable, { reload }] = useTable({
title: '详情',
api: getSuperLeaderApproveInfo,
columns: qingkuangcolumns,
useSearchForm: false,
//
// formConfig: {
// schemas: urtFormSchema,
// }
});
const [registerURTTable, { reload: urtreload }] = useTable({
title: '详情',
api: getURTUnApprovedDaysPage,
columns: qingkuangUrtcolumns,
useSearchForm: false,
//
// formConfig: {
// schemas: urtFormSchema,
// }
});
function handleTabChange(key) {
// activeKey.value = key;
if (key === '1') {
reload();
} else {
urtreload();
}
}
// function getDropDownAction(record): ActionItem[] {
// return [
// {
// label: '',
// ifShow: () => {
// return isShowByRoles('manageOrg')
// },
// onClick: handleModify.bind(null, record)
// },
// {
// label: '',
// ifShow: () => {
// return isShowByRoles('manageOrg')
// },
// popConfirm: {
// title: '?',
// confirm: handleDelete.bind(null, record),
// },
// }
// ];
// }
function handleSubmit(record) {}
function closeModel() {
reload();
}
</script>
<style scoped></style>

24
src/views/projectBoard/urt/qingkuang/qingkuang.api.ts

@ -0,0 +1,24 @@
import { defHttp } from '@/utils/http/axios';
export enum Api {
getSuperLeaderApproveInfo = '/workflow/getSuperLeaderApproveInfo',
getURTUnApprovedDaysPage = "/workflow/getURTUnApprovedDaysPage",
showCountBoardByAdminDivision = "/huzhouProject/showCountBoardByAdminDivision",
getDimensionPageSorted= "/huzhouProject/getDimensionPageSorted",
getPageSorted = "/huzhouProject/getPageSorted",
}
/**
*
*/
export const getSuperLeaderApproveInfo = (params?) => defHttp.get({ url: Api.getSuperLeaderApproveInfo,params})
export const getURTUnApprovedDaysPage = (params?) => defHttp.get({ url: Api.getURTUnApprovedDaysPage,params})
// export const getDimensionPageSorted = (params) => defHttp.get({ url: Api.getDimensionPageSorted,params })
// export const getPageSorted = (params) => defHttp.get({ url: Api.getPageSorted,params })
// export const submitplaninfoUploadFile = (params?) =>defHttp.post({ url: Api.submitplaninfoUploadFile,headers:{ "Content-Type": "multipart/form-data" }, params })

231
src/views/projectBoard/urt/qingkuang/qingkuang.data.ts

@ -0,0 +1,231 @@
import { FormSchema } from '@/components/Form';
import { BasicColumn } from '@/components/Table';
export const qingkuangcolumns: BasicColumn[] = [
{
title: '上级指导处室',
dataIndex: 'superLeader',
format: 'dict|superLeader',
resizable: true
},
{
title: '改革所属项目',
dataIndex: 'reformName',
format: 'dict|reformTasks',
resizable: true
},
{
title: '处理人',
dataIndex: 'nickname',
},
{
title: '手机号',
dataIndex: 'phone',
},
{
title: '未审批流程数',
dataIndex: 'unapprovedCount',
},
{
title: '2天未审批流程数',
dataIndex: 'unapprovedCount2d',
},
{
title: '3天未审批流程数',
dataIndex: 'unapprovedCount3d',
},
{
title: '5天未审批流程数',
dataIndex: 'unapprovedCount5d',
},
{
title: '超过5天未审批流程数',
dataIndex: 'unapprovedCountOver5d',
}
];
export const qingkuangUrtcolumns: BasicColumn[] = [
{
title: '联审部门',
dataIndex: 'urtDep',
resizable: true
},
{
title: '处理人',
dataIndex: 'nickname',
},
{
title: '手机号',
dataIndex: 'phone',
},
{
title: '未审批流程数',
dataIndex: 'unapprovedCount',
},
{
title: '2天未审批流程数',
dataIndex: 'unapprovedCount2d',
},
{
title: '3天未审批流程数',
dataIndex: 'unapprovedCount3d',
},
{
title: '5天未审批流程数',
dataIndex: 'unapprovedCount5d',
},
{
title: '超过5天未审批流程数',
dataIndex: 'unapprovedCountOver5d',
}
];
export const danweizhutisearchFormSchema: FormSchema[] = [
{
//标题名称
label: '责任单位',
//字段
field: 'dutyWorkplace',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
{
label: '行政区划',
field: 'adminDivision',
component: 'Input',
labelWidth: 'auto'
//colProps: { span: 6 },
},
{
//标题名称
label: '单位属性',
//字段
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
];
export const shifanxiangmucolumns: BasicColumn[] = [
{
title: '项目名称',
dataIndex: 'projectName',
resizable: true,
ellipsis: false
},
{
title: '行政区划',
dataIndex: 'adminDivision',
resizable: true,
sorter: true,
},
{
title: '责任单位',
dataIndex: 'dutyWorkplace',
resizable: true,
sorter: true,
},
{
title: '单位属性',
dataIndex: 'workplaceProperties',
resizable: true,
sorter: true,
},
{
title: '上级指导处室',
dataIndex: 'superLeader',
format: 'dict|superLeader',
resizable: true,
sorter: true,
},
{
title: '合同金额',
dataIndex: 'totalMoney',
resizable: true,
sorter: true,
},
{
title: '合同资金支付率',
dataIndex: 'paymentExecutionRate',
resizable: true,
sorter: true,
},
{
title: '中央资金',
dataIndex: 'centralMoney',
resizable: true,
sorter: true,
},
{
title: '省级资金',
dataIndex: 'provincialMoney',
resizable: true,
sorter: true,
},
{
title: '上级资金支付率',
dataIndex: 'superiorFundExecutionRate',
resizable: true,
sorter: true,
},
{
title: '项目总进度',
dataIndex: 'projectProgress',
resizable: true,
slots: { customRender: 'projectProgress' },
fixed: 'right',
sorter: true,
},
];
export const shifanxiangsearchFormSchema: FormSchema[] = [
{
label: '项目名称',
field: 'projectName',
component: 'Input',
labelWidth: 'auto'
//colProps: { span: 6 },
},
{
label: '行政区划',
field: 'adminDivision',
component: 'Input',
labelWidth: 'auto'
//colProps: { span: 6 },
},
{
//标题名称
label: '责任单位',
//字段
field: 'dutyWorkplace',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
{
//标题名称
label: '单位属性',
//字段
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
{
field: 'superLeader',
label: '上级指导处室',
component: 'DictSelect',
componentProps: {
dictType: 'superLeader',
},
labelWidth: 'auto'
},
];

100
src/views/projectBoard/urt/urt/index.vue

@ -0,0 +1,100 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable">
<template #action="{ record }">
<!-- <TableAction :actions="getTableAction(record)" /> -->
<TableAction :actions="getTableAction(record)"/>
</template>
</BasicTable>
<planinfoFileDetail @register="registerFileInfo" />
</div>
</template>
<script lang="ts" name="system-user" setup>
//ts
import { ref } from 'vue';
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table';
import { useModal, BasicModal } from '@/components/Modal';
import { urtgcolumns, urtFormSchema } from './urt.data';
import { getURTProcessPage } from './urt.api';
const [registerFileInfo, { openModal: openFileInfo }] = useModal(); //
import planinfoFileDetail from '@/views/projectLib/projectPlan/planinfoFileDetail.vue';
const [registerTable, { reload, getForm }] = useTable({
title: '详情',
api: getURTProcessPage,
columns: urtgcolumns,
useSearchForm: true,
actionColumn: {
width: 140,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
},
//
formConfig: {
schemas: urtFormSchema,
}
});
function getTableAction(record): ActionItem[] {
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
}
];
}
function handleDetail(record) {
openFileInfo(true, {
planinfoid: record.planinfoid,
taskName: record.taskName,
isfinish: record.isfinish,
projectid: record.id,
});
}
// function getDropDownAction(record): ActionItem[] {
// return [
// {
// label: '',
// ifShow: () => {
// return isShowByRoles('manageOrg')
// },
// onClick: handleModify.bind(null, record)
// },
// {
// label: '',
// ifShow: () => {
// return isShowByRoles('manageOrg')
// },
// popConfirm: {
// title: '?',
// confirm: handleDelete.bind(null, record),
// },
// }
// ];
// }
function handleAdd() {
openModal(true, { id: null })
}
function handleModify(record) {
openModal(true, { id: record.id })
}
function handleSubmit(record) {
}
function closeModel() {
reload()
}
</script>
<style scoped></style>

24
src/views/projectBoard/urt/urt/urt.api.ts

@ -0,0 +1,24 @@
import { defHttp } from '@/utils/http/axios';
export enum Api {
getURTProcessPage = '/workflow/getURTProcessPage',
showCountBoardByReformName = "/huzhouProject/showCountBoardByReformName",
showCountBoardByAdminDivision = "/huzhouProject/showCountBoardByAdminDivision",
getDimensionPageSorted= "/huzhouProject/getDimensionPageSorted",
getPageSorted = "/huzhouProject/getPageSorted",
}
/**
*
*/
export const getURTProcessPage = (params?) => defHttp.get({ url: Api.getURTProcessPage,params})
// export const showCountBoardByAdminDivision = (params?) => defHttp.get({ url: Api.showCountBoardByAdminDivision,params})
// export const getDimensionPageSorted = (params) => defHttp.get({ url: Api.getDimensionPageSorted,params })
// export const getPageSorted = (params) => defHttp.get({ url: Api.getPageSorted,params })
// export const submitplaninfoUploadFile = (params?) =>defHttp.post({ url: Api.submitplaninfoUploadFile,headers:{ "Content-Type": "multipart/form-data" }, params })

182
src/views/projectBoard/urt/urt/urt.data.ts

@ -0,0 +1,182 @@
import { FormSchema } from '@/components/Form';
import { BasicColumn } from '@/components/Table';
export const urtgcolumns: BasicColumn[] = [
{
title: '项目名称',
dataIndex: 'projectName',
resizable: true,
ellipsis: false,
},
{
title: '市卫生健康委',
dataIndex: 'shwjk',
ellipsis: false,
},
{
title: '市财政局',
dataIndex: 'sczj',
ellipsis: false,
},
{
title: '市发展改革委',
dataIndex: 'sfzgw',
ellipsis: false,
},
{
title: '市数据局',
dataIndex: 'ssjj',
ellipsis: false,
},
{
title: '市委网信办',
dataIndex: 'swxb',
ellipsis: false,
},
{
title: '市密码管理局',
dataIndex: 'smmglj',
ellipsis: false,
},
{
title: '市公安局',
dataIndex: 'sgaj',
ellipsis: false,
}
];
export const urtFormSchema: FormSchema[] = [
{
//标题名称
label: '项目名称',
//字段
field: 'projectName',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
];
export const shifanxiangmucolumns: BasicColumn[] = [
{
title: '项目名称',
dataIndex: 'projectName',
resizable: true,
ellipsis:false
},
{
title: '行政区划',
dataIndex: 'adminDivision',
resizable: true,
sorter: true,
},
{
title: '责任单位',
dataIndex: 'dutyWorkplace',
resizable: true,
sorter: true,
},
{
title: '单位属性',
dataIndex: 'workplaceProperties',
resizable: true,
sorter: true,
},
{
title: '上级指导处室',
dataIndex: 'superLeader',
format: 'dict|superLeader',
resizable: true,
sorter: true,
},
{
title: '合同金额',
dataIndex: 'totalMoney',
resizable: true,
sorter: true,
},
{
title: '合同资金支付率',
dataIndex: 'paymentExecutionRate',
resizable: true,
sorter: true,
},
{
title: '中央资金',
dataIndex: 'centralMoney',
resizable: true,
sorter: true,
},
{
title: '省级资金',
dataIndex: 'provincialMoney',
resizable: true,
sorter: true,
},
{
title: '上级资金支付率',
dataIndex: 'superiorFundExecutionRate',
resizable: true,
sorter: true,
},
{
title: '项目总进度',
dataIndex: 'projectProgress',
resizable: true,
slots: { customRender: 'projectProgress' },
fixed: 'right',
sorter: true,
},
];
export const shifanxiangsearchFormSchema: FormSchema[] = [
{
label: '项目名称',
field: 'projectName',
component: 'Input',
labelWidth: 'auto'
//colProps: { span: 6 },
},
{
label: '行政区划',
field: 'adminDivision',
component: 'Input',
labelWidth: 'auto'
//colProps: { span: 6 },
},
{
//标题名称
label: '责任单位',
//字段
field: 'dutyWorkplace',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
{
//标题名称
label: '单位属性',
//字段
field: 'workplaceProperties',
//组件 支持组件详见 components/Form/src/types/index.ts 中的 ComponentType
component: 'Input',
labelWidth: 'auto'
},
{
field: 'superLeader',
label: '上级指导处室',
component: 'DictSelect',
componentProps: {
dictType: 'superLeader',
},
labelWidth: 'auto'
},
];

6
src/views/projectLib/projectPlan/addPlanFile.vue

@ -11,7 +11,7 @@
<el-divider content-position="left" v-if="dataTo.taskName.indexOf('可研报告初稿编制') >= 0"
>支持上传文件数量为1-2</el-divider
>
<el-divider content-position="left" v-if="dataTo.taskName.indexOf('可研报告稿编制') >= 0"
<el-divider content-position="left" v-if="dataTo.taskName.indexOf('可研报告送审稿编制') >= 0"
>支持上传文件数量为1-3</el-divider
>
<el-form ref="importFormRef">
@ -187,12 +187,12 @@
//稿稿1-2
if (
dataTo.taskName.indexOf('可研报告初稿编制') >= 0 ||
dataTo.taskName.indexOf('可研报告稿编制') >= 0
dataTo.taskName.indexOf('可研报告送审稿编制') >= 0
) {
//
} else {
if (fileList.length != dataTo.files.length && dataTo.type == 0) {
message.error('上传的文件不符合要求请检查');
message.error('上传的文件数量与项目计划资料数量不一致,请检查');
return;
}
}

2
src/views/projectLib/projectPlan/projectPlan.api.ts

@ -5,6 +5,8 @@ import { e } from 'unocss';
export enum Api {
saveprojectInfo = "",
projectPlanPageList = '/huzhouPlan/projectPlanPageList',
// projectPlanPageList = '/huzhouProject/import',
queryPlanModuleDetailPage = "/huzhouPlan/queryPlanModuleDetailPage",
queryPlanModuleone = '/huzhouPlan/queryPlanModuleone',
saveProjectPlan = '/huzhouPlan/saveProjectPlan',

4
src/views/projectLib/projectPlan/uploadURTfile.vue

@ -165,6 +165,10 @@
message.error('请上传《部门联审意见》');
return;
}
if (fileList.length <=1) {
message.error('请上传终稿');
return;
}
if (await validateMoneyForm()) {
let moneydata = await getMoneyFieldsValue();
// // 使form

6
src/views/projectLib/projectPlan/viewPlanDetail.vue

@ -248,7 +248,7 @@
record.isfinish ==2 &&
record.taskFile?.length > 0 &&(
record.taskName == '可研报告初稿编制' ||
record.taskName == '可研报告稿编制')
record.taskName == '可研报告送审稿编制')
) {
if (isShowByRoles('projectContact')) {
return true;
@ -281,7 +281,7 @@
}
if (record.taskName.indexOf('可研报告初稿编制') >= 0) {
fileArr.value.push("《项目建议书》");
}else if (record.taskName.indexOf('可研报告稿编制') >= 0) {
}else if (record.taskName.indexOf('可研报告送审稿编制') >= 0) {
fileArr.value.push("《项目建议书》");
fileArr.value.push("《补充说明》");
@ -299,7 +299,7 @@
}
if (record.taskName.indexOf('可研报告初稿编制') >= 0) {
fileArr.value.push("《项目建议书》");
}else if (record.taskName.indexOf('可研报告稿编制') >= 0) {
}else if (record.taskName.indexOf('可研报告送审稿编制') >= 0) {
fileArr.value.push("《项目建议书》");
fileArr.value.push("《补充说明》");

6
src/views/projectSummary/planSummary/SetWanCheng.vue

@ -3,7 +3,7 @@
<BasicModal
v-bind="$attrs"
@register="registerModal"
title="入库项目汇总详情"
title="填写线下联审"
width="1700px"
:showOkBtn="false"
:showCancelBtn="false"
@ -32,7 +32,7 @@
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table';
import { useModalInner, BasicModal } from '@/components/Modal';
import {
detailColumn,
detailColumnshao,
searchFormSchema,
} from '@/views/projectSummary/planSummary/planSummary.data';
import {
@ -52,7 +52,7 @@
const [registerModal, { closeModal }] = useModalInner();
const [registerTable, { getForm, setProps }] = useTable({
api: getProjectDetailPage,
columns: detailColumn,
columns: detailColumnshao,
showIndexColumn: false,
useSearchForm: true,
actionColumn: {

2
src/views/projectSummary/planSummary/ShowDetailPage.vue

@ -3,7 +3,7 @@
<BasicModal
v-bind="$attrs"
@register="registerModal"
title="入库项目汇总详情"
title="项目汇总详情"
width="1700px"
:showOkBtn="false"
:showCancelBtn="false"

127
src/views/projectSummary/planSummary/index.vue

@ -2,13 +2,55 @@
<PageWrapper dense>
<!--引用表格-->
<div>
<a-tabs v-model:activeKey="activeKey" type="card">
<a-tabs v-model:activeKey="activeKey" type="card" @change="handleTabChange">
<a-tab-pane key="1" tab="入库项目汇总(按任务)">
<BasicTable @register="registerRenwuTable">
<template #toolbar>
<div class="text-base font-bold">单位万元</div>
<a-button type="primary" @click="showMore('renwu')" shape="round">更多</a-button>
</template>
<template #headerTop>
<div class="container mx-auto mt-4 mb-4 h-20">
<div class="grid grid-cols-4 gap-4 h-full">
<div class="bg-[#1890FF] opacity-100 h-full">
<div class="grid grid-cols-4 gap-1 h-full">
<div class="col-span-3 mt-4 ml-4 text-white">项目数量</div>
<div
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold "
>{{ planSummary.projectNum }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-90 h-full">
<div class="grid grid-cols-4 gap-1 h-full">
<div class="col-span-3 mt-4 ml-4 text-white">项目总进度</div>
<div
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold mr-20"
>{{planSummary.projectProgress }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-85 h-full">
<div class="grid grid-cols-5 gap-1 h-full">
<div class="col-span-2 mt-4 ml-4 text-white">总申报资金</div>
<div
class="col-span-2 flex justify-center items-center text-white text-4xl font-bold"
>{{ planSummary.totalMoney }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-80 h-full">
<div class="grid grid-cols-5 gap-1 h-full">
<div class="col-span-2 mt-4 ml-4 text-white">总中央资金</div>
<div
class="col-span-2 flex justify-center items-center text-white text-4xl font-bold "
>{{ planSummary.centralMoney }}</div
>
</div>
</div>
</div>
</div>
</template>
</BasicTable>
</a-tab-pane>
<a-tab-pane key="2" tab="入库项目汇总(按层级)">
@ -17,6 +59,48 @@
<div class="text-base font-bold">单位万元</div>
<a-button type="primary" @click="showMore('cengji')" shape="round">更多</a-button>
</template>
<template #headerTop>
<div class="container mx-auto mt-4 mb-4 h-20">
<div class="grid grid-cols-4 gap-4 h-full">
<div class="bg-[#1890FF] opacity-100 h-full">
<div class="grid grid-cols-4 gap-1 h-full">
<div class="col-span-3 mt-4 ml-4 text-white">项目数量</div>
<div
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold "
>{{ planSummary.projectNum }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-90 h-full">
<div class="grid grid-cols-4 gap-1 h-full">
<div class="col-span-3 mt-4 ml-4 text-white">项目总进度</div>
<div
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold mr-20"
>{{planSummary.projectProgress }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-85 h-full">
<div class="grid grid-cols-5 gap-1 h-full">
<div class="col-span-2 mt-4 ml-4 text-white">总申报资金</div>
<div
class="col-span-2 flex justify-center items-center text-white text-4xl font-bold"
>{{ planSummary.totalMoney }}</div
>
</div>
</div>
<div class="bg-[#1890FF] opacity-80 h-full">
<div class="grid grid-cols-5 gap-1 h-full">
<div class="col-span-2 mt-4 ml-4 text-white">总中央资金</div>
<div
class="col-span-2 flex justify-center items-center text-white text-4xl font-bold "
>{{ planSummary.centralMoney }}</div
>
</div>
</div>
</div>
</div>
</template>
</BasicTable>
</a-tab-pane>
</a-tabs>
@ -41,9 +125,14 @@
const [register, { openModal }] = useModal();
onMounted(async () => {});
let planSummary = ref<Array<any>>([]);
let planSummary = ref<any>({
projectNum: '',
centralMoney: '',
totalMoney: '',
projectProgress: '',
});
let activeKey = ref('1');
const [registerRenwuTable] = useTable({
const [registerRenwuTable,{ reload:rwload }] = useTable({
api: getProjectSummaryPageByTask,
title: '入库项目汇总',
columns: renwuColumn,
@ -59,7 +148,7 @@
// slots: { customRender: 'action' },
// },
});
const [registerCengjiTable] = useTable({
const [registerCengjiTable,{ reload:cjload }] = useTable({
api: getProjectSummaryPage,
title: '入库项目汇总',
columns: cengjiColumn,
@ -87,23 +176,41 @@
console.log(type);
}
function onSummary(tableData: Recordable[]) {
const totals = mapTableTotalSummary(tableData, ["projectNum", 'projectProgress',"totalMoney","centralMoney"]);
const totals = mapTableTotalSummary(tableData, [
'projectNum',
'projectProgress',
'totalMoney',
'centralMoney',
]);
console.log('onSummary****totals>>>', totals);
planSummary.value = {
projectNum: totals.projectNum,
centralMoney: (totals.centralMoney/10000).toFixed(2),
totalMoney: (totals.totalMoney/10000).toFixed(2),
projectProgress: ((totals.projectProgress / tableData.length)*100).toFixed(2)+"%",
}
return [
// totals,
// // totals,
{
reformName: '总计',
// superLeader:"",
dutyWorkplace: '总计',
//
projectNum: totals.projectNum ,
centralMoney:totals.centralMoney,
totalMoney:totals.totalMoney,
projectNum: totals.projectNum,
centralMoney: totals.centralMoney,
totalMoney: totals.totalMoney,
projectProgress: (totals.projectProgress / tableData.length).toFixed(2),
},
];
}
function handleTabChange(key) {
// activeKey.value = key;
if (key === '1') {
rwload();
} else {
cjload();
}
}
</script>
<style scoped>

47
src/views/projectSummary/planSummary/planSummary.data.ts

@ -173,7 +173,7 @@ export const renwuColumn: BasicColumn[] = [
let progress: number = record.projectProgress * 100
return progress.toFixed(0) + "%"
},
sorter: true,
// sorter: true,
},
{
title: "总申报资金",
@ -192,7 +192,7 @@ export const renwuColumn: BasicColumn[] = [
let money: number = record.centralMoney / 10000
return money.toFixed(2)
},
sorter: true,
// sorter: true,
},
];
@ -281,7 +281,7 @@ export const cengjiColumn: BasicColumn[] = [
let progress: number = record.projectProgress * 100
return progress.toFixed(0) + "%"
},
sorter: true,
// sorter: true,
},
{
title: "总申报资金",
@ -300,7 +300,7 @@ export const cengjiColumn: BasicColumn[] = [
let money: number = record.centralMoney / 10000
return money.toFixed(2)
},
sorter: true,
// sorter: true,
},
];
@ -395,7 +395,7 @@ export const detailColumn: BasicColumn[] = [
filters: [
{ text: '可研报告初稿编制', value: '可研报告初稿编制' },
{ text: '可研技术审查报告确认', value: '可研技术审查报告确认' },
{ text: '可研报告稿编制', value: '可研报告稿编制' },
{ text: '可研报告送审稿编制', value: '可研报告送审稿编制' },
{ text: '造价评估报告确认', value: '造价评估报告确认' },
{ text: '联合技术审查', value: '联合技术审查' },
{ text: '集中核验', value: '集中核验' },
@ -409,7 +409,7 @@ export const detailColumn: BasicColumn[] = [
],
},
{
title: "文件是否已上传",
title: "当前审批节点",
dataIndex: "isUpload",
customRender: ({ record }) => {
if (record.isUpload == 1) {
@ -424,7 +424,7 @@ export const detailColumn: BasicColumn[] = [
],
},
{
title: "线下是否已完成",
title: "线下阶段完成情况",
dataIndex: "isOffline",
customRender: ({ record }) => {
if (record.isOffline == 1) {
@ -748,4 +748,35 @@ export const searchFormSchema: FormSchema[] = [
labelWidth: 'auto'
},
];
];
export const detailColumnshao: BasicColumn[] = [
{
title: '项目名称',
dataIndex: 'projectName',
},
{
title: '行政区划',
dataIndex: 'adminDivision',
},
{
title: '责任单位',
dataIndex: 'dutyWorkplace',
},
{
title: '单位属性',
dataIndex: 'workplaceProperties',
},
{
title: '改革所属项目',
dataIndex: 'reformName',
format: 'dict|reformTasks',
},
{
title: '上级指导处室',
dataIndex: 'superLeader',
format: 'dict|superLeader',
},
];

32
src/views/projectSummary/planSummary/setElstepchild.vue

@ -3,16 +3,16 @@
<el-step
v-for="(item, index) in dataTo.child"
:key="index"
:status="item.isoffline == 1 ? 'success' : 'wait' "
:status="item.isoffline == 1 ? 'success' : 'wait'"
>
<template #title>
<a-button type="text" @click="handleClickStep(item)">
<template #default>
<div class="flex text-[#0ac00d]" v-if="item.isoffline == 1">
{{ item.taskName }}
{{ item.taskName }}
</div>
<div v-else>
{{ item.taskName }}
<div v-else>
{{ item.taskName }}
</div>
</template>
</a-button>
@ -27,18 +27,30 @@
import { defineProps, ref } from 'vue';
import setElstepchild from './setElstepchild.vue';
import { useModal } from '@/components/Modal';
import { setPlaninfoIsoffline } from '@/views/projectLib/projectPlan/projectPlan.api';
let clickStep = ref<any>([]);
let dataTo = defineProps(['child']);
function handleClickStep(item) {
if(item.isoffline == 1){
if (item.isoffline == 1) {
item.isoffline = 0;
}else{
} else {
item.isoffline = 1;
}
setPlaninfoIsoffline({id:item.id,isoffline:item.isoffline})
console.log(item);
for (let i = 0; i < clickStep.value.length; i++) {
if (clickStep.value[i].id == item.id) {
clickStep.value.splice(i, 1);
break;
}
}
clickStep.value.push(item);
console.log(item, clickStep.value);
}
function getclickStep() {
if (clickStep.value.length == 0) {
return [];
}
return clickStep.value;
}
defineExpose({getclickStep});
</script>
<style lang="less" scoped>
@publicColor: #0ac00d;

17
src/views/projectSummary/planSummary/settu.vue

@ -1,5 +1,6 @@
<template>
<div>
<a-button type="primary" @click="handleSave">保存</a-button>
<el-row>
<el-col :span="24">
项目进度<Progress :size="15" :percent="activities[0]?.totalPercent"></Progress>
@ -22,7 +23,7 @@
</div>
</template>
<template #description>
<setElstepchild v-if="item.children != null" :child="item.children"></setElstepchild>
<setElstepchild v-if="item.children != null" :child="item.children" ref="setElstepchildRef"></setElstepchild>
</template>
<template #icon>
<Progress
@ -43,14 +44,24 @@
import { ref, onMounted } from 'vue';
import setElstepchild from './setElstepchild.vue';
import { Progress, message } from 'ant-design-vue';
import { setPlaninfoIsoffline } from '@/views/projectLib/projectPlan/projectPlan.api';
let setElstepchildRef=ref();
let dataTo = defineProps(["res"]);
let activities = ref([]);
onMounted(() => {
activities.value=dataTo.res
});
function handleSave() {
let data0= setElstepchildRef.value[0].getclickStep();
let data1= setElstepchildRef.value[1].getclickStep();
let data2= setElstepchildRef.value[2].getclickStep();
let data3= setElstepchildRef.value[3].getclickStep();
const data = [...data0,...data1,...data2,...data3];
console.log(data);
setPlaninfoIsoffline(data)
message.success('保存成功')
}
</script>
<style scoped>

Loading…
Cancel
Save