Browse Source

新增优化需求

master
zhouhaibin 17 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. 24
      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. 121
      src/views/projectSummary/planSummary/index.vue
  23. 45
      src/views/projectSummary/planSummary/planSummary.data.ts
  24. 20
      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", "xe-utils": "^3.5.11",
"xlsx": "^0.18.5", "xlsx": "^0.18.5",
"element-plus": "2.2.28", "element-plus": "2.2.28",
"vue3-tree-org":"^4.2.2" "vue3-tree-org":"^4.2.2",
"streamsaver":"^2.0.6"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^17.6.6", "@commitlint/cli": "^17.6.6",

40
src/api/common/api.ts

@ -1,5 +1,11 @@
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
import { message } from 'ant-design-vue'; 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 * @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导出 * excel导出
* @param url * @param url
@ -41,6 +80,7 @@ export const getFileblob = (url, parameter) => {
url: url, url: url,
params: parameter, params: parameter,
responseType: 'blob', responseType: 'blob',
timeout: 1000 * 60 * 5, // 5分钟超时
}, },
{ isTransformResponse: false } { isTransformResponse: false }
); );

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

@ -29,7 +29,7 @@ onUpdated(()=>{
options: dataTo.buttons, options: dataTo.buttons,
} }
}) })
if(projectName.value=="可研报告稿编制"&&taskName.value=="总咨询单位"){ if(projectName.value=="可研报告送审稿编制"&&taskName.value=="总咨询单位"){
updateSchema({ updateSchema({
field: 'modifyNum', field: 'modifyNum',
ifShow: ({ values }) => { 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 { PlaninfoFiletableColumns } from '@/views/projectLib/projectPlan/projectPlan.data';
import { planFilePageList ,getplaninfoByid } from '@/views/projectLib/projectPlan/projectPlan.api' import { planFilePageList ,getplaninfoByid } from '@/views/projectLib/projectPlan/projectPlan.api'
import { BasicColumn } from '@/components/Table'; import { BasicColumn } from '@/components/Table';
import { downloadFile } from "@/api/common/api" import { downloadFile,downloadResource } from "@/api/common/api"
let dataTo = defineProps(["stage", "planinfoid"]) let dataTo = defineProps(["stage", "planinfoid"])
// //
@ -39,7 +39,7 @@ const [registerResourceTable,{setColumns}] = useTable({
onMounted(async()=>{ onMounted(async()=>{
let details = await getplaninfoByid({planinfoid:dataTo.planinfoid}) let details = await getplaninfoByid({planinfoid:dataTo.planinfoid})
console.log("sdsdadad",details) console.log("sdsdadad",details)
if(details[0].taskName=="可研报告稿编制"){ if(details[0].taskName=="可研报告送审稿编制"){
setColumns(PlaninfoFiletableColumns) setColumns(PlaninfoFiletableColumns)
}else{ }else{
setColumns(PlaninfoFiletableColumns12) setColumns(PlaninfoFiletableColumns12)
@ -63,7 +63,8 @@ function handleDetailpage(record) {
// //
console.log("我这一行的数据是", param) console.log("我这一行的数据是", param)
downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param) // downloadFile("/huzhouUploadfileinfo/downloadfile", record.documentName, param)
downloadResource("/huzhouUploadfileinfo/downloadfile", record.documentName,param)
} }
const PlaninfoFiletableColumns12: BasicColumn[] = [ const PlaninfoFiletableColumns12: BasicColumn[] = [
{ {

10
src/views/ProcessApprovalSubPage/planFileApproval.vue

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

24
src/views/ProcessApprovalSubPage/uploadURTfileApproval.vue

@ -70,6 +70,7 @@
import { queryProjectInfoById } from '@/views/projectLib/projectInfo/projectInfo.api'; 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 { useForm, BasicForm } from '@/components/Form';
import { message } from 'ant-design-vue';
let dataTo = defineProps(['record']); let dataTo = defineProps(['record']);
console.log('routerouterouteroute', dataTo.record); console.log('routerouterouteroute', dataTo.record);
@ -116,14 +117,14 @@
procesType: dataTo.record.procesType, procesType: dataTo.record.procesType,
}); });
showApprovalForm.value = resButton.showApprovalForm; showApprovalForm.value = resButton.showApprovalForm;
let resList=await getplaninfoByid({planinfoid:projectId}) let resList = await getplaninfoByid({ planinfoid: projectId });
let param: any = { let param: any = {
projectid: resList[0].projectId projectid: resList[0].projectId,
}; };
let res = await queryProjectInfoById(param); let res = await queryProjectInfoById(param);
setMoneyFieldsValue(res); setMoneyFieldsValue(res);
setProps({disabled: resButton.isEdit == true ? false : true}) setProps({ disabled: resButton.isEdit == true ? false : true });
planFileDetailKey.value +=1 planFileDetailKey.value += 1;
}); });
function removeFile(option) { function removeFile(option) {
@ -172,6 +173,21 @@
params.append('taskId', taskid); params.append('taskId', taskid);
params.append('processInstanceId', processInstanceId); params.append('processInstanceId', processInstanceId);
if (fileList.length > 0) { 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) => { fileList.forEach((x) => {
params.append('file', x.file); 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[] = [ export const columns: BasicColumn[] = [
{ // {
title: '流水号', // title: '流水号',
dataIndex: 'processInstanceId', // dataIndex: 'processInstanceId',
sortField: 'art.proc_inst_id_', // sortField: 'art.proc_inst_id_',
width: 100, // width: 100,
sorter: true, // sorter: true,
}, // },
// { // {
// title: '业务', // title: '业务',
// dataIndex: 'businessTitle', // dataIndex: 'businessTitle',

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

@ -50,7 +50,7 @@ option = {
}, },
data: parameter.data.totalMoney, // data: parameter.data.totalMoney, //
itemStyle: { 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), onClick: handleEdit.bind(null, record),
}, },
{
label: "作废",
ifShow: ()=>{
return record.isrecall=="3"
},
onClick: handleEdit.bind(null, record),
},
{ {
label: record.processStatus=="已完成"?'查看':'详情', label: record.processStatus=="已完成"?'查看':'详情',
ifShow: ()=>{ 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" <el-divider content-position="left" v-if="dataTo.taskName.indexOf('可研报告初稿编制') >= 0"
>支持上传文件数量为1-2</el-divider >支持上传文件数量为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 >支持上传文件数量为1-3</el-divider
> >
<el-form ref="importFormRef"> <el-form ref="importFormRef">
@ -187,12 +187,12 @@
//稿稿1-2 //稿稿1-2
if ( if (
dataTo.taskName.indexOf('可研报告初稿编制') >= 0 || dataTo.taskName.indexOf('可研报告初稿编制') >= 0 ||
dataTo.taskName.indexOf('可研报告稿编制') >= 0 dataTo.taskName.indexOf('可研报告送审稿编制') >= 0
) { ) {
// //
} else { } else {
if (fileList.length != dataTo.files.length && dataTo.type == 0) { if (fileList.length != dataTo.files.length && dataTo.type == 0) {
message.error('上传的文件不符合要求请检查'); message.error('上传的文件数量与项目计划资料数量不一致,请检查');
return; return;
} }
} }

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

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

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

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

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

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

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

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

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

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

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

@ -2,13 +2,55 @@
<PageWrapper dense> <PageWrapper dense>
<!--引用表格--> <!--引用表格-->
<div> <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="入库项目汇总(按任务)"> <a-tab-pane key="1" tab="入库项目汇总(按任务)">
<BasicTable @register="registerRenwuTable"> <BasicTable @register="registerRenwuTable">
<template #toolbar> <template #toolbar>
<div class="text-base font-bold">单位万元</div> <div class="text-base font-bold">单位万元</div>
<a-button type="primary" @click="showMore('renwu')" shape="round">更多</a-button> <a-button type="primary" @click="showMore('renwu')" shape="round">更多</a-button>
</template> </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> </BasicTable>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="2" tab="入库项目汇总(按层级)"> <a-tab-pane key="2" tab="入库项目汇总(按层级)">
@ -17,6 +59,48 @@
<div class="text-base font-bold">单位万元</div> <div class="text-base font-bold">单位万元</div>
<a-button type="primary" @click="showMore('cengji')" shape="round">更多</a-button> <a-button type="primary" @click="showMore('cengji')" shape="round">更多</a-button>
</template> </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> </BasicTable>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
@ -41,9 +125,14 @@
const [register, { openModal }] = useModal(); const [register, { openModal }] = useModal();
onMounted(async () => {}); onMounted(async () => {});
let planSummary = ref<Array<any>>([]); let planSummary = ref<any>({
projectNum: '',
centralMoney: '',
totalMoney: '',
projectProgress: '',
});
let activeKey = ref('1'); let activeKey = ref('1');
const [registerRenwuTable] = useTable({ const [registerRenwuTable,{ reload:rwload }] = useTable({
api: getProjectSummaryPageByTask, api: getProjectSummaryPageByTask,
title: '入库项目汇总', title: '入库项目汇总',
columns: renwuColumn, columns: renwuColumn,
@ -59,7 +148,7 @@
// slots: { customRender: 'action' }, // slots: { customRender: 'action' },
// }, // },
}); });
const [registerCengjiTable] = useTable({ const [registerCengjiTable,{ reload:cjload }] = useTable({
api: getProjectSummaryPage, api: getProjectSummaryPage,
title: '入库项目汇总', title: '入库项目汇总',
columns: cengjiColumn, columns: cengjiColumn,
@ -87,10 +176,21 @@
console.log(type); console.log(type);
} }
function onSummary(tableData: Recordable[]) { 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); 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 [ return [
// totals, // // totals,
{ {
reformName: '总计', reformName: '总计',
// superLeader:"", // superLeader:"",
@ -100,10 +200,17 @@
centralMoney: totals.centralMoney, centralMoney: totals.centralMoney,
totalMoney: totals.totalMoney, totalMoney: totals.totalMoney,
projectProgress: (totals.projectProgress / tableData.length).toFixed(2), projectProgress: (totals.projectProgress / tableData.length).toFixed(2),
}, },
]; ];
} }
function handleTabChange(key) {
// activeKey.value = key;
if (key === '1') {
rwload();
} else {
cjload();
}
}
</script> </script>
<style scoped> <style scoped>

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

@ -173,7 +173,7 @@ export const renwuColumn: BasicColumn[] = [
let progress: number = record.projectProgress * 100 let progress: number = record.projectProgress * 100
return progress.toFixed(0) + "%" return progress.toFixed(0) + "%"
}, },
sorter: true, // sorter: true,
}, },
{ {
title: "总申报资金", title: "总申报资金",
@ -192,7 +192,7 @@ export const renwuColumn: BasicColumn[] = [
let money: number = record.centralMoney / 10000 let money: number = record.centralMoney / 10000
return money.toFixed(2) return money.toFixed(2)
}, },
sorter: true, // sorter: true,
}, },
]; ];
@ -281,7 +281,7 @@ export const cengjiColumn: BasicColumn[] = [
let progress: number = record.projectProgress * 100 let progress: number = record.projectProgress * 100
return progress.toFixed(0) + "%" return progress.toFixed(0) + "%"
}, },
sorter: true, // sorter: true,
}, },
{ {
title: "总申报资金", title: "总申报资金",
@ -300,7 +300,7 @@ export const cengjiColumn: BasicColumn[] = [
let money: number = record.centralMoney / 10000 let money: number = record.centralMoney / 10000
return money.toFixed(2) return money.toFixed(2)
}, },
sorter: true, // sorter: true,
}, },
]; ];
@ -395,7 +395,7 @@ export const detailColumn: BasicColumn[] = [
filters: [ filters: [
{ text: '可研报告初稿编制', value: '可研报告初稿编制' }, { text: '可研报告初稿编制', value: '可研报告初稿编制' },
{ text: '可研技术审查报告确认', value: '可研技术审查报告确认' }, { text: '可研技术审查报告确认', value: '可研技术审查报告确认' },
{ text: '可研报告稿编制', value: '可研报告稿编制' }, { 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", dataIndex: "isUpload",
customRender: ({ record }) => { customRender: ({ record }) => {
if (record.isUpload == 1) { if (record.isUpload == 1) {
@ -424,7 +424,7 @@ export const detailColumn: BasicColumn[] = [
], ],
}, },
{ {
title: "线下是否已完成", title: "线下阶段完成情况",
dataIndex: "isOffline", dataIndex: "isOffline",
customRender: ({ record }) => { customRender: ({ record }) => {
if (record.isOffline == 1) { if (record.isOffline == 1) {
@ -749,3 +749,34 @@ export const searchFormSchema: FormSchema[] = [
}, },
]; ];
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',
},
];

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

@ -27,8 +27,7 @@
import { defineProps, ref } from 'vue'; import { defineProps, ref } from 'vue';
import setElstepchild from './setElstepchild.vue'; import setElstepchild from './setElstepchild.vue';
import { useModal } from '@/components/Modal'; import { useModal } from '@/components/Modal';
import { setPlaninfoIsoffline } from '@/views/projectLib/projectPlan/projectPlan.api'; let clickStep = ref<any>([]);
let dataTo = defineProps(['child']); let dataTo = defineProps(['child']);
function handleClickStep(item) { function handleClickStep(item) {
if (item.isoffline == 1) { if (item.isoffline == 1) {
@ -36,9 +35,22 @@
} else { } else {
item.isoffline = 1; item.isoffline = 1;
} }
setPlaninfoIsoffline({id:item.id,isoffline:item.isoffline}) for (let i = 0; i < clickStep.value.length; i++) {
console.log(item); 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> </script>
<style lang="less" scoped> <style lang="less" scoped>
@publicColor: #0ac00d; @publicColor: #0ac00d;

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

@ -1,5 +1,6 @@
<template> <template>
<div> <div>
<a-button type="primary" @click="handleSave">保存</a-button>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
项目进度<Progress :size="15" :percent="activities[0]?.totalPercent"></Progress> 项目进度<Progress :size="15" :percent="activities[0]?.totalPercent"></Progress>
@ -22,7 +23,7 @@
</div> </div>
</template> </template>
<template #description> <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>
<template #icon> <template #icon>
<Progress <Progress
@ -43,14 +44,24 @@
import { ref, onMounted } from 'vue'; import { ref, onMounted } from 'vue';
import setElstepchild from './setElstepchild.vue'; import setElstepchild from './setElstepchild.vue';
import { Progress, message } from 'ant-design-vue'; import { Progress, message } from 'ant-design-vue';
import { setPlaninfoIsoffline } from '@/views/projectLib/projectPlan/projectPlan.api';
let setElstepchildRef=ref();
let dataTo = defineProps(["res"]); let dataTo = defineProps(["res"]);
let activities = ref([]); let activities = ref([]);
onMounted(() => { onMounted(() => {
activities.value=dataTo.res 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> </script>
<style scoped> <style scoped>

Loading…
Cancel
Save