|
@@ -29,7 +29,23 @@
|
|
|
<div class="icon"></div>
|
|
|
<span class="item-name">本年结算情况</span>
|
|
|
</div>
|
|
|
- <div class="content"></div>
|
|
|
+ <div class="content">
|
|
|
+ <div class="chart-container">
|
|
|
+ <ComRightAngelPercentChart :value="0" />
|
|
|
+ </div>
|
|
|
+ <div class="dataInfo">
|
|
|
+ <div class="data-item" v-for="(item, index) of settleList" :key="item.name">
|
|
|
+ <div
|
|
|
+ class="pointSymbol"
|
|
|
+ :style="index == 0 ? 'background:#2BA7FF;box-shadow: 0px 0px 10px #2BA7FF;' : ''"
|
|
|
+ ></div>
|
|
|
+ <div class="data-wrap">
|
|
|
+ <div class="data-title">{{ item.name }}</div>
|
|
|
+ <div class="data-value data-value-settle">{{ item.value }} {{ item.unit }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<!-- -->
|
|
|
<div class="content-item outputValue">
|
|
@@ -37,7 +53,28 @@
|
|
|
<div class="icon"></div>
|
|
|
<span class="item-name">建管本年产值统计</span>
|
|
|
</div>
|
|
|
- <div class="content"></div>
|
|
|
+ <div class="content">
|
|
|
+ <div class="chart-container">
|
|
|
+ <div class="chart-title">
|
|
|
+ 完成占比:<span>{{ complishPercent }}%</span>
|
|
|
+ </div>
|
|
|
+ <ComThreeDimensionsChart v-on="{ fontSize }" :chartData="staList" :distance="150" />
|
|
|
+ <!-- 底座背景 -->
|
|
|
+ <div class="bg" :style="{ 'background-image': `url('${url}')` }"></div>
|
|
|
+ </div>
|
|
|
+ <div class="dataInfo">
|
|
|
+ <div class="data-item" v-for="(item, index) of staList" :key="item.name">
|
|
|
+ <div
|
|
|
+ class="pointSymbol"
|
|
|
+ :style="index == 0 ? 'background:#13D28A;box-shadow: 0px 0px 10px #13D28A;' : ''"
|
|
|
+ ></div>
|
|
|
+ <div class="data-wrap">
|
|
|
+ <div class="data-title">{{ item.name }}</div>
|
|
|
+ <div class="data-value">{{ item.value }} {{ item.unit }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<!-- -->
|
|
|
<div class="content-item outputValueSta">
|
|
@@ -45,7 +82,36 @@
|
|
|
<div class="icon"></div>
|
|
|
<span class="item-name">建管本年产值统计</span>
|
|
|
</div>
|
|
|
- <div class="content"></div>
|
|
|
+ <div class="content OVSContent">
|
|
|
+ <div class="bc-item">
|
|
|
+ <div class="bc-title">人员配置</div>
|
|
|
+ <div class="bc-value">
|
|
|
+ 总人数:<span>{{ totalPerson }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bc-content">
|
|
|
+ <div class="bcb-item" v-for="item in staffingList" :key="item.title">
|
|
|
+ <div class="bcb-title">{{ item.title }}</div>
|
|
|
+ <div class="bcb-value">{{ item.value }}{{ item.unit }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bc-item">
|
|
|
+ <div class="bc-title">设备配置</div>
|
|
|
+ <div class="bc-value">
|
|
|
+ 总数量:<span>{{ totalDevice }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bcb-content">
|
|
|
+ <el-carousel :autoplay="true" direction="vertical">
|
|
|
+ <el-carousel-item v-for="(part, index) in devicesList" :key="index">
|
|
|
+ <div class="bcbc-item" v-for="item in part.list" :key="item.title">
|
|
|
+ <div class="bcbc-title">{{ item.title }}</div>
|
|
|
+ <div class="bcbc-value">{{ item.value }}{{ item.unit }}</div>
|
|
|
+ </div>
|
|
|
+ </el-carousel-item>
|
|
|
+ </el-carousel>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -61,6 +127,8 @@ import ComOneBatteryChart from '../../components/BatteryChart/ComOneBatteryChart
|
|
|
import ComProgressChart from '../../components/BarChart/ComProgressChart.vue'
|
|
|
import ComProgressPieChart from '../../components/PieChart/ComProgressPieChart.vue'
|
|
|
import ComThreeDimensionsChart from '../../components/OthersChart/ComThreeDimensionsChart.vue'
|
|
|
+import ComRightAngelPercentChart from '../../components/PieChart/ComRightAngelPercentChart.vue'
|
|
|
+
|
|
|
const staffTypeList = [
|
|
|
{ code: 'person_all', name: '总包部' },
|
|
|
{ code: 'person_build', name: '建设部' },
|
|
@@ -82,7 +150,13 @@ const deviceTypeList = [
|
|
|
//项目进展
|
|
|
@Component({
|
|
|
name: 'ProjectProgress',
|
|
|
- components: { ComOneBatteryChart, ComProgressChart, ComProgressPieChart, ComThreeDimensionsChart }
|
|
|
+ components: {
|
|
|
+ ComOneBatteryChart,
|
|
|
+ ComProgressChart,
|
|
|
+ ComProgressPieChart,
|
|
|
+ ComThreeDimensionsChart,
|
|
|
+ ComRightAngelPercentChart
|
|
|
+ }
|
|
|
})
|
|
|
export default class ProjectProgress extends Vue {
|
|
|
@Prop({ type: Object, default: () => {} }) dataInfo!: any
|
|
@@ -93,6 +167,7 @@ export default class ProjectProgress extends Vue {
|
|
|
buildStatusData: object = {}
|
|
|
buildDredgingData: object = {}
|
|
|
complishPercent: number = 0 //完成占比
|
|
|
+ settleList: Array<any> = [{}, {}]
|
|
|
staList: Array<any> = [{}, {}]
|
|
|
totalPerson: number = 0
|
|
|
totalDevice: number = 0
|
|
@@ -107,98 +182,9 @@ export default class ProjectProgress extends Vue {
|
|
|
get projectCode() {
|
|
|
return this.$store.state.bigScreen.currentProjectCode
|
|
|
}
|
|
|
- // @Watch('projectCode', { immediate: true })
|
|
|
- // onChangMehod() {
|
|
|
- // setTimeout(() => {
|
|
|
- // this.getPageData()
|
|
|
- // }, 3000)
|
|
|
- // }
|
|
|
roundFun(value, n) {
|
|
|
return Math.round(value * Math.pow(10, n)) / Math.pow(10, n)
|
|
|
}
|
|
|
- // getPageData() {
|
|
|
- // let data = { blockCode: 'ycepclist' }
|
|
|
- // let projectCode = this.projectCode
|
|
|
- // this.reset()
|
|
|
- // //获取全部数据
|
|
|
- // getRequestResult(data).then((res: Array<any>) => {
|
|
|
- // res = res.filter((item) => item.indexCode.indexOf(projectCode + '-') != -1)
|
|
|
- // res = res.map((item) => {
|
|
|
- // Object.keys(item).forEach((val) => (item[val] = item[val] || ''))
|
|
|
- // return {
|
|
|
- // ...item,
|
|
|
- // indexValue:
|
|
|
- // item.unit === '万'
|
|
|
- // ? this.roundFun(this.setNoNull(item.indexValue) / 10000, 4)
|
|
|
- // : this.setNoNull(item.indexValue)
|
|
|
- // }
|
|
|
- // })
|
|
|
- // //投资完成情况
|
|
|
- // this.investData = {
|
|
|
- // num: res.find((e) => e.indexCode == projectCode + '-' + 21).indexValue,
|
|
|
- // numUnit: res.find((e) => e.indexCode == projectCode + '-' + 2).unit,
|
|
|
- // total: res.find((e) => e.indexCode == projectCode + '-' + 2).indexValue,
|
|
|
- // totalUnit: res.find((e) => e.indexCode == projectCode + '-' + 2).unit
|
|
|
- // }
|
|
|
- // //设计进度
|
|
|
- // this.progressData = this.progressData.map((item, index) => {
|
|
|
- // let target = index * 2
|
|
|
- // return {
|
|
|
- // name: res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).indexName,
|
|
|
- // percent:
|
|
|
- // res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).indexValue +
|
|
|
- // res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).unit,
|
|
|
- // totalAmout: res.find((e) => e.indexCode == projectCode + '-' + (target + 25)).indexValue,
|
|
|
- // finishAmout: res.find((e) => e.indexCode == projectCode + '-' + (target + 26)).indexValue
|
|
|
- // }
|
|
|
- // })
|
|
|
- // //施工进度
|
|
|
- // this.buildStatusData = {
|
|
|
- // building: res.find((e) => e.indexCode == projectCode + '-' + 31).indexValue,
|
|
|
- // finished: res.find((e) => e.indexCode == projectCode + '-' + 32).indexValue,
|
|
|
- // nobuilding: res.find((e) => e.indexCode == projectCode + '-' + 33).indexValue,
|
|
|
- // unit: res.find((e) => e.indexCode == projectCode + '-' + 31).unit
|
|
|
- // }
|
|
|
- // this.buildDredgingData = {
|
|
|
- // building: res.find((e) => e.indexCode == projectCode + '-' + 34).indexValue,
|
|
|
- // finished: 0,
|
|
|
- // nobuilding: res.find((e) => e.indexCode == projectCode + '-' + 35).indexValue,
|
|
|
- // unit: res.find((e) => e.indexCode == projectCode + '-' + 34).unit
|
|
|
- // }
|
|
|
- // //上周项目情况
|
|
|
- // this.complishPercent =
|
|
|
- // res.find((e) => e.indexCode == projectCode + '-' + 38).indexValue +
|
|
|
- // res.find((e) => e.indexCode == projectCode + '-' + 38).unit
|
|
|
- // this.staList = this.staList.map((item, index) => {
|
|
|
- // return {
|
|
|
- // name: res.find((e) => e.indexCode == projectCode + '-' + (index + 36)).indexName,
|
|
|
- // value: res.find((e) => e.indexCode == projectCode + '-' + (index + 36)).indexValue,
|
|
|
- // unit: '亿'
|
|
|
- // }
|
|
|
- // })
|
|
|
- // //
|
|
|
- // this.totalPerson = res.find((e) => e.indexCode == projectCode + '-' + +39).indexValue
|
|
|
- // this.totalDevice = res.find((e) => e.indexCode == projectCode + '-' + +40).indexValue
|
|
|
- // res
|
|
|
- // .filter((item) => item.indexCode.indexOf(projectCode + '-' + '40') != -1)
|
|
|
- // .forEach((citem) => {
|
|
|
- // this.staffingList.push({
|
|
|
- // title: citem.indexName,
|
|
|
- // value: citem.indexValue,
|
|
|
- // unit: citem.unit
|
|
|
- // })
|
|
|
- // })
|
|
|
- // res
|
|
|
- // .filter((item) => item.indexCode.indexOf(projectCode + '-' + '44') != -1)
|
|
|
- // .forEach((citem) => {
|
|
|
- // this.devicesList.push({
|
|
|
- // title: citem.indexName,
|
|
|
- // value: citem.indexValue,
|
|
|
- // unit: citem.unit
|
|
|
- // })
|
|
|
- // })
|
|
|
- // })
|
|
|
- // }
|
|
|
reset() {
|
|
|
this.staffingList = []
|
|
|
this.devicesList = []
|
|
@@ -228,8 +214,12 @@ export default class ProjectProgress extends Vue {
|
|
|
this.contructContent = contruct_content
|
|
|
this.complishPercent = year_finish_ratio
|
|
|
this.staList = [
|
|
|
- { name: '本年计划完成产值', value: +year_plan, unit: '万元' },
|
|
|
- { name: '本年实际完成产值', value: +year_finish, unit: '万元' }
|
|
|
+ { name: '本年完成产值', value: +year_finish, unit: '万元' },
|
|
|
+ { name: '年度产值计划', value: +year_plan, unit: '万元' }
|
|
|
+ ]
|
|
|
+ this.settleList = [
|
|
|
+ { name: '本年投资计划', value: 0, unit: '万元' },
|
|
|
+ { name: '本年结算金额', value: 0, unit: '万元' }
|
|
|
]
|
|
|
let staff = [],
|
|
|
devices = []
|
|
@@ -243,9 +233,22 @@ export default class ProjectProgress extends Vue {
|
|
|
}
|
|
|
this.staffingList = staff
|
|
|
this.totalPerson = this.countTotal(staff, 'value')
|
|
|
- this.devicesList = devices
|
|
|
+ this.devicesList = this.splitArr(devices, 4)
|
|
|
this.totalDevice = this.countTotal(devices, 'value')
|
|
|
}
|
|
|
+ splitArr(res, splitNum = 5) {
|
|
|
+ let temp = [],
|
|
|
+ symbol = 0
|
|
|
+ res.forEach((item: any, index) => {
|
|
|
+ if ((index + 1) % splitNum != 0) {
|
|
|
+ temp[symbol] ? temp[symbol].list.push({ ...item }) : temp.push({ list: [{ ...item }] })
|
|
|
+ } else {
|
|
|
+ temp[symbol].list.length < splitNum ? temp[symbol].list.push({ ...item }) : temp.push({ list: [{ ...item }] })
|
|
|
+ symbol++
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return temp
|
|
|
+ }
|
|
|
countTotal(arr, keyName) {
|
|
|
let total = 0
|
|
|
total = arr.reduce(function (total, currentValue, currentIndex, arr) {
|
|
@@ -372,16 +375,221 @@ export default class ProjectProgress extends Vue {
|
|
|
line-height: 0.109375rem /* 21/192 */;
|
|
|
word-break: break-all;
|
|
|
}
|
|
|
+ .chart-container {
|
|
|
+ width: 50%;
|
|
|
+ position: relative;
|
|
|
+ .chart-title {
|
|
|
+ position: absolute;
|
|
|
+ left: 0.15625rem /* 30/192 */;
|
|
|
+ font-size: 0.083333rem /* 16/192 */;
|
|
|
+ font-family: Source Han Sans CN;
|
|
|
+ font-weight: bold;
|
|
|
+ top: 0.052083rem /* 10/192 */;
|
|
|
+ color: #ffffff;
|
|
|
+ white-space: normal;
|
|
|
+ span {
|
|
|
+ font-family: AgencyFB-Bold;
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 0.104167rem /* 20/192 */;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bg {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ .bg {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: -0.026042rem /* 5/192 */;
|
|
|
+ right: 0;
|
|
|
+ margin: 0 auto;
|
|
|
+ width: 80%;
|
|
|
+ // width: 55%;
|
|
|
+ // height: 95%;
|
|
|
+ // left: 0.041667rem /* 8/192 */;
|
|
|
+ z-index: -1;
|
|
|
+ // width: 0.46875rem /* 90/192 */;
|
|
|
+ // height: 0.390625rem /* 75/192 */;
|
|
|
+ background: no-repeat center;
|
|
|
+ // background-image: url('~@/views/groupPage/images/底座样式.png');
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .dataInfo {
|
|
|
+ width: 50%;
|
|
|
+ display: flex;
|
|
|
+ flex-flow: column;
|
|
|
+ justify-content: space-around;
|
|
|
+ font-family: Source Han Sans CN;
|
|
|
+
|
|
|
+ .data-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 0.052083rem /* 10/192 */;
|
|
|
+ color: #ffffff;
|
|
|
+ height: 45%;
|
|
|
+ position: relative;
|
|
|
+ .pointSymbol,
|
|
|
+ .data-title {
|
|
|
+ margin-right: 0.052083rem /* 10/192 */;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ .pointSymbol {
|
|
|
+ border-radius: 50%;
|
|
|
+ height: 0.052083rem /* 10/192 */;
|
|
|
+ width: 0.052083rem /* 10/192 */;
|
|
|
+ }
|
|
|
+ .data-wrap {
|
|
|
+ display: flex;
|
|
|
+ flex-flow: column;
|
|
|
+ }
|
|
|
+ .data-title {
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #87bfe8;
|
|
|
+ }
|
|
|
+ .data-value {
|
|
|
+ font-size: 0.09375rem /* 18/192 */;
|
|
|
+ font-family: AgencyFB-Bold;
|
|
|
+ font-weight: bold;
|
|
|
+ // color: #ffffff;
|
|
|
+ padding: 0.052083rem /* 10/192 */ 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .data-item:first-child {
|
|
|
+ .data-value {
|
|
|
+ color: #13d28a;
|
|
|
+ background: linear-gradient(0deg, #01b174 0%, #35ffcb 100%);
|
|
|
+ background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ }
|
|
|
+ .data-value-settle {
|
|
|
+ color: #12d3ff;
|
|
|
+ background: linear-gradient(180deg, #50d6fd 0%, #2d92fa 100%);
|
|
|
+ background-clip: text;
|
|
|
+ -webkit-text-fill-color: transparent;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .data-item:first-child::after {
|
|
|
+ content: '';
|
|
|
+ height: 0.005208rem /* 1/192 */;
|
|
|
+ width: 90%;
|
|
|
+ background: rgba(11, 122, 192, 0.3);
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ margin: 0 auto;
|
|
|
+ position: absolute;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .OVSContent {
|
|
|
+ width: 100%;
|
|
|
+ height: calc(100% - 0.135417rem /* 26/192 */);
|
|
|
+ display: flex;
|
|
|
+ flex-flow: column;
|
|
|
+ .bc-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ height: 0.208333rem /* 40/192 */;
|
|
|
+ background: rgba(14, 167, 255, 0.14);
|
|
|
+ padding: 0.052083rem /* 10/192 */;
|
|
|
+ margin-bottom: 0.03125rem /* 6/192 */;
|
|
|
+ .bc-title {
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #2ba7ff;
|
|
|
+ }
|
|
|
+ .bc-value {
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ font-weight: 400;
|
|
|
+ color: rgba(139, 191, 228, 1);
|
|
|
+ & > span {
|
|
|
+ font-family: AgencyFB-Bold;
|
|
|
+ font-weight: bold;
|
|
|
+ color: rgba(43, 167, 255, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bc-content {
|
|
|
+ height: 0.3125rem /* 60/192 */;
|
|
|
+ width: 100%;
|
|
|
+ background: rgba(255, 255, 255, 0.1);
|
|
|
+ margin-bottom: 0.052083rem /* 10/192 */;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-around;
|
|
|
+ .bcb-item {
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-flow: column;
|
|
|
+ justify-content: space-around;
|
|
|
+ .bcb-title {
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ font-weight: 400;
|
|
|
+ color: #ffffff;
|
|
|
+ }
|
|
|
+ .bcb-value {
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #ffffff;
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bcb-content {
|
|
|
+ width: 100%;
|
|
|
+ height: 0.442708rem /* 85/192 */;
|
|
|
+ overflow: auto;
|
|
|
+ /deep/ .el-carousel {
|
|
|
+ height: 100%;
|
|
|
+ width: 100%;
|
|
|
+ .el-carousel__container {
|
|
|
+ height: inherit;
|
|
|
+ width: inherit;
|
|
|
+ }
|
|
|
+ .el-carousel__indicators {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bcbc-item {
|
|
|
+ width: calc(50% - 0.020833rem /* 4/192 */);
|
|
|
+ height: 0.208333rem /* 40/192 */;
|
|
|
+ background: rgba(255, 255, 255, 0.1);
|
|
|
+ float: left;
|
|
|
+ margin-bottom: 0.026042rem /* 5/192 */;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 0 0.052083rem /* 10/192 */;
|
|
|
+ font-size: 0.072917rem /* 14/192 */;
|
|
|
+ color: #ffffff;
|
|
|
+ .bcbc-title {
|
|
|
+ font-family: Source Han Sans CN;
|
|
|
+ font-weight: 400;
|
|
|
+ }
|
|
|
+ .bcbc-value {
|
|
|
+ font-family: Source Han Sans CN-MEDIUM;
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .bcbc-item:nth-child(odd) {
|
|
|
+ margin-right: 0.041667rem /* 8/192 */;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
.progress {
|
|
|
- height: 0.859375rem /* 165/192 */ !important;
|
|
|
+ // height: 0.859375rem /* 165/192 */ !important;
|
|
|
+ height: calc(100% - 3.666667rem /* 704/192 */) !important;
|
|
|
}
|
|
|
.settlement,
|
|
|
.outputValue {
|
|
|
- height: 1.041667rem /* 200/192 */ !important;
|
|
|
+ height: 0.9375rem /* 180/192 */ !important;
|
|
|
}
|
|
|
.outputValueSta {
|
|
|
- height: calc(100% - 3.151042rem /* 605/192 */) !important;
|
|
|
+ // height: calc(100% - 3.151042rem /* 605/192 */) !important;
|
|
|
+ height: 1.583333rem /* 304/192 */ !important;
|
|
|
}
|
|
|
}
|
|
|
}
|