|
@@ -6,7 +6,7 @@
|
|
<div class="hc-card-item-sub">
|
|
<div class="hc-card-item-sub">
|
|
<div class="item-sub-title">截至目前总合同额</div>
|
|
<div class="item-sub-title">截至目前总合同额</div>
|
|
<div class="item-sub-num">
|
|
<div class="item-sub-num">
|
|
- <span class="num">120033</span>
|
|
|
|
|
|
+ <span class="num">{{statsAll.allContractMoney}}</span>
|
|
<span class="text">万</span>
|
|
<span class="text">万</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -17,7 +17,7 @@
|
|
<div class="hc-card-item-sub">
|
|
<div class="hc-card-item-sub">
|
|
<div class="item-sub-title">截至目前项目总测算成本</div>
|
|
<div class="item-sub-title">截至目前项目总测算成本</div>
|
|
<div class="item-sub-num">
|
|
<div class="item-sub-num">
|
|
- <span class="num">560333</span>
|
|
|
|
|
|
+ <span class="num">{{statsAll.allProjectCost}}</span>
|
|
<span class="text">元</span>
|
|
<span class="text">元</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -28,7 +28,7 @@
|
|
<div class="hc-card-item-sub">
|
|
<div class="hc-card-item-sub">
|
|
<div class="item-sub-title">截至目前总实际支出成本</div>
|
|
<div class="item-sub-title">截至目前总实际支出成本</div>
|
|
<div class="item-sub-num">
|
|
<div class="item-sub-num">
|
|
- <span class="num">903333</span>
|
|
|
|
|
|
+ <span class="num">{{statsAll.allPracticalDisburse}}</span>
|
|
<span class="text">元</span>
|
|
<span class="text">元</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -39,7 +39,7 @@
|
|
<div class="hc-card-item-sub">
|
|
<div class="hc-card-item-sub">
|
|
<div class="item-sub-title">截至目前总回款</div>
|
|
<div class="item-sub-title">截至目前总回款</div>
|
|
<div class="item-sub-num">
|
|
<div class="item-sub-num">
|
|
- <span class="num">125333</span>
|
|
|
|
|
|
+ <span class="num">{{statsAll.allReturned}}</span>
|
|
<span class="text">元</span>
|
|
<span class="text">元</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -76,8 +76,8 @@
|
|
<div class="hc-expense-total-title" v-else>列表统计</div>
|
|
<div class="hc-expense-total-title" v-else>列表统计</div>
|
|
</template>
|
|
</template>
|
|
<HcTable ui="no-border" border :isIndex="false" :column="tableColumn" :datas="tableData" v-if="isShowtable === 0">
|
|
<HcTable ui="no-border" border :isIndex="false" :column="tableColumn" :datas="tableData" v-if="isShowtable === 0">
|
|
- <template #name="{row}">
|
|
|
|
- <span class="text-blue text-hover" @click='rowNameClick(row)'>{{ row.name }}</span>
|
|
|
|
|
|
+ <template #projectName="{row}">
|
|
|
|
+ <span class="text-blue text-hover" @click='rowNameClick(row)'>{{ row.projectName }}</span>
|
|
</template>
|
|
</template>
|
|
</HcTable>
|
|
</HcTable>
|
|
<!--费用分类-->
|
|
<!--费用分类-->
|
|
@@ -89,8 +89,8 @@
|
|
</HcTable>
|
|
</HcTable>
|
|
<!--细分环节费用-->
|
|
<!--细分环节费用-->
|
|
<HcTable ui="no-border" border :isIndex="false" :column="tableColumn2" :datas="tableData2" v-if="isShowtable === 2">
|
|
<HcTable ui="no-border" border :isIndex="false" :column="tableColumn2" :datas="tableData2" v-if="isShowtable === 2">
|
|
- <template #type="{row}">
|
|
|
|
- <HcIcon name="checkbox-circle" class="text-green text-xl" v-if="row.type === 1"/>
|
|
|
|
|
|
+ <template #isParticipate="{row}">
|
|
|
|
+ <HcIcon name="checkbox-circle" class="text-green text-xl" v-if="row.isParticipate === 1"/>
|
|
<HcIcon name="error-warning" class="text-red text-xl" v-else/>
|
|
<HcIcon name="error-warning" class="text-red text-xl" v-else/>
|
|
</template>
|
|
</template>
|
|
<template #detail="{row}">
|
|
<template #detail="{row}">
|
|
@@ -109,12 +109,31 @@
|
|
import {onActivated, ref} from "vue";
|
|
import {onActivated, ref} from "vue";
|
|
import mainApi from "~api/static/project";
|
|
import mainApi from "~api/static/project";
|
|
import { ArrowRight } from '@element-plus/icons-vue'
|
|
import { ArrowRight } from '@element-plus/icons-vue'
|
|
|
|
+import {getArrValue, getObjValue} from "js-fast-way";
|
|
|
|
|
|
//缓存被激活
|
|
//缓存被激活
|
|
onActivated(() => {
|
|
onActivated(() => {
|
|
-
|
|
|
|
|
|
+ getDataApi()
|
|
})
|
|
})
|
|
|
|
|
|
|
|
+
|
|
|
|
+const getDataApi = () => {
|
|
|
|
+ allProjectStats()
|
|
|
|
+ getTableData()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//项目统计总金额成本
|
|
|
|
+const statsAll = ref({})
|
|
|
|
+const allProjectStats = async () => {
|
|
|
|
+ const {error, code, data} = await mainApi.allProjectStats()
|
|
|
|
+ //判断状态
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ statsAll.value = getObjValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ statsAll.value = {}
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
//面包屑导航
|
|
//面包屑导航
|
|
const breadcrumbs = ref({title: '列表统计', name: '', section: '', post: ''})
|
|
const breadcrumbs = ref({title: '列表统计', name: '', section: '', post: ''})
|
|
|
|
|
|
@@ -150,63 +169,51 @@ const breadcrumbSection = () => {
|
|
//基础表格
|
|
//基础表格
|
|
const isShowtable = ref(0)
|
|
const isShowtable = ref(0)
|
|
const tableColumn = [
|
|
const tableColumn = [
|
|
- {key: 'name', name: '名称', minWidth: 200},
|
|
|
|
- {key: 'contract', name: '合同额', align: 'center'},
|
|
|
|
- {key: 'cost', name: '测算成本', align: 'center'},
|
|
|
|
- {key: 'disbursed', name: '实际已支出成本', align: 'center'},
|
|
|
|
- {key: 'receive', name: '实际已回款', align: 'center'},
|
|
|
|
- {key: 'uncollected', name: '未回款', align: 'center'},
|
|
|
|
|
|
+ {key: 'projectName', name: '名称', minWidth: 200},
|
|
|
|
+ {key: 'contractMoney', name: '合同额', align: 'center'},
|
|
|
|
+ {key: 'allProjectCost', name: '测算成本', align: 'center'},
|
|
|
|
+ {key: 'allPracticalDisburse', name: '实际已支出成本', align: 'center'},
|
|
|
|
+ {key: 'allReturned', name: '实际已回款', align: 'center'},
|
|
|
|
+ {key: 'unreturnedMoney', name: '未回款', align: 'center'},
|
|
]
|
|
]
|
|
-const tableData = ref([
|
|
|
|
- {
|
|
|
|
- name: '延长高速公路大蒲柴河至烟筒山段PPP项目',
|
|
|
|
- contract: '222',
|
|
|
|
- cost: 'red',
|
|
|
|
- disbursed: '1111',
|
|
|
|
- receive: '1111',
|
|
|
|
- uncollected: '2222',
|
|
|
|
- total: 10000
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- name: '延长高速公路大蒲柴河至烟筒山段PPP项目',
|
|
|
|
- contract: '222',
|
|
|
|
- cost: 'red',
|
|
|
|
- disbursed: '1111',
|
|
|
|
- receive: '1111',
|
|
|
|
- uncollected: '2222',
|
|
|
|
- total: 10000
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- name: '延长高速公路大蒲柴河至烟筒山段PPP项目',
|
|
|
|
- contract: '222',
|
|
|
|
- cost: 'red',
|
|
|
|
- disbursed: '1111',
|
|
|
|
- receive: '1111',
|
|
|
|
- uncollected: '2222',
|
|
|
|
- total: 10000
|
|
|
|
- },
|
|
|
|
-])
|
|
|
|
-const rowNameClick = (row) => {
|
|
|
|
- breadcrumbs.value.name = row.name
|
|
|
|
|
|
+const tableData = ref([])
|
|
|
|
+const getTableData = async () => {
|
|
|
|
+ const {error, code, data} = await mainApi.ProjectListStats()
|
|
|
|
+ //判断状态
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ tableData.value = getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ tableData.value = []
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const rowNameClick = ({projectId, projectName}) => {
|
|
|
|
+ breadcrumbs.value.name = projectName
|
|
isShowtable.value = 1
|
|
isShowtable.value = 1
|
|
|
|
+ getTableData1(projectId)
|
|
}
|
|
}
|
|
|
|
|
|
//费用分类
|
|
//费用分类
|
|
const tableColumn1 = [
|
|
const tableColumn1 = [
|
|
- {key: 'name', name: '费用分类', align: 'center'},
|
|
|
|
- {key: 'contract', name: '测算费用(元)', align: 'center'},
|
|
|
|
- {key: 'cost', name: '测算费用(元)', align: 'center'},
|
|
|
|
|
|
+ {key: 'costTypeValue', name: '费用分类', align: 'center'},
|
|
|
|
+ {key: 'allProjectCost', name: '测算费用(元)', align: 'center'},
|
|
|
|
+ {key: 'practicalCost', name: '实际费用(元)', align: 'center'},
|
|
{key: 'detail', name: '费用明细', align: 'center'},
|
|
{key: 'detail', name: '费用明细', align: 'center'},
|
|
{key: 'total', name: '总计', align: 'center'},
|
|
{key: 'total', name: '总计', align: 'center'},
|
|
]
|
|
]
|
|
-const tableData1 = ref([
|
|
|
|
- {name: '市场部', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
- {name: '研发部', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
- {name: '实施部', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
- {name: '维护部', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
- {name: '管理支出', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
- {name: '外包劳务', contract: 2222, cost: 4444, total: 5555},
|
|
|
|
-])
|
|
|
|
|
|
+const tableData1 = ref([])
|
|
|
|
+const getTableData1 = async (projectId) => {
|
|
|
|
+ const {error, code, data} = await mainApi.ProjectCostTypeStats({
|
|
|
|
+ id: projectId
|
|
|
|
+ })
|
|
|
|
+ //判断状态
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ tableData1.value = getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ tableData1.value = []
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
//合并单元格
|
|
//合并单元格
|
|
const tableSpanMethod1 = ({columnIndex}) => {
|
|
const tableSpanMethod1 = ({columnIndex}) => {
|
|
@@ -215,49 +222,48 @@ const tableSpanMethod1 = ({columnIndex}) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-const rowNameClick1 = (row) => {
|
|
|
|
- breadcrumbs.value.section = row.name
|
|
|
|
|
|
+const rowNameClick1 = ({costTypeValue, costType, projectId}) => {
|
|
|
|
+ breadcrumbs.value.section = costTypeValue
|
|
isShowtable.value = 2
|
|
isShowtable.value = 2
|
|
|
|
+ getTableData2(costType, projectId)
|
|
}
|
|
}
|
|
|
|
|
|
//细分环节费用
|
|
//细分环节费用
|
|
const tableColumn2 = [
|
|
const tableColumn2 = [
|
|
{key: 'name', name: '项目环节'},
|
|
{key: 'name', name: '项目环节'},
|
|
- {key: 'type', name: '参与', align: 'center'},
|
|
|
|
- {key: 'cost', name: '成本支出(元)', align: 'center'},
|
|
|
|
- {key: 'timecost', name: '时间成本(工作日)', align: 'center'},
|
|
|
|
- {key: 'peoplecost', name: '人员投入(人)', align: 'center'},
|
|
|
|
|
|
+ {key: 'isParticipate', name: '参与', align: 'center'},
|
|
|
|
+ {key: 'costDisburse', name: '成本支出(元)', align: 'center'},
|
|
|
|
+ {key: 'timeCost', name: '时间成本(工作日)', align: 'center'},
|
|
|
|
+ {key: 'staffTotal', name: '人员投入(人)', align: 'center'},
|
|
{key: 'detail', name: '明细', align: 'center'},
|
|
{key: 'detail', name: '明细', align: 'center'},
|
|
]
|
|
]
|
|
-const tableData2 = ref([
|
|
|
|
- {name: '商机-演示沟通', type: 1, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
- {name: '商机-演示沟通', type: 1, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
- {name: '商机-演示沟通', type: 1, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
- {name: '商机-演示沟通', type: 2, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
- {name: '商机-演示沟通', type: 2, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
- {name: '商机-演示沟通', type: 2, cost: 4444, timecost: 12, peoplecost: 3},
|
|
|
|
-])
|
|
|
|
-const rowNameClick2 = (row) => {
|
|
|
|
- breadcrumbs.value.post = row.name
|
|
|
|
|
|
+const tableData2 = ref([])
|
|
|
|
+const getTableData2 = async (typeId,projectId) => {
|
|
|
|
+ const {error, code, data} = await mainApi.projectLinkCost({
|
|
|
|
+ costType: typeId,
|
|
|
|
+ projectId: projectId
|
|
|
|
+ })
|
|
|
|
+ //判断状态
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ tableData2.value = getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ tableData2.value = []
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const rowNameClick2 = ({name, costDetails}) => {
|
|
|
|
+ breadcrumbs.value.post = name
|
|
isShowtable.value = 3
|
|
isShowtable.value = 3
|
|
|
|
+ tableData3.value = costDetails
|
|
}
|
|
}
|
|
|
|
|
|
//细分环节费用
|
|
//细分环节费用
|
|
const tableColumn3 = [
|
|
const tableColumn3 = [
|
|
- {key: 'name', name: '费用分类'},
|
|
|
|
|
|
+ {key: 'costTypeValue', name: '费用分类'},
|
|
{key: 'price', name: '费用(元)', align: 'center'},
|
|
{key: 'price', name: '费用(元)', align: 'center'},
|
|
{key: 'total', name: '总计', align: 'center'},
|
|
{key: 'total', name: '总计', align: 'center'},
|
|
]
|
|
]
|
|
-const tableData3 = ref([
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
- {name: '人工成本', price: 4444, total: 124444},
|
|
|
|
-])
|
|
|
|
|
|
+const tableData3 = ref([])
|
|
//合并单元格
|
|
//合并单元格
|
|
const tableSpanMethod2 = ({columnIndex}) => {
|
|
const tableSpanMethod2 = ({columnIndex}) => {
|
|
if (columnIndex === tableColumn3.length -1 && tableData1.value.length > 0) {
|
|
if (columnIndex === tableColumn3.length -1 && tableData1.value.length > 0) {
|