Commit 66686e08 authored by 小费同学阿's avatar 小费同学阿 💬

Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	src/views/statement/tabs/InvestmentPlan.vue
#	src/views/statement/tabs/performance.vue
parents 63222c3d 64c15153
import { defHttp } from '@/utils/http/axios';
//文件下载接口
export const downloadFileFunction = (url: string, params?: any) =>
defHttp.post<any>(
{
responseType: 'blob',
url,
data:params,
headers: {
'Content-Type': 'application/json;charset=UTF-8',
}
},
{errorMessageMode: 'none', isTransformResponse: false}
);
...@@ -5,7 +5,7 @@ import { defHttp } from '@/utils/http/axios'; ...@@ -5,7 +5,7 @@ import { defHttp } from '@/utils/http/axios';
enum Api { enum Api {
//查询list //查询list
GetList = '/pro/settlement/page', GetList = '/pro/reportCenter/settlement/list',
//新增接口 //新增接口
Add = '/pro/settlement/add', Add = '/pro/settlement/add',
//根据id查询详情 //根据id查询详情
......
import { ProjectParams, ProjectModel } from './model/projectModel'; import { ProjectParams, ProjectModel } from './model/projectModel';
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
enum Api { enum Api {
GetList = '/pro/settlement/page', GetList = '/pro/settlement/page',
GetInvestmentPlanList = '/pro/reportCenter/investmentPlan',
} }
export const getList = (params?: ProjectParams) => export const getList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params }); defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
// 获取报表中心投资计划列表数据
export const getInvestmentPlanList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetInvestmentPlanList, data: params });
...@@ -50,7 +50,6 @@ ...@@ -50,7 +50,6 @@
// fixed: undefined, // fixed: undefined,
// }, // },
}); });
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage(); const { createMessage } = useMessage();
function getSelectRowList() { function getSelectRowList() {
// createMessage.info('请在控制台查看!'); // createMessage.info('请在控制台查看!');
......
...@@ -43,10 +43,12 @@ const transform: AxiosTransform = { ...@@ -43,10 +43,12 @@ const transform: AxiosTransform = {
if (!isTransformResponse) { if (!isTransformResponse) {
return res.data; return res.data;
} }
// 错误的时候返回 // 错误的时候返回
if (!res.data) { if (!res.data) {
return res
// return '[HTTP] Request has no return value'; // return '[HTTP] Request has no return value';
throw new Error(t('sys.api.apiRequestFailed'));
} }
// 这里 code,msg 为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式 // 这里 code,msg 为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
......
...@@ -20,14 +20,17 @@ ...@@ -20,14 +20,17 @@
preIcon="ant-design:delete-outlined" preIcon="ant-design:delete-outlined"
danger danger
@click="deleteItem(index)" @click="deleteItem(index)"
> />
</a-button>
</template> </template>
<BasicForm :loading="loading" @register="item.Form[0]" /> <BasicForm :loading="loading" @register="item.Form[0]" />
</PageCard> </PageCard>
<a-button type="dashed" @click="add" preIcon="ei:plus"> 从项目库导入 </a-button> <a-button v-if="!disabled" type="dashed" @click="add" preIcon="ei:plus">
<a-button type="dashed" @click="handleAdd" class="ml-2" preIcon="ei:plus"> 新建项目 </a-button> 从项目库导入
</a-button>
<a-button v-if="!disabled" type="dashed" @click="handleAdd" class="ml-2" preIcon="ei:plus">
新建项目
</a-button>
<projectDrawer v-if="!disabled" @register="registerDrawer" @success="handleSuccess" /> <projectDrawer v-if="!disabled" @register="registerDrawer" @success="handleSuccess" />
<projectlibraryModel v-if="!disabled" @register="register" @close="handleNewData" /> <projectlibraryModel v-if="!disabled" @register="register" @close="handleNewData" />
</PageWrapper> </PageWrapper>
...@@ -49,6 +52,7 @@ ...@@ -49,6 +52,7 @@
import { router } from '@/router'; import { router } from '@/router';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { isArray } from 'lodash-es'; import { isArray } from 'lodash-es';
const loadingRef = ref(false); const loadingRef = ref(false);
const [registerDrawer, { openDrawer }] = useDrawer(); const [registerDrawer, { openDrawer }] = useDrawer();
const [register, { openModal: openModal }] = useModal(); const [register, { openModal: openModal }] = useModal();
......
...@@ -67,6 +67,8 @@ ...@@ -67,6 +67,8 @@
import yearModal from '@/components/yearModal.vue'; import yearModal from '@/components/yearModal.vue';
import { columns, searchFormSchema } from './biddingPlan.data'; import { columns, searchFormSchema } from './biddingPlan.data';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import {useMessage} from "@/hooks/web/useMessage";
const {createMessage} = useMessage();
const { error } = createMessage; const { error } = createMessage;
const { push } = useRouter(); const { push } = useRouter();
const [register, { openModal: openModal, closeModal: closeModal }] = useModal(); const [register, { openModal: openModal, closeModal: closeModal }] = useModal();
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import YearSelect from "@/components/YearSelect/YearSelect.vue" import YearSelect from "@/components/YearSelect/YearSelect.vue"
import { Ref, ref, watch,onBeforeMount } from 'vue'; import { Ref, ref,onBeforeMount } from 'vue';
import { Card } from 'ant-design-vue'; import { Card } from 'ant-design-vue';
import { useECharts } from '@/hooks/web/useECharts'; import { useECharts } from '@/hooks/web/useECharts';
import {getProgress} from '@/api/dashboard/dashboard'; import {getProgress} from '@/api/dashboard/dashboard';
...@@ -23,7 +23,7 @@ onBeforeMount( async ()=>{ ...@@ -23,7 +23,7 @@ onBeforeMount( async ()=>{
data.value = await getProgress() data.value = await getProgress()
} }
console.log(`形象进度占比`,data) console.log(`形象进度占比`,data)
if(data){ if(data.value){
loading.value=false loading.value=false
} }
setOptions({ setOptions({
...@@ -82,6 +82,7 @@ const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>); ...@@ -82,6 +82,7 @@ const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
function handleNewData(info: null) { function handleNewData(info: null) {
poops(info) poops(info)
} }
</script> </script>
...@@ -216,9 +216,10 @@ ...@@ -216,9 +216,10 @@
id: info.id, id: info.id,
investmentId: info.investmentId, investmentId: info.investmentId,
}; };
if (formData.value.investmentPlan === undefined) {
formData.value.investmentPlan = []; formData.value.investmentPlan = [];
}
formData.value.investmentPlan.push(data); formData.value.investmentPlan.push(data);
console.log('info', info);
const { setTableData } = item.table[1]; const { setTableData } = item.table[1];
nextTick(() => { nextTick(() => {
setTableData(info.planYear); setTableData(info.planYear);
......
...@@ -914,19 +914,24 @@ export const biddingManagementColumns = [ ...@@ -914,19 +914,24 @@ export const biddingManagementColumns = [
}, },
]; ];
export const settlementManagementColumns = [ export const settlementManagementColumns = [
{
title: '序号',
dataIndex: 'serialNumber',
width: 100,
},
{ {
title: '填报周期', title: '填报周期',
dataIndex: 'yearQuarter', dataIndex: 'yearQuarter',
width: 140, width: 140,
}, },
{ {
title: '立项投资额(万元', title: '立项投资额(万元',
dataIndex: 'uniqueProjectCount', dataIndex: 'uniqueProjectCount',
width: 140, width: 140,
}, },
{ {
title: '资金来源', title: '资金来源',
dataIndex: 'companyName', dataIndex: 'fundingSource',
width: 140, width: 140,
}, },
{ {
...@@ -936,57 +941,57 @@ export const settlementManagementColumns = [ ...@@ -936,57 +941,57 @@ export const settlementManagementColumns = [
}, },
{ {
title: '合同类型', title: '合同类型',
dataIndex: 'updateTime', dataIndex: 'contracYpe',
width: 140, width: 140,
}, },
{ {
title: '合同名称', title: '合同名称',
dataIndex: 'statusResult', dataIndex: 'contractName',
width: 140, width: 140,
}, },
{ {
title: '甲方单位名称', title: '甲方单位名称',
dataIndex: 'auditor', dataIndex: 'firstPartyName',
width: 180, width: 180,
}, },
{ {
title: '乙方单位名称', title: '乙方单位名称',
dataIndex: 'auditTime', dataIndex: 'secondPartyName',
width: 140, width: 140,
}, },
{ {
title: '合同形式', title: '合同形式',
dataIndex: 'auditTime', dataIndex: 'formOfContract',
width: 140, width: 140,
}, },
{ {
title: '合同签订时间', title: '合同签订时间',
dataIndex: 'auditTime', dataIndex: 'contractSigningTime',
width: 140, width: 140,
}, },
{ {
title: '竣工时间', title: '竣工时间',
dataIndex: 'auditTime', dataIndex: 'closingTime',
width: 140, width: 140,
}, },
{ {
title: '结算完成时间', title: '结算完成时间',
dataIndex: 'auditTime', dataIndex: 'closingTimeDatetime',
width: 140, width: 140,
}, },
{ {
title: '合同金额(元)', title: '合同金额(元)',
dataIndex: 'auditTime', dataIndex: 'contractAmount',
width: 140, width: 140,
}, },
{ {
title: '签证、变更金额(元)', title: '签证、变更金额(元)',
dataIndex: 'auditTime', dataIndex: 'submittedForSettlement',
width: 140, width: 140,
}, },
{ {
title: '结算报送金额(元)', title: '结算报送金额(元)',
dataIndex: 'auditTime', dataIndex: 'superContractScale',
width: 140, width: 140,
}, },
{ {
...@@ -996,12 +1001,12 @@ export const settlementManagementColumns = [ ...@@ -996,12 +1001,12 @@ export const settlementManagementColumns = [
}, },
{ {
title: '结算审核金额超合同额比例', title: '结算审核金额超合同额比例',
dataIndex: 'auditTime', dataIndex: 'proportionContractAmount',
width: 140, width: 140,
}, },
{ {
title: '会议纪要', title: '会议纪要',
dataIndex: 'auditTime', dataIndex: 'meetingMinutes',
width: 140, width: 140,
}, },
{ {
......
<!--结算管理-->
<template> <template>
<BasicTable @register="registerTable"> <BasicTable @register="registerTable">
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
......
import { FormSchema, BasicColumn } from '@/components/Table';
import { uploadApi } from '@/api/sys/upload';
export const formSchema: FormSchema[] = [
{
field: 'projectName',
label: '项目名称',
labelWidth: '140px',
// required: true,
component: 'Input',
// required: true,
componentProps: {},
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'projecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '输入搜索关键词',
},
colProps: { span: 4 },
},
{
field: 'constructionMode',
component: 'RadioButtonGroup',
colProps: {
span: 6,
},
componentProps: {
options: [
{
label: '全部项目',
value: undefined,
},
{
label: '自建',
value: '自建',
},
{
label: '委托建设',
value: '委托建设',
},
{
label: '代建',
value: '代建',
},
{
label: '承建',
value: '承建',
},
],
},
},
{
field: 'isReserveProject',
component: 'Checkbox',
colProps: {
span: 2,
},
renderComponentContent: '储备项目',
},
{
field: 'ImplementingEntity',
label: '',
component: 'Select',
componentProps: {
placeholder: '实施主体',
options: [
{
label: '了解产品',
value: '了解产品',
key: '了解产品',
},
{
label: '正在跟进',
value: '正在跟进',
key: '正在跟进',
},
{
label: '正在试用',
value: '正在试用',
key: '正在试用',
},
{
label: '准备购买',
value: '准备购买',
key: '准备购买',
},
{
label: '准备付款',
value: '准备付款',
key: '准备付款',
},
{
label: '已经购买',
value: '已经购买',
key: '已经购买',
},
{
label: '暂时闲置',
value: '暂时闲置',
key: '暂时闲置',
},
],
},
colProps: { span: 3 },
},
{
field: 'projectType',
label: '',
component: 'Select',
componentProps: {
placeholder: '项目类型',
options: [
{
label: '公共设施配套类',
value: '公共设施配套类',
key: '公共设施配套类',
},
{
label: '基础设施类',
value: '基础设施类',
key: '基础设施类',
},
{
label: '产业载体类',
value: '产业载体类',
key: '产业载体类',
},
{
label: '房地产类',
value: '房地产类',
key: '房地产类',
},
{
label: '存量盘活类',
value: '存量盘活类',
key: '存量盘活类',
},
{
label: '其他类(零星工程)',
value: '其他类(零星工程)',
key: '其他类(零星工程)',
},
],
},
colProps: { span: 3 },
},
];
export const columns: BasicColumn[] = [
{
title: '基本信息',
dataIndex: 'projectName',
width: 180,
},
{
title: '实施主体',
dataIndex: 'implementingEntity',
width: 180,
},
{
title: '建设模式',
dataIndex: 'constructionMode',
width: 200,
},
{
title: '建设地点',
dataIndex: 'constructionSite',
width: 180,
},
{
title: '项目类型',
dataIndex: 'projectType',
width: 180,
},
{
title: '资金来源',
dataIndex: 'fundingSource',
width: 180,
},
{
title: '建设目的及项目功能',
dataIndex: 'constructionPurpose',
width: 180,
},
{
title: '建设规模',
dataIndex: 'constructionScale',
width: 180,
},
];
export const tabList = [
{
key: '1',
tab: '投资计划',
component: 'InvestmentPlan',
},
{
key: '2',
tab: '计划完成情况',
component: 'performance',
},
{
key: '3',
tab: '年度资金计划',
component: 'annualPlan',
},
{
key: '4',
tab: '月度资金计划',
component: 'monthlyPlan',
},
{
key: '5',
tab: '已竣工验收项目陈欠资金计划',
component: 'completed',
},
{
key: '6',
tab: '招标计划',
component: 'biddingPlan',
},
{
key: '7',
tab: '招标管理',
component: 'biddingManagement',
},
{
key: '8',
tab: '结算管理',
component: 'settlementManagement',
},
{
key: '9',
tab: '变更签证管理',
component: 'changeSignature',
},
{
key: '10',
tab: '安全隐患管理',
component: 'potentialSafety',
},
{
key: '11',
tab: '安全教育培训',
component: 'safetyEducation',
},
{
key: '12',
tab: '合同管理',
component: 'contract',
},
{
key: '13',
tab: '附件记录',
component: 'annex',
},
{
key: '14',
tab: '更新记录',
component: 'updateRecords',
},
];
<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:title="getTitle"
width="700px"
@ok="handleSubmit"
>
<BasicForm ref="formElRef" @register="registerForm"> </BasicForm>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicForm, useForm, FormActionType } from '@/components/Form';
import { formSchema } from './detail.data';
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
import { addItem, updateItem } from '@/api/project/project';
import { isArray } from '@/utils/is';
import { useUserStore } from '@/store/modules/user';
const userStore = useUserStore();
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const detailId = ref(0);
const formElRef = ref<Nullable<FormActionType>>(null);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 90,
baseColProps: { span: 24 },
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
resetFields();
setDrawerProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (isUpdate.value) {
detailId.value = data.record.id;
getTitle.value = '编辑项目';
} else {
getTitle.value = '创建项目';
}
if (data.disabled == true) {
getTitle.value = '查看项目';
const formEl = unref(formElRef);
if (!formEl) return;
await formEl.setProps({
disabled: true,
});
}
if (unref(isUpdate)) {
data.record.logo = data.record.logo ? [data.record.logo] : [];
console.log(data.record);
setFieldsValue({
...data.record,
});
}
});
const getUserInfo = computed(() => {
const { realName = '', avatar, desc, deptId } = userStore.getUserInfo || {};
return { realName, avatar: avatar, desc, deptId };
});
const getTitle = ref('');
async function handleSubmit() {
try {
const values = await validate();
setDrawerProps({ confirmLoading: true });
if (isUpdate.value) {
values.id = detailId.value;
values.deptId = getUserInfo.value.deptId;
}
let logo = unref(values.logo);
if (isArray(logo)) {
let img: string = logo[0];
values.logo = img;
}
let res = isUpdate.value ? await updateItem(values) : await addItem(values);
console.log(res);
closeDrawer();
emit('success', res);
} finally {
setDrawerProps({ confirmLoading: false });
}
}
</script>
...@@ -10,27 +10,29 @@ ...@@ -10,27 +10,29 @@
{ {
label: '查看详情', label: '查看详情',
onClick: handleDetail.bind(null, record, 1), onClick: handleDetail.bind(null, record, 1),
ifShow: (_action) => { // ifShow: (_action) => {
return record.reviewStatus == '1'; // return record.reviewStatus == '1';
}, // },
}, },
]" ]"
/> />
</template> </template>
</template> </template>
</BasicTable> </BasicTable>
<detaildrawer @register="registerDrawer" @success="handleSuccess" ></detaildrawer>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import detaildrawer from '@/views/statement/detailDrawer/detailDrawer.vue';
import { columns, searchFormSchema } from './data'; import { columns, searchFormSchema } from './data';
import { BasicTable, useTable, TableAction } from '@/components/Table'; import { BasicTable, useTable, TableAction } from '@/components/Table';
import { inject } from 'vue'; import { inject } from 'vue';
import { getEngineeringList } from '@/api/project/engineeringProject'; import { getInvestmentPlanList } from '@/api/project/statement';
import { router } from '@/router'; import { router } from '@/router';
import DetailDrawer from "@/views/statement/detailDrawer/detailDrawer.vue";
let detailId = inject('detailId'); import {useDrawer} from "@/components/Drawer";
console.log('投资页面的detailId', detailId); const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({ const [registerTable, { reload }] = useTable({
api: getEngineeringList, api: getInvestmentPlanList,
columns, columns,
formConfig: { formConfig: {
labelWidth: 120, labelWidth: 120,
...@@ -49,30 +51,38 @@ ...@@ -49,30 +51,38 @@
}, },
}); });
function handleDetail(record: Recordable, disabled: number) { function handleDetail(record: Recordable, disabled: number) {
if (record.planType === '工程') { console.log('record', record)
router.push({ console.log('disabled', disabled)
path: '/engineeringProject/engineeringEdit',
query: { openDrawer(true, {
id: record.id, record,
disabled: String(disabled), disabled,
}, isUpdate: true
});
} else if (record.planType === '承建') {
router.push({
path: '/engineeringProject/constructionEdit',
query: {
id: record.id,
disabled: String(disabled),
},
});
} else if (record.planType === '储备') {
router.push({
path: '/engineeringProject/reserveEdit',
query: {
id: record.id,
disabled: String(disabled),
},
}); });
} // if (record.planType === '工程') {
// router.push({
// path: '/engineeringProject/engineeringEdit',
// query: {
// id: record.id,
// disabled: String(disabled),
// },
// });
// } else if (record.planType === '承建') {
// router.push({
// path: '/engineeringProject/constructionEdit',
// query: {
// id: record.id,
// disabled: String(disabled),
// },
// });
// } else if (record.planType === '储备') {
// router.push({
// path: '/engineeringProject/reserveEdit',
// query: {
// id: record.id,
// disabled: String(disabled),
// },
// });
// }
} }
</script> </script>
...@@ -37,7 +37,17 @@ ...@@ -37,7 +37,17 @@
columns: contractColumns, columns: contractColumns,
formConfig: { formConfig: {
labelWidth: 120, labelWidth: 120,
schemas: searchFormSchema, schemas: [
{
field: 'contactName',
label: '',
component: 'Input',
componentProps: {
placeholder: '合同名称',
},
colProps: { span: 5 },
},
],
}, },
searchInfo: { searchInfo: {
proId: detailId, proId: detailId,
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment