Commit 31f59ecc authored by 高滢's avatar 高滢

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

parents 963cdc42 fdb12099
......@@ -21,7 +21,9 @@ enum Api {
MothCycelEdit = '/pro/mothCycle/edit',
BusinessComDetails = '/pro/monthEngineer/businessComDetails',
EditStatus = '/pro/mothCycle/editStatus',
SafetyHazard = '/pro/export/safetyHazard'
}
export const getMonthlyPlanList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
......@@ -88,6 +90,15 @@ export const exportMonthCount = (params?: any) =>
},
{ errorMessageMode: 'none', isTransformResponse: false },
);
export const exportSafetyHazard = (params?: any) =>
defHttp.post<any>(
{
url: Api.SafetyHazard,
data: params,
responseType: 'blob',
},
{ errorMessageMode: 'none', isTransformResponse: false },
);
export const getSelectDeptById = (params?: any) =>
defHttp.post<any>({
......
......@@ -19,6 +19,9 @@ enum Api {
Itemdelete = '/pro/completion/delProject',
GetPerformanceDetail = '/pro/reportCenter/details/completionSituation',
getProject = '/pro/completion/getProject',
statisticCompletion = '/pro/completion/statisticCompletion',
statisticCompletionDetails = '/pro/completion/statisticCompletionDetails',
ExportCount = '/pro/completion/statistic'
}
export const getListByPage = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
......@@ -73,3 +76,26 @@ export const getPerformanceDetail = (params?: any) =>
export const getProject = (params?: any) =>
defHttp.post<ProjectModel>({ url: Api.getProject, params });
export const getStatisticCompletionProject = (params?: any) =>
defHttp.post<any>({
url: Api.statisticCompletion,
params,
});
export const getStatisticCompletionDetails = (params?: any) =>
defHttp.post<any>({
url: Api.statisticCompletionDetails,
params,
});
export const exportStatisticList = (params?: any) =>
defHttp.post<any>(
{
url: Api.ExportCount,
data: params,
responseType: 'blob',
},
{ errorMessageMode: 'none', isTransformResponse: false },
);
......@@ -3,6 +3,7 @@ import { ProjectModel, ProjectParams } from '@/api/project/model/projectModel';
enum Api {
GetList = '/pro/dangerManagement/page',
GetListAll = '/pro/dangerManagement/all',
potentialSafetyGetList = '/pro/dangerManagement/page',
UpdateProject = '/pro/dangerManagement/update',
DeleteProject = '/pro/dangerManagement/del',
......@@ -10,6 +11,8 @@ enum Api {
export const getListByPage = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
export const getListByAll = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetListAll, data: params });
export const potentialSafetyGetListByPage = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.potentialSafetyGetList, data: params });
......
......@@ -24,6 +24,8 @@ enum Api {
getDepartmentList = '/pro/sys/sysDeptId',
// 查询季度是否已经存在
isSettlement = '/pro/settlement/is-settlement',
GetListAll = '/pro/settlement/listAll',
ExportCount= '/pro/export/settlementManagementStatistic',
}
export const getSettlementManageList = (params?: ProjectParams) =>
defHttp.post<ProjectParams>({ url: Api.GetList, data: params });
......@@ -96,3 +98,15 @@ export const isSettlement = (params?: any) =>
url: Api.isSettlement,
params,
});
export const getListAll = (params?: any) =>
defHttp.post<ProjectModel>({ url: Api.GetListAll, data: params });
export const exportStatisticList = (params?: any) =>
defHttp.post<any>(
{
url: Api.ExportCount,
data: params,
responseType: 'blob',
},
{ errorMessageMode: 'none', isTransformResponse: false },
);
......@@ -82,6 +82,16 @@ const engineeringProject: AppRouteModule = {
orderNo: 2,
},
},
{
path: 'statisticPerformance',
name: 'statisticPerformance',
component: () => import('@/views/performance/statisticPerformance/index.vue'),
meta: {
auth: '/www/dist/index.html#/performance/index',
title: '统计项目投资计划完成情况',
orderNo: 2,
},
},
{
path: 'performanceEdit',
name: 'performanceEdit',
......
......@@ -8,13 +8,23 @@ const settlementManagement: AppRouteModule = {
component: LAYOUT,
redirect: '/settlementManagement/index',
meta: {
hideChildrenInMenu: true,
hideChildrenInMenu: false,
icon: 'icon-park-outline:align-text-left-one',
orderNo: 4,
auth: '/www/dist/index.html#/settlementManagement/index',
title: '结算管理',
},
children: [
{
path: 'statistic',
name: 'settlementManagementStatistic',
component: () => import('@/views/settlementManagement/statistic/index.vue'),
meta: {
auth: '/www/dist/index.html#/settlementManagement/index',
title: '结算管理统计',
orderNo: 11,
},
},
{
path: 'index',
name: 'settlementManagement',
......@@ -22,6 +32,7 @@ const settlementManagement: AppRouteModule = {
meta: {
auth: '/www/dist/index.html#/settlementManagement/index',
// affix: true,
// hideMenu: true,
title: '结算管理',
orderNo: 4,
},
......@@ -33,6 +44,7 @@ const settlementManagement: AppRouteModule = {
meta: {
auth: '/www/dist/index.html#/settlementManagement/index',
// affix: true,
hideMenu: true,
title: '新建结算管理',
orderNo: 8,
},
......
import { BasicColumn, FormSchema } from '@/components/Table';
import moment from "moment";
//主模块-投资管理列表页
export const columns: BasicColumn[] = [
{
......
......@@ -25,7 +25,7 @@
label: '修改',
onClick: handleEdit.bind(null, record, 0),
ifShow: (_action) => {
return record.reviewStatus == '0'||record.reviewStatus == null;
return true;
},
},
{
......@@ -37,7 +37,7 @@
confirm: handleDelete.bind(null, record),
},
ifShow: (_action) => {
return record.reviewStatus == '0'||record.reviewStatus == null ;
return true;
},
},
{
......
......@@ -42,6 +42,7 @@
componentProps: {
placeholder: '年份',
picker: 'year',
defaultValue: moment().format('YYYY'),
valueFormat: 'YYYY',
format: 'YYYY',
style: {
......@@ -56,6 +57,7 @@
component: 'Select',
componentProps: {
placeholder: '季度',
defaultValue: '第一季度',
options: [
{
label: '第一季度',
......
......@@ -83,6 +83,7 @@ export const searchFormSchema: FormSchema[] = [
field: 'companyName',
label: '',
component: 'Select',
required: false,
componentProps: {
options: [
{ label: '公司名称1', value: '1' },
......
......@@ -8,14 +8,14 @@
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'status'">
<Tag color="warning" v-if="record.status == '0'"> 未审核</Tag>
<Tag color="warning" v-if="record.status === '0'"> 未审核</Tag>
</template>
<template v-if="column.key === 'status'">
<Tag color="success" v-if="record.status == '1'"> 已审核</Tag>
<Tag color="success" v-if="record.status === '1'"> 已审核</Tag>
</template>
<template v-if="column.key === 'action'" >
<template v-if="column.key === 'action'">
<TableAction
v-if="record.status == '0'"
v-if="record.status === '0'"
:actions="[
{
label: '修改',
......@@ -70,24 +70,18 @@
</div>
</template>
<script setup lang="ts">
import { operateType, addItemApi, addItemData } from '@/api/operations/operations';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { useModal } from '@/components/Modal';
import yearModal from '@/components/yearModal/yearModal.vue';
import {
getSettlementManageList,
auditItem,
deleteList,
checkQuarter,
} from '@/api/changeSignatrue/changeSignatrue';
import { columns, searchFormSchema } from '@/views/changeSignature/changeSignatrue.data';
import { Tag } from 'ant-design-vue';
import { useRouter } from 'vue-router';
import { onMounted } from 'vue';
import { getDepartmentList } from '@/api/project/settlementManage';
import { useMessage } from '@/hooks/web/useMessage';
import {addItemApi, addItemData, operateType} from '@/api/operations/operations';
import {BasicTable, TableAction, useTable} from '@/components/Table';
import {useModal} from '@/components/Modal';
import {auditItem, checkQuarter, deleteList, getSettlementManageList,} from '@/api/changeSignatrue/changeSignatrue';
import {columns, searchFormSchema} from '@/views/changeSignature/changeSignatrue.data';
import {Tag} from 'ant-design-vue';
import {useRouter} from 'vue-router';
import {onMounted} from 'vue';
import {getDepartmentList} from '@/api/project/settlementManage';
import {useMessage} from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const { createMessage } = useMessage();
const { push } = useRouter();
const [register, { openModal: openModal, closeModal: closeModal }] = useModal();
......@@ -113,13 +107,14 @@
onMounted(async () => {
const data = await getDepartmentList();
searchFormSchema[2].componentProps.options = data;
console.log(searchFormSchema[2].componentProps.options, '数据仓库');
searchFormSchema[2].componentProps.options = data.map(item => ({
key: item.value,
value: item.label,
label: item.label
}));
});
async function handleDelete(record: Recordable) {
console.log(record);
console.log(record);
let id = record.id;
await deleteList({ id });
reload();
......
......@@ -7,7 +7,6 @@
<template #bodyCell="{ column, text, record, index }">
<!-- 当前列是序号列时,显示序号 -->
<span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span>
<template v-if="column.key === 'completionResult'">
<Tag color="processing">
{{ record.completionResult == 1 ? '已审核' : '未审核' }}
......@@ -27,7 +26,7 @@
label: '修改',
onClick: handleEdit.bind(null, record, 0),
ifShow: (_action) => {
return record.completionResult == 0;
return true;
},
},
{
......@@ -39,7 +38,7 @@
confirm: handleDelete.bind(null, record),
},
ifShow: (_action) => {
return record.completionResult == 0;
return true;
},
},
{
......@@ -52,6 +51,7 @@
},
ifShow: (_action) => {
return record.completionResult == 0;
// return record.completionResult == 0 && deptId != '100';
},
},
]"
......@@ -72,9 +72,13 @@
import { useRouter } from 'vue-router';
import performanceModel from './performanceModel.vue';
import { Tag } from 'ant-design-vue';
import { onMounted } from 'vue';
import {onMounted, ref} from 'vue';
import { getDepartmentList } from '@/api/project/settlementManage';
import {useMessage} from "@/hooks/web/useMessage";
import {useUserStore} from "@/store/modules/user";
const deptId = ref('');
const { createMessage } = useMessage();
const { push } = useRouter();
const [register, { openModal: openModal }] = useModal();
......@@ -111,12 +115,14 @@
}
onMounted(async () => {
deptId.value = useUserStore().userInfo.deptId;
const data = await getDepartmentList();
searchFormSchema[2].componentProps.options = data;
});
function handleDelete(record: Recordable) {
deleteItem({ id: record.id });
createMessage.success('删除成功!');
reload();
}
......
......@@ -10,26 +10,52 @@
<!-- page页的右上角操作(提交和返回)按钮 -->
<template #extra>
<!-- <a-button type="primary" danger> 删除 </a-button>-->
<a-button type="primary" v-if="!disabled" @click="handleSubmit"> 提交 </a-button>
<a-button type="primary" v-if="!disabled" @click="handleSubmit('0')"> 暂存 </a-button>
<a-button type="primary" v-if="!disabled" @click="handleSubmit('1')"> 提交 </a-button>
<a-button type="primary" @click="history" v-if="historyData">历史记录 </a-button>
<a-button type="default" @click="router.back()"> 返回 </a-button>
</template>
<!-- page页 -->
<template v-for="(item, index) in tabsFormSchema">
<PageCard v-if="item.show" :key="index" :title="item.name">
<!-- 右上角的删除按钮 -->
<template #right>
<a-button
<CollapseContainer v-for="(item, index) in tabsFormSchema" :key="index">
<template #title>
<span class="projectName">{{ item.name }}</span>
</template>
<template #action>
<a-button
v-if="!disabled"
type="text"
preIcon="ant-design:delete-outlined"
danger
@click="deleteItem(index)"
/>
@click="deleteItemPro(index)"
>删除项目</a-button
>
</template>
<BasicForm :loading="loading" @register="item.Form[0]" />
<!-- 左上角为项目名 -->
<CollapseContainer
v-for="(content, key) in item.list"
:key="key"
class="subCard"
:title="content.name"
>
<template #title>
<span class="contractName">{{ content.name }}</span>
</template>
<BasicForm :loading="loading" @register="item.Form[0]" />
</PageCard>
</template>
<!-- 右上角的删除按钮 -->
<template #action>
<a-button
v-if="!disabled"
type="text"
preIcon="ant-design:delete-outlined"
danger
@click="deleteItemCon(index, key)"
>删除合同</a-button
>
</template>
<BasicForm :loading="loading" @register="content.form" />
</CollapseContainer>
</CollapseContainer>
<!--新增按钮-->
<a-button v-if="!disabled" type="dashed" @click="add" preIcon="ei:plus">
从计划中添加
......@@ -67,8 +93,10 @@
GetEngineProjectList,
Itemdelete,
} from '@/api/project/performance';
import { useDrawer } from '@/components/Drawer';
import CollapseContainer from '@/components/Container/src/collapse/CollapseContainer.vue';
//历史记录是否可查
const historyData = ref(true);
......@@ -98,8 +126,10 @@
let result = await GetEngineProjectList({
ids,
});
console.log('result:',result)
formData.value.ids = ids;
result.map((res) => {
console.log('res:',res)
let item = res;
item.time = item.beginTime + '/' + item.endTime;
handleNew(item);
......@@ -117,8 +147,10 @@
formData.value.planCompletion = [];
for (let i = 0; i < res.length; i++) {
const source = res[i];
console.log('source:',source)
const item = {
name: '序号' + (i + 1),
name: '项目:' + source.projectName,
proId: source.proId,
forceRender: true,
show: true,
Form: useForm(
......@@ -158,13 +190,22 @@
};
const tabsFormSchema = reactive<TabsFormType[]>([]);
/*删除项目表单*/
async function deleteItemPro(index: any) {
formData.value.planCompletion.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
console.log(formData.value);
// }
}
/*创建完成情况*/
async function handleNew(info: any) {
console.log(info);
console.log('info:',info)
const item = {
name: '序号' + (tabsFormSchema.length + 1),
name: '项目:'+info.projectName,
forceRender: true,
proId:info.proId,
show: true,
Form: useForm(
Object.assign(
......@@ -203,15 +244,86 @@
});
}
/*page页的右上角操作(提交和返回)按钮*/
async function handleSubmit() {
async function handleSubmit(isSubmit) {
for(let i = 0; i < tabsFormSchema.length; i++){
let formSchema = tabsFormSchema[i].Form[1]
const { updateSchema } = formSchema
await nextTick(() => {
if (isSubmit == '0') {
updateSchema([
{field: 'projectName', required: false},
{field: 'constructionSite', required: false},
{field: 'constructionMode', required: false},
{field: 'projectType', required: false},
{field: 'constructionScale', required: false},
{field: 'projectOverview', required: false},
{field: 'fundingSource', required: false},
{field: 'implementingEntity', required: false},
{field: 'filingCycle', required: false},
{field: 'totalInvestment', required: false},
{field: 'attribute', required: false},
{field: 'time', required: false},
{field: 'completionSchedule', required: false},
{field: 'outputValue', required: false},
{field: 'planNum', required: false},
{field: 'actualOutputValue', required: false},
{field: 'planFunds', required: false},
{field: 'actualPay', required: false},
{field: 'completionRemarks', required: false},
{field: 'fundingSource', required: false},
{field: 'projectApproval', required: false},
{field: 'fundingSource', required: false},
{field: 'competentDepartment', required: false},
{
field: 'remark', dynamicRules: ({values}) => {
return [{required: false,}]
},
},
])
} else {
updateSchema([
{field: 'projectName', required: true},
{field: 'constructionSite', required: true},
{field: 'constructionMode', required: true},
{field: 'projectType', required: true},
{field: 'constructionScale', required: true},
{field: 'projectOverview', required: true},
{field: 'fundingSource', required: true},
{field: 'implementingEntity', required: true},
{field: 'filingCycle', required: true},
{field: 'totalInvestment', required: true},
{field: 'attribute', required: true},
{field: 'time', required: true},
{field: 'completionSchedule', required: true},
{field: 'outputValue', required: true},
{field: 'planNum', required: true},
{field: 'actualOutputValue', required: true},
{field: 'planFunds', required: true},
{field: 'actualPay', required: true},
{field: 'completionRemarks', required: true},
{field: 'fundingSource', required: true},
{field: 'projectApproval', required: true},
{field: 'fundingSource', required: true},
{field: 'competentDepartment', required: true},
{
field: 'remark', dynamicRules: ({values}) => {
return values.fundGap ? [{required: true, message: '说明必填'}] : [];
},
}
])
}
})
}
loadingRef.value = true;
try {
for (let i = 0; i < tabsFormSchema.length; i++) {
let item = tabsFormSchema[i];
console.log('item1111:',item)
if (item.show) {
const { validate, getFieldsValue } = item.Form[1];
await validate();
let res = getFieldsValue();
formData.value.planCompletion[i].proId = item.proId;
formData.value.planCompletion[i] = deepMerge(formData.value.planCompletion[i], res);
formData.value.planCompletion[i].actualOutputValue = Number(
formData.value.planCompletion[i].actualOutputValue,
......@@ -219,21 +331,22 @@
formData.value.planCompletion[i].actualPay = Number(
formData.value.planCompletion[i].actualPay,
);
console.log(formData.value.planCompletion);
}
}
formData.value.proNumber = formData.value.planCompletion.Length;
formData.value.isSubmit = isSubmit
let res = isUpdate.value ? await updateItem(unref(formData)) : await addItem(unref(formData));
addItemData.operateType = operateType.update;
addItemData.businessId = routeId.value;
addItemData.businessType = '工程项目投资计划完成情况';
const showDatem = await addItemApi(addItemData);
console.log(showDatem, '记录添加成功');
loadingRef.value = true;
console.log(res);
createMessage.success('提交成功!');
router.back();
if (isSubmit === '0'){
createMessage.success('暂存成功!');
} else {
createMessage.success('提交成功!');
}
// router.back();
} catch (e) {
// 验证失败或出错,切换到对应标签页
console.log(e);
......@@ -250,3 +363,18 @@
console.log('历史记录');
}
</script>
<style scoped>
.subCard {
border: 1px solid #e8eaec;
}
.projectName {
border-left: blue solid 6px;
padding-left: 10px;
font-weight: bold;
}
.contractName {
border-left: red solid 6px;
padding-left: 10px;
font-weight: bold;
}
</style>
<template>
<div style="margin: 16px">
<PageCard title="统计工程项目投资计划完成情况">
<BasicForm ref="formElRef" @register="registerForm">
<template #formFooter>
<a-button type="primary" @click="handleSubmit"> 查询</a-button>
<a-button type="primary" @click="exportCount" style="margin-left: 10px"> 导出</a-button>
</template>
</BasicForm>
<Table
:pagination="false"
:dataSource="dataSource"
:columns="getBasicColumns(params.filingCycle, params.planType)"
bordered
:loading="loadingRef"
:rowClassName="setRowClassName"
>
<template #projectType="{ text, record }">
<a @click="showDetails(record)"> {{ text }}</a>
</template>
</Table>
</PageCard>
<PerformanceStatisticWindow @register="register" />
</div>
</template>
<script setup lang="ts">
import { BasicForm, useForm } from '@/components/Form';
import PageCard from '@/components/Page/src/PageCard.vue';
import { Table } from 'ant-design-vue';
import { onMounted, ref } from 'vue';
import {
getBasicColumns,
searchForm,
} from '@/views/performance/statisticPerformance/statisticData';
import { getSelectDeptById, getStatistic } from '@/api/project/monthlyPlan';
import { getStatisticCompletionProject,getStatisticCompletionDetails } from '@/api/project/performance';
import PerformanceStatisticWindow from '@/views/performance/statisticPerformance/performanceStatisticWindow.vue';
import { useModal } from '@/components/Modal';
import {exportStatisticList} from "@/api/project/performance";
import {downloadByData} from "@/utils/file/download";
const [register, { openModal: openModal }] = useModal();
onMounted(async () => {
const data = await getSelectDeptById();
searchForm[2].componentProps.options = data;
getStatisticList();
});
const dataSource = ref([]);
const loadingRef = ref(false);
const params = ref({ filingCycle: '2024', planType: '自投', company: '' });
const [registerForm, { getFieldsValue }] = useForm({
labelWidth: 90,
baseColProps: { span: 24 },
schemas: searchForm,
showActionButtonGroup: false,
});
function handleSubmit() {
let data = getFieldsValue();
params.value = data;
console.log(params.value);
getStatisticList();
}
function setRowClassName(record) {
if (record.projectType === '总计') {
return 'rowcolor';
} else {
return;
}
}
async function exportCount() {
const params = getFieldsValue();
const data = await exportStatisticList(params);
downloadByData(data, '统计项目计划投资完成情况报表' + '.xlsx');
}
async function getStatisticList() {
loadingRef.value = true;
let data = await getStatisticCompletionProject(params.value);
// dataSource.value = data;
let propsList = ['companyName'];
propsList.map((item) => {
changeData(data, item);
});
loadingRef.value = false;
}
function changeData(data, field) {
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
var item = data.slice(count, count + 1)[0]; //获取没有比较的第一个对象
if (!item[`${field}rowSpan`]) {
item[`${field}rowSpan`] = 1; //初始化为1
}
if (item[field] === data[indexCount][field]) {
//第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item[`${field}rowSpan`]++;
data[indexCount][`${field}rowSpan`] = 0;
} else {
count = indexCount;
}
indexCount++;
}
dataSource.value = data;
}
function showDetails(record) {
openModal(true, {
record,
filingCycle: params.value.filingCycle,
planType: params.value.planType,
});
}
</script>
<style scoped lang="less">
.tableHiddle {
display: none;
}
.tableshow {
display: revert;
}
::v-deep .ant-table-tbody .ant-table-row {
&.rowcolor .ant-table-cell-fix-left {
background-color: #f5f5f5;
}
}
</style>
<template>
<BasicModal v-bind="$attrs" width="80%" @register="register" :title="getTitle" :showOkBtn="false">
<div style="height: 500px">
<Table
:pagination="false"
:dataSource="dataSource"
:columns="getDtailsBasicColumns(params.filingCycle, params.planType)"
bordered
:sticky="true"
:loading="loadingRef"
:scroll="{ x: 4000, y: 300 }"
>
<template #index="{ text, record, index }">
{{index+1}}
</template>
</Table>
</div>
</BasicModal>
</template>
<script setup lang="ts">
import { useModalInner } from '@/components/Modal';
import BasicModal from '@/components/Modal/src/BasicModal.vue';
import { ref } from 'vue';
import { Table } from 'ant-design-vue';
import { getDtailsBasicColumns } from '@/views/performance/statisticPerformance/statisticData';
import { getStatisticCompletionDetails } from '@/api/project/performance';
const loadingRef = ref(false);
// 列表
const dataSource = ref([]);
const getTitle = ref('');
const params = ref({ companyId: '', projectType: '', filingCycle: '', planType: '' });
const [register, { closeModal }] = useModalInner(async (data) => {
getTitle.value = data.record.company;
params.value.companyId = data.record.companyId;
params.value.projectType = data.record.projectType;
params.value.filingCycle = data.filingCycle;
params.value.planType = data.planType;
dataSource.value = await getStatisticCompletionDetails(params.value);
// console.log('212', list);
});
</script>
<style scoped lang="less"></style>
import { FormSchema } from '@/components/Form';
import { useUserStore } from '@/store/modules/user';
import { BasicColumn } from '@/components/Table';
import moment from "moment";
const deptId = useUserStore().userInfo.deptParentId;
export const searchForm: FormSchema[] = [
{
field: 'filingCycle',
label: '',
defaultValue: new Date(),
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
style: { width: '100%' },
picker: 'year',
defaultValue: moment().format('YYYY'),
valueFormat: 'YYYY',
format: 'YYYY',
},
colProps: { span: 4 },
},
{
field: 'planType',
label: '',
defaultValue: '自投',
component: 'Select',
componentProps: {
defaultValue: '自投',
options: [
{ label: '自投', value: '自投' },
{ label: '代建', value: '代建' },
{ label: '承建', value: '承建' },
{ label: '储备', value: '储备' },
],
placeholder: '类型',
},
colProps: { span: 4 },
},
{
field: 'company',
label: '',
show: deptId == '100',
component: 'Select',
componentProps: {
options: [],
placeholder: '公司名称',
},
colProps: { span: 4 },
},
];
export function getBasicColumns(year: string, planType: string): BasicColumn[] {
return [
{
title: year + '年' + planType + '工程项目投资计划完成情况',
colSpan: 6,
children: [
{
title: '公司名称',
dataIndex: 'company',
fixed: 'left',
width: 250,
customCell: (_, any) => ({
rowSpan: _.companyNamerowSpan,
}),
},
{
title: '项目类型',
dataIndex: 'projectType',
fixed: 'left',
width: 300,
slots: { customRender: 'projectType' },
},
{
title: '项目个数',
dataIndex: 'proNum',
width: 200,
},
{
title: '合同总额',
dataIndex: 'contractAmount',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
},
{
title: '投资总额(万元)',
dataIndex: 'outputValue',
className: planType != '承建' ? 'tableShow' : 'tableHiddle',
},
{
title: year + '年计划完成产值',
dataIndex: 'planCompleteOutputValue',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
},
{
title: year + '年计划完成投资额度',
dataIndex: 'planOutputValue',
className: planType != '承建' ? 'tableShow' : 'tableHiddle',
},
{
title: year + '年计划资金',
dataIndex: 'planFunds',
className: planType != '储备' ? 'tableShow' : 'tableHiddle',
},
],
},
];
}
export function getDtailsBasicColumns(year: string, planType: string): BasicColumn[] {
return [
{
title: '序号',
dataIndex: 'index',
fixed: 'left',
width: 180,
slots: { customRender: 'index' },
},
{
title: '项目名称',
dataIndex: 'projectName',
fixed: 'left',
width: 180,
},
{
title: '建设地点',
dataIndex: 'constructionSite',
width: 180,
},
{
title: '项目概况',
dataIndex: 'projectOverview',
width: 200,
},
{
title: '建设规模',
dataIndex: 'constructionScale',
width: 150,
},
{
title: '建设目的及功能',
dataIndex: 'constructionPurpose',
width: 150,
},
{
title: '建设模式',
dataIndex: 'constructionMode',
width: 150,
},
{
title: '资金来源',
dataIndex: 'fundingSource',
width: 150,
},
{
title: '项目类型',
dataIndex: 'projectType',
width: 150,
},
{
title: '总投资',
dataIndex: 'totalInvestment',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
// width: planType === '承建' ? 0 : 150,
width: 150,
},
{
title: year + '年之前总投资额(不包含'+year+'年)',
dataIndex: 'outputValue',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年计划投资额',
dataIndex: 'matchingFunds',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年实际完成投资额',
dataIndex: 'actualOutputValue',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年计划资金',
dataIndex: 'planFunds',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年实付资金',
dataIndex: 'actualPay',
className: planType !== '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: '合同总额',
dataIndex: 'contractAmount',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年之前完成总产值(不包含'+year+'年)',
dataIndex: 'matchingFunds',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年计划产值',
dataIndex: 'outputValue',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: year + '年实际产值',
dataIndex: 'actualOutputValue',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: '建设性质',
dataIndex: 'attribute',
width: 150,
},
{
title: '开工时间',
dataIndex: 'beginTime',
width: 150,
},
{
title: '竣工时间',
dataIndex: 'endTime',
width: 150,
},
{
title: year + '年底形象季度',
dataIndex: 'schedule',
width: 150,
},
{
title: '实施主体',
dataIndex: 'implementingEntity',
width: 150,
},
{
title: '合同方式',
dataIndex: 'contract',
className: planType === '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
{
title: '项目主管部门',
dataIndex: 'competentDepartment',
className: planType != '承建' ? 'tableShow' : 'tableHiddle',
width: 150,
},
// {
// title: '实施级别',
// dataIndex: 'implementationLevel',
// width: 150,
// },
{
title: '备注',
dataIndex: 'remarks',
width: 150,
},
];
}
import { BasicColumn, FormSchema } from '@/components/Table';
import {useUserStore} from "@/store/modules/user";
const deptId = useUserStore().userInfo.deptId;
console.log('===========',useUserStore().userInfo)
//主模块-安全隐患列表页
export const formSchema: FormSchema[] = [
// {
// field: 'fillingPeriod',
// labelWidth: '140px',
// label: '填报周期',
// required: true,
// component: 'DatePicker',
// componentProps: {
// placeholder: '填报周期',
// style: { width: '100%' },
// valueFormat: 'YYYY-MM-DD',
// format: 'YYYY-MM-DD',
// },
// },
{ field: 'year',
label: '年份',
component: 'DatePicker',
required: true,
componentProps: {
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 11, offset: 1 },},
{
field: 'fillingPeriod',
labelWidth: '140px',
label: '填报周期',
field: 'quarter',
label: '季度',
required: true,
component: 'DatePicker',
component: 'Select',
componentProps: {
placeholder: '填报周期',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
placeholder: '季度',
options: [
{
label: '第一季度',
value: '第一季度',
},
{
label: '第二季度',
value: '第二季度',
},
{
label: '第三季度',
value: '第三季度',
},
{
label: '第四季度',
value: '第四季度',
},
],
},
colProps: { span: 11, offset: 1 },
},
// {
// label: '公司名称',
// field: 'companyName',
// labelWidth: 150,
// },
{
label: '隐患描述',
field: 'describe',
......@@ -117,17 +168,38 @@ export const formSchema: FormSchema[] = [
},
},
];
export const columns: BasicColumn[] = [
export const columnsDate: BasicColumn[] = [
{
title: '填报周期',
dataIndex: 'fillingPeriod',
title: '公司名称',
dataIndex: 'companyName',
width: 150,
ifShow: deptId === '100',
fixed: 'left',
customCell: (_, any) => ({
rowSpan: _.companyNamerowSpan,
}),
// slots: { customRender: 'companyName' },
},
// {
// title: '填报周期',
// dataIndex: 'fillingPeriod',
// width: 150,
// },
{
title: '隐患描述',
dataIndex: 'describe',
width: 150,
},
{
title: '年份',
dataIndex: 'year',
width: 150,
},
{
title: '季度',
dataIndex: 'quarter',
width: 150,
},
{
title: '隐患级别',
dataIndex: 'level',
......@@ -163,31 +235,69 @@ export const columns: BasicColumn[] = [
dataIndex: 'responsiblePerson',
width: 180,
},
{
title: '操作',
dataIndex: 'action',
width: 180,
slots: { customRender: 'action' },
},
];
export const searchFormSchema: FormSchema[] = [
export const searchFormSchemaDate: FormSchema[] = [
{
field: 'fillingPeriod',
field: 'year',
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '填报周期',
placeholder: '选择填报周期',
picker: 'year',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
valueFormat: 'YYYY',
format: 'YYYY',
},
colProps: { span: 4 },
},
{
field: 'responsiblePerson',
field: 'quarter',
label: '',
component: 'Select',
componentProps: {
options: [
{
label: '第一季度',
value: '第一季度'
},
{
label: '第二季度',
value: '第二季度'
},
{
label: '第三季度',
value: '第三季度',
},
{
label: '第四季度',
value: '第四季度',
},
],
placeholder: '季度',
},
colProps: { span: 4 },
},
{
field: 'companyName',
label: '',
component: 'Select',
ifShow: deptId === '100',
componentProps: {
placeholder: '公司名称',
options: [
{ label: '责任人一', value: '责任人一' },
{ label: '责任人二', value: '责任人二' },
{
label: '公司名称',
value: '公司名称',
key: '公司名称',
},
],
placeholder: '责任人',
},
colProps: { span: 4 },
},
......
This diff is collapsed.
......@@ -31,8 +31,8 @@
showActionButtonGroup: false,
});
onMounted(async () => {
const data = await getUserList();
formSchema[8].componentProps.options = data;
// const data = await getUserList();
// formSchema[8].componentProps.options = data;
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
resetFields();
......
<template>
<BasicModal v-bind="$attrs" width="80%" @register="register" :title="getTitle" :showOkBtn="false">
<div style="height: 500px">
<Table
:pagination="false"
:dataSource="dataSource"
:columns="columns"
bordered
:sticky="true"
:loading="loadingRef"
:scroll="{ x: 4000, y: 300 }"
/>
</div>
</BasicModal>
</template>
<script setup lang="ts">
import { useModalInner } from '@/components/Modal';
import BasicModal from '@/components/Modal/src/BasicModal.vue';
import { ref } from 'vue';
import { Table } from 'ant-design-vue';
import { getStatisticDetails } from '@/api/project/monthlyPlan';
const loadingRef = ref(false);
// 列表
const dataSource = ref([]);
// 表头1
const columns = [
{
title: '',
dataIndex: '',
children: [
{
title: '项目名称',
dataIndex: 'projectName',
width: 200,
fixed: 'left',
},
],
},
{
title: '',
dataIndex: '',
children: [
{
title: '合同名称',
dataIndex: 'contractName',
width: 180,
},
{
title: '收款单位',
dataIndex: 'collectingUnit',
width: 180,
},
{
title: '合同额(万元)',
dataIndex: 'contractAmount',
width: 150,
},
],
},
{
title: '产值完成情况',
dataIndex: '',
children: [
{
title: '上月实际完成值(万元)',
dataIndex: 'completionValueActual',
width: 180,
},
{
title: '累计完成值(万元)',
dataIndex: 'accumulateCompletionValue',
width: 180,
},
{
title: '本月计划完成值(万元)',
dataIndex: 'planCompletionValue',
width: 180,
},
{
title: '上月计划数(万元)',
dataIndex: 'lastMonthPlan',
width: 180,
},
],
},
{
title: '资金支付情况',
dataIndex: '',
children: [
{
title: '上月实付数(万元)',
dataIndex: 'lastMonthActual',
width: 180,
},
{
title: '累计支付数(万元)',
dataIndex: 'accumulatePayment',
width: 180,
},
{
title: '本月计划数(万元)',
dataIndex: 'thisPlanNumber',
width: 180,
},
],
},
{
title: '资金来源',
dataIndex: '',
children: [
{
title: '专项债拨款(万元)',
dataIndex: 'specialFund',
width: 180,
},
{
title: '政府拨款(万元)',
dataIndex: 'governmentFund',
width: 180,
},
{
title: '银行融资(万元)',
dataIndex: 'banFinancing',
width: 180,
},
{
title: '自有资金(万元)',
dataIndex: 'ownFund',
width: 180,
},
{
title: '资金缺口',
dataIndex: 'fundGap',
width: 180,
},
],
},
{
title: '',
dataIndex: '',
children: [
{
title: '支付等级',
dataIndex: 'paymentLevel',
width: 180,
},
{
title: '备注',
dataIndex: 'remark',
width: 180,
},
],
},
];
const getTitle = ref('');
const params = ref({ companyId: '', sourceType: '', monthYear: '' });
const [register, { closeModal }] = useModalInner(async (data) => {
console.log('data', data)
loadingRef.value = true;
getTitle.value = data.record.companyName;
params.value.companyId = data.record.companyId;
params.value.sourceType = data.record.sourceType;
params.value.monthYear = data.monthYear;
dataSource.value = await getStatisticDetails(params.value);
console.log('params.value',params.value)
loadingRef.value = false;
// console.log('212', list);
});
</script>
<style scoped lang="less"></style>
......@@ -56,8 +56,10 @@
import { useUserStore } from '@/store/modules/user';
import { getDepartmentList } from '@/api/project/settlementManage';
import { downloadByData } from '@/utils/file/download';
import {dataStyleTask} from "echarts/types/src/visual/style";
const deptId = useUserStore().userInfo.deptId;
// const deptId = "764";
const APopconfirm = Popconfirm;
const userStore = useUserStore();
const getUserInfo = computed(() => {
......@@ -294,7 +296,13 @@
} else {
columns.value = columns2;
}
searchForm.value[2].componentProps.options = await getDepartmentList();
const data = await getDepartmentList();
// console.log(data);
searchForm.value[2].componentProps.options = data.map((item) => ({
key: item.value,
value: item.label,
label: item.label,
}));
getStatisticList();
});
......
......@@ -351,10 +351,10 @@ export const formSchema: FormSchema[] = [
label: '结算审核金额超合同额比例',
labelWidth: '300px',
required: true,
component: 'Input',
componentProps: {
addonAfter: '元',
},
component: 'InputNumber',
// componentProps: {
// addonAfter: '元',
// },
colProps: { span: 7, offset: 1 },
},
// {
......
......@@ -22,7 +22,10 @@
title: '是否确认审核',
placement: 'left',
confirm: examine.bind(null, record,true),
}
},
ifShow: (_action) => {
return (record.reviewStatus == '0'||record.reviewStatus == null) && record.isSubmit == '1' && deptId !== '100';
},
},
{
label: '编辑',
......@@ -101,7 +104,7 @@ onMounted(async () => {
function handleEdit(record: Recordable, disabled: boolean) {
console.log(record.id,"ddddd")
console.log(record,"ddddd")
push({
path: '/settlementManagement/edit',
query: {
......
<template>
<div style="margin: 16px">
<PageCard title="结算管理统计">
<BasicForm ref="formElRef" @register="registerForm">
<template #formFooter>
<a-button type="primary" @click="handleSubmit"> 查询</a-button>
<a-button type="primary" @click="exportCount" style="margin-left: 10px"> 导出</a-button>
</template>
</BasicForm>
<Table
:pagination="false"
:dataSource="dataSource"
:columns="columns"
bordered
:loading="loadingRef"
:rowClassName="setRowClassName"
:scroll="{ x: 1300,y: 350 }"
>
</Table>
</PageCard>
<StatisticWindow @register="register" />
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { Table } from 'ant-design-vue';
import { getListAll,exportStatisticList } from '@/api/project/settlementManage';
import {BasicForm, FormActionType, FormSchema, useForm} from '@/components/Form';
import StatisticWindow from '@/views/monthlyPlan/statisticWindow/statisticWindow.vue';
import { useModal } from '@/components/Modal';
import { useRouter } from 'vue-router';
import PageCard from '@/components/Page/src/PageCard.vue';
import { downloadByData } from '@/utils/file/download';
import { useUserStore } from '@/store/modules/user';
const seach = ref([
{
field: 'givenYear',
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
{
field: 'quarter',
label: '',
component: 'Select',
componentProps: {
placeholder: '季度',
options: [
{
label: '第一季度',
value: '第一季度',
},
{
label: '第二季度',
value: '第二季度',
},
{
label: '第三季度',
value: '第三季度',
},
{
label: '第四季度',
value: '第四季度',
},
],
},
colProps: { span: 4 },
},
])
const deptId = ref('');
onMounted(async () => {
deptId.value = useUserStore().userInfo.deptId;
getStatisticList();
});
// defineOptions({ name: 'MonthlyPlan' });
const [register, { openModal: openModal }] = useModal();
const formElRef = ref<Nullable<FormActionType>>(null);
const [registerForm, { getFieldsValue }] = useForm({
labelWidth: 90,
baseColProps: { span: 24 },
schemas: seach,
showActionButtonGroup: false,
});
async function exportCount() {
const params = getFieldsValue();
const data = await exportStatisticList(params);
downloadByData(data, '招标管理统计报表' + '.xls');
}
const loadingRef = ref(false);
function handleSubmit() {
getStatisticList();
}
function setRowClassName(record) {
if (record.projectName === '总计(万元)') {
return 'rowcolor';
}
if (record.companyName === '合计(万元)'){
return 'rowcolor';
} else {
return;
}
}
function getCurrentDateFormatted() {
const now = new Date();
const year = now.getFullYear();
const month = (now.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始,所以要加1,并且格式化为两位数
return `${year}-${month}`;
}
async function getStatisticList() {
const params = getFieldsValue();
loadingRef.value = true;
let data = await getListAll(params);
// dataSource.value = data;
let propsList = ['companyName','projectName'];
propsList.map((item) => {
changeData(data, item);
});
loadingRef.value = false;
}
function changeData(data, field) {
if (field == 'companyName'){
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
var item = data.slice(count, count + 1)[0]; //获取没有比较的第一个对象
if (!item[`${field}rowSpan`]) {
item[`${field}rowSpan`] = 1; //初始化为1
}
if (item[field] === data[indexCount][field]) {
//第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item[`${field}rowSpan`]++;
data[indexCount][`${field}rowSpan`] = 0;
} else {
count = indexCount;
}
indexCount++;
}
}
if (field == 'projectName'){
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
var item = data.slice(count, count + 1)[0]; //获取没有比较的第一个对象
if (!item[`${field}rowSpan`]) {
item[`${field}rowSpan`] = 1; //初始化为1
}
if (item[field] === data[indexCount][field] && item['companyName'] === data[indexCount]['companyName']) {
//第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item[`${field}rowSpan`]++;
data[indexCount][`${field}rowSpan`] = 0;
} else {
count = indexCount;
}
indexCount++;
}
}
dataSource.value = data;
}
// 列表
const dataSource = ref([]);
// 表头
const columns = [
{
title: '公司名称',
dataIndex: 'companyName',
fixed: 'left',
width: 180,
customCell: (_, any) => ({
rowSpan: _.companyNamerowSpan,
}),
},
{
title: '项目名称',
dataIndex: 'projectName',
width: 180,
},
{
title: '立即投资额(万元)',
dataIndex: 'projectInvestment',
width: 180,
},
{
title: '资金来源',
dataIndex: 'fundingSource',
width: 180,
},
{
title: '招标方式',
dataIndex: 'biddingMethod',
width: 180,
},
{
title: '合同类型',
dataIndex: 'contracYpe',
width: 180,
},
{
title: '合同名称',
dataIndex: 'contractName',
width: 180,
},
{
title: '合同形式',
dataIndex: 'formOfContract',
width: 180,
},
{
title: '合同金额(元)',
dataIndex: 'contractAmount',
width: 180,
},
{
title: '签证变更金额(元)',
dataIndex: 'submittedForSettlement',
width: 180,
},
{
title: '结算报送金额(元)',
dataIndex: 'superContractScale',
width: 180,
},
{
title: '结算审定金额(元)',
dataIndex: 'sumOfMoney',
width: 180,
},
];
const { push } = useRouter();
</script>
<style lang="less" scoped>
::v-deep .ant-table-tbody .ant-table-row {
&.rowcolor .ant-table-cell-fix-left {
background-color: #f5f5f5;
}
}
</style>
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