diff --git a/.env.development b/.env.development index d905b86..b59befd 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,7 @@ VITE_APP_TITLE = 煤科建管平台 VITE_APP_ENV = 'development' # 开发环境 -VITE_APP_BASE_API = 'http://192.168.110.209:8899' +VITE_APP_BASE_API = 'http://192.168.110.180:8899' # 无人机接口地址 diff --git a/package.json b/package.json index 7053b13..67291cb 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "diagram-js": "12.3.0", "didi": "9.0.2", "echarts": "5.5.0", + "echarts-gl": "^2.0.9", "element-plus": "2.8.8", "esbuild": "^0.25.0", "ezuikit-js": "^8.1.10", diff --git a/src/api/tender/index.ts b/src/api/tender/index.ts new file mode 100644 index 0000000..65a71a6 --- /dev/null +++ b/src/api/tender/index.ts @@ -0,0 +1,93 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; + +//获取版本 +export const obtainAllVersionNumbers = (query: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList/obtainAllVersionNumbers', + method: 'get', + params: query + }); +}; +//获取sheet +export const sheetList = (query: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList/sheetList', + method: 'get', + params: query + }); +}; +//获取表格数据 +export const getTableList = (query: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList/list', + method: 'get', + params: query + }); +}; +//修改单价数据 +export const updatePrice = (query: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList', + method: 'put', + data: query + }); +}; +//导入 +export const importExcelFile = (query: any, data: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList/importExcelFile', + method: 'post', + params: query, + data + }); +}; + +//招标计划列表 + +export const tenderPlanList = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan/list', + method: 'get', + params: query + }); +}; +//新增招标计划 +export const addTenderPlan = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan', + method: 'post', + data: query + }); +}; +//删除招标计划 +export const delTenderPlan = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan/' + query.ids, + method: 'delete' + }); +}; +//修改招标计划 +export const updateTenderPlan = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan', + method: 'put', + data: query + }); +}; +//弹窗数据 +export const treeList = (query: any): AxiosPromise => { + return request({ + url: '/tender/tenderPlanLimitList/getTree', + method: 'get', + params: query + }); +}; +//获取招标计划详情 +export const getTenderPlanDetail = (query: any): AxiosPromise => { + return request({ + url: '/tender/biddingPlan/getMore', + method: 'get', + params: query + }); +}; diff --git a/src/assets/large/down.png b/src/assets/large/down.png new file mode 100644 index 0000000..bd2f400 Binary files /dev/null and b/src/assets/large/down.png differ diff --git a/src/assets/large/title_bottom.png b/src/assets/large/title_bottom.png new file mode 100644 index 0000000..156eef8 Binary files /dev/null and b/src/assets/large/title_bottom.png differ diff --git a/src/assets/large/title_icon.png b/src/assets/large/title_icon.png new file mode 100644 index 0000000..caa02d9 Binary files /dev/null and b/src/assets/large/title_icon.png differ diff --git a/src/assets/large/top1.png b/src/assets/large/top1.png new file mode 100644 index 0000000..a5b8268 Binary files /dev/null and b/src/assets/large/top1.png differ diff --git a/src/assets/large/top2.png b/src/assets/large/top2.png new file mode 100644 index 0000000..9334e6d Binary files /dev/null and b/src/assets/large/top2.png differ diff --git a/src/assets/large/top3.png b/src/assets/large/top3.png new file mode 100644 index 0000000..4a67e61 Binary files /dev/null and b/src/assets/large/top3.png differ diff --git a/src/assets/large/top4.png b/src/assets/large/top4.png new file mode 100644 index 0000000..1cbe562 Binary files /dev/null and b/src/assets/large/top4.png differ diff --git a/src/assets/large/up.png b/src/assets/large/up.png new file mode 100644 index 0000000..6cabc10 Binary files /dev/null and b/src/assets/large/up.png differ diff --git a/src/components/EchartBox/index.vue b/src/components/EchartBox/index.vue new file mode 100644 index 0000000..1725eac --- /dev/null +++ b/src/components/EchartBox/index.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/contract/division/index.vue b/src/views/contract/division/index.vue index d5ae5b2..bb6c8d0 100644 --- a/src/views/contract/division/index.vue +++ b/src/views/contract/division/index.vue @@ -463,7 +463,16 @@ const getDetails = (row: any) => { } }); }; - +//监听项目id刷新数据 +const listeningProject = watch( + () => currentProject.value?.id, + (nid, oid) => { + getTabsList(); + } +); +onUnmounted(() => { + listeningProject(); +}); onMounted(() => { getTabsList(); }); diff --git a/src/views/contract/limitPrice/index.vue b/src/views/contract/limitPrice/index.vue index 8f5b608..21233d1 100644 --- a/src/views/contract/limitPrice/index.vue +++ b/src/views/contract/limitPrice/index.vue @@ -3,11 +3,11 @@ - + @@ -100,6 +100,7 @@ const getVersionNums = async () => { try { const params = { projectId: currentProject.value?.id, + workOrderType: '1', pageSize: 1000, pageNum: 1 }; @@ -140,8 +141,8 @@ const changeSheet = () => { const getSheetName = async () => { try { const params = { - projectId: currentProject.value?.id - // versions: queryForm.value.versions + projectId: currentProject.value?.id, + versions: queryForm.value.versions }; const res = await sheetList(params); if (res.code == 200) { @@ -268,8 +269,8 @@ onUnmounted(() => { listeningProject(); }); onMounted(() => { - // getVersionNums(); - getSheetName(); + getVersionNums(); + // getSheetName(); }); diff --git a/src/views/largeScreen/components/ProgressComponent.vue b/src/views/largeScreen/components/ProgressComponent.vue new file mode 100644 index 0000000..da1b86c --- /dev/null +++ b/src/views/largeScreen/components/ProgressComponent.vue @@ -0,0 +1,121 @@ + + + + + \ No newline at end of file diff --git a/src/views/largeScreen/components/RevenueContractCard.vue b/src/views/largeScreen/components/RevenueContractCard.vue new file mode 100644 index 0000000..14154dc --- /dev/null +++ b/src/views/largeScreen/components/RevenueContractCard.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/views/largeScreen/components/TitleComponent.vue b/src/views/largeScreen/components/TitleComponent.vue new file mode 100644 index 0000000..46ed988 --- /dev/null +++ b/src/views/largeScreen/components/TitleComponent.vue @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/src/views/largeScreen/components/bottomboxconpoent.vue b/src/views/largeScreen/components/bottomboxconpoent.vue new file mode 100644 index 0000000..6735331 --- /dev/null +++ b/src/views/largeScreen/components/bottomboxconpoent.vue @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file diff --git a/src/views/largeScreen/components/centerPage.vue b/src/views/largeScreen/components/centerPage.vue index d250de8..aee49f0 100644 --- a/src/views/largeScreen/components/centerPage.vue +++ b/src/views/largeScreen/components/centerPage.vue @@ -1,8 +1,55 @@ @@ -10,6 +57,8 @@ // import { getPowerStationOverview } from '@/api/large'; import * as echarts from 'echarts'; import china from '@/assets/china.json'; +import RevenueContractCard from './RevenueContractCard.vue'; +import bottomboxconpoent from './bottomboxconpoent.vue'; const data = ref({}); // 地图容器引用 @@ -168,9 +217,12 @@ onUnmounted(() => { padding: 0 10px 10px 10px; box-sizing: border-box; + .centerPage_map { width: 100%; - height: 100%; + height: 60%; } + + } diff --git a/src/views/largeScreen/components/leftPage.vue b/src/views/largeScreen/components/leftPage.vue index 4638875..683c9a3 100644 --- a/src/views/largeScreen/components/leftPage.vue +++ b/src/views/largeScreen/components/leftPage.vue @@ -1,13 +1,73 @@ - + - diff --git a/src/views/largeScreen/components/optionList.ts b/src/views/largeScreen/components/optionList.ts index 7d9486f..822fd94 100644 --- a/src/views/largeScreen/components/optionList.ts +++ b/src/views/largeScreen/components/optionList.ts @@ -1,4 +1,5 @@ import * as echarts from 'echarts/core'; +import { text } from 'stream/consumers'; // import { PictorialBarChart } from 'echarts/charts' // 客流量图 export const getOption = (xData: any, yData: any) => { @@ -249,9 +250,10 @@ export const getOption2 = (data: any) => { }; return option; }; -//食堂周报图 +//z折线 export const getLineOption = (lineData: any) => { - const maxData = Math.ceil(Math.max(...lineData.line1)); + const maxData = Math.max(...lineData.line1.flat()); + const option = { backgroundColor: '', tooltip: { @@ -263,42 +265,49 @@ export const getLineOption = (lineData: any) => { }, borderColor: '#7ec7ff' }, - // legend: { - // align: 'left', - // right: '5%', - // top: '1%', - // type: 'plain', - // textStyle: { - // color: '#fff', - // fontSize: 12 - // }, - // // icon:'rect', - // itemGap: 15, - // itemWidth: 18, - // data: [ - // { - // name: '上周销售量' - // }, - // { - // name: '本周销售量' - // } - // ] - // }, + legend: { + align: 'left', + right: '5%', + top: '1%', + type: 'plain', + textStyle: { + color: '#fff', + fontSize: 12 + }, + // icon:'rect', + itemGap: 15, + itemWidth: 18, + data: [ + { + name: '收款金额' + }, + { + name: '付款金额' + }, + { + name: '净现金流' + } + ] + }, grid: { top: '12%', left: '1%', right: '3%', - bottom: '12%', + bottom: '5%', containLabel: true }, xAxis: { type: 'category', data: lineData.xLabel, + boundaryGap: false, axisLine: { show: false }, axisTick: { - show: true + show: false + }, + splitLine: { + show: false }, axisLabel: { textStyle: { @@ -311,28 +320,28 @@ export const getLineOption = (lineData: any) => { type: 'value', max: maxData, splitLine: { - show: true, + show: false, lineStyle: { type: 'solid', color: 'rgba(73, 169, 191, 0.2)' } } }, - dataZoom: [ - { - // show: true, - start: 0, - end: 30, - bottom: 2, // 下滑块距离x轴底部的距离 - height: 23 - }, - { - type: 'inside' - } - ], + // dataZoom: [ + // { + // // show: true, + // start: 0, + // end: 30, + // bottom: 2, // 下滑块距离x轴底部的距离 + // height: 23 + // }, + // { + // type: 'inside' + // } + // ], series: [ { - name: '逆变器功率', + name: '收款金额', type: 'line', symbol: 'circle', // 默认是空心圆(中间是白色的),改成实心圆 showAllSymbol: false, @@ -373,7 +382,95 @@ export const getLineOption = (lineData: any) => { shadowColor: 'rgba(25,163,223, 0.5)', //阴影颜色 shadowBlur: 20 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 }, - data: lineData.line1 + data: lineData.line1[0] + }, + { + name: '付款金额', + type: 'line', + symbol: 'none', // 默认是空心圆(中间是白色的),改成实心圆 + showAllSymbol: false, + symbolSize: 0, + smooth: true, + lineStyle: { + width: 1, + color: 'rgba(255, 224, 179, 1)', // 线条颜色 + borderColor: 'rgba(0,0,0,.4)' + }, + itemStyle: { + color: 'rgba(255, 224, 179, 1)', + borderWidth: 2, + show: true + }, + tooltip: { + show: true + }, + areaStyle: { + //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient( + 0, + 0, + 0, + 1, + [ + { + offset: 0, + color: 'rgba(255, 224, 179, 0.4)' + }, + { + offset: 1, + color: 'rgba(255, 224, 179, 0)' + } + ], + false + ), + shadowColor: 'rgba(255, 224, 179, 0.6)', //阴影颜色 + shadowBlur: 20 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + }, + data: lineData.line1[1] + }, + { + name: '净现金流', + type: 'line', + symbol: 'none', // 默认是空心圆(中间是白色的),改成实心圆 + showAllSymbol: false, + symbolSize: 0, + smooth: true, + lineStyle: { + width: 1, + color: 'rgba(39, 255, 252, 1)', // 线条颜色 + borderColor: 'rgba(0,0,0,.4)' + }, + itemStyle: { + color: 'rgba(39, 255, 252, 1)', + borderWidth: 2, + show: false + }, + tooltip: { + show: true + }, + areaStyle: { + //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 + color: new echarts.graphic.LinearGradient( + 0, + 0, + 0, + 1, + [ + { + offset: 0, + color: 'rgba(39, 255, 252, 0.4)' + }, + { + offset: 1, + color: 'rgba(39, 255, 252, 0)' + } + ], + false + ), + shadowColor: 'rgba(39, 255, 252, 0.5)', //阴影颜色 + shadowBlur: 20 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 + }, + data: lineData.line1[2] } ] }; @@ -481,10 +578,10 @@ export const getDishesOption = (data?: any) => { // 菜品库存图 export const getInventoryOption = () => { const res = { - data: [2800, 300, 3900, 3000, 2450, 2670, 3320], - name: ['麻辣牛肉', '水煮肉片', '酸菜鱼', '辣子鸡丁', '烧白', '冬瓜排骨汤', '清炒油麦菜'], - ratio: [4000, 4000, 4000, 4000, 4000, 4000, 4000] - }, + data: [2800, 300, 3900, 3000, 2450, 2670, 3320], + name: ['麻辣牛肉', '水煮肉片', '酸菜鱼', '辣子鸡丁', '烧白', '冬瓜排骨汤', '清炒油麦菜'], + ratio: [4000, 4000, 4000, 4000, 4000, 4000, 4000] + }, dataIndex = 1; const option = { xAxis: { @@ -600,16 +697,16 @@ export const getBarOptions = (data: any) => { const option = { backgroundColor: '', grid: { - left: '7%', + left: '8%', top: '4%', - bottom: '25%', + bottom: '8%', right: '2%' }, tooltip: { show: true, backgroundColor: '', trigger: 'axis', - formatter: '{b0}:{c0}元', + formatter: '{b0}:{c0}万元', textStyle: { color: '#fff' } @@ -634,7 +731,7 @@ export const getBarOptions = (data: any) => { // show: true, }, splitLine: { - show: true, + show: false, lineStyle: { color: 'rgba(108, 128, 151, 0.3)', type: 'dashed' @@ -646,9 +743,7 @@ export const getBarOptions = (data: any) => { { axisLabel: { formatter: function (value) { - if (value >= 1000) { - value = (value / 1000).toFixed(1) + 'k'; // 大于等于1000的数字显示为1k、2.5k等 - } + value = value + '万'; return value; }, color: 'rgba(255, 255, 255, 0.8)' @@ -662,7 +757,7 @@ export const getBarOptions = (data: any) => { } }, splitLine: { - show: true, + show: false, lineStyle: { color: 'rgba(108, 128, 151, 0.3)', type: 'dashed' @@ -670,24 +765,25 @@ export const getBarOptions = (data: any) => { } } ], - dataZoom: [ - { - // show: true, - start: 0, - end: 30, - bottom: 2, // 下滑块距离x轴底部的距离 - height: 23 - }, - { - type: 'inside' - } - ], + // dataZoom: [ + // { + // // show: true, + // start: 0, + // end: 30, + // bottom: 2, // 下滑块距离x轴底部的距离 + // height: 23 + // }, + // { + // type: 'inside' + // } + // ], series: [ { type: 'bar', - data: data.value, - stack: '合并', - barWidth: '15', + data: data.value[0], + // stack: '合并', + barWidth: '5', + barGap: '100%', itemStyle: { color: new echarts.graphic.LinearGradient( 0, @@ -697,22 +793,60 @@ export const getBarOptions = (data: any) => { [ { offset: 0, - color: 'rgba(0, 111, 255, 0)' // 0% 处的颜色 + color: ' rgba(29, 214, 255, 1)' // 0% 处的颜色 }, { offset: 0.7, - color: 'rgba(0, 111, 255, 0.5)' // 0% 处的颜色 + color: ' rgba(29, 214, 255, 0.5)' // 0% 处的颜色 }, { offset: 1, - color: 'rgba(0, 111, 255, 1)' // 100% 处的颜色 + color: ' rgba(29, 214, 255, 0.1)' // 100% 处的颜色 } ], false ) }, label: { - show: true, + show: false, + formatter: '{c}', + position: 'top', + color: '#fff', + fontSize: 10 + // padding: 5 + } + }, + { + type: 'bar', + data: data.value[1], + // stack: '合并', + barWidth: '5', + barGap: '100%', + itemStyle: { + color: new echarts.graphic.LinearGradient( + 0, + 0, + 0, + 1, + [ + { + offset: 0, + color: ' rgba(255, 77, 79, 1)' // 0% 处的颜色 + }, + { + offset: 0.7, + color: ' rgba(255, 77, 79, 0.5)' // 0% 处的颜色 + }, + { + offset: 1, + color: ' rgba(255, 77, 79, 0.1)' // 100% 处的颜色 + } + ], + false + ) + }, + label: { + show: false, formatter: '{c}', position: 'top', color: '#fff', @@ -720,16 +854,66 @@ export const getBarOptions = (data: any) => { // padding: 5 } } - // { - // type: 'bar', - // stack: '合并', - // data: topData, - // barWidth: '15', - // itemStyle: { - // color: 'rgba(252, 217, 18, 1)' - // } - // } ] }; return option; }; + +// 收支合同分析 +export const getBarOptions2 = (data: any) => { + const option = { + color:['#FF932A', '#678FE6', '#1DD6FF', '#00E396'], + title: { + text: '数量(个)', + subtext: '16', + bottom: 'center', + left: 'center', + textStyle: { + color: '#9DADB7', + fontSize: 16 + }, + subtextStyle:{ + color: '#707070', + fontSize: 32, + fontWeight: 'bold' + } + }, + tooltip: { + trigger: 'item' + }, + legend: { + top: '5%', + left: 'center' + }, + series: [ + { + name: 'Access From', + type: 'pie', + radius: ['50%', '60%'], + avoidLabelOverlap: false, + padAngle: 5, + label: { + show: false, + position: 'center' + }, + emphasis: { + label: { + show: false, + fontSize: 40, + fontWeight: 'bold' + } + }, + labelLine: { + show: false + }, + data: [ + { value: 3, name: '100万一下' }, + { value: 4, name: '100-500万' }, + { value: 5, name: '500-1000万' }, + { value: 4, name: '1000万以上' }, + ] + } + ] + }; + return option; +} \ No newline at end of file diff --git a/src/views/largeScreen/components/rightPage.vue b/src/views/largeScreen/components/rightPage.vue index 247c4ce..bcde746 100644 --- a/src/views/largeScreen/components/rightPage.vue +++ b/src/views/largeScreen/components/rightPage.vue @@ -1,13 +1,183 @@ - + diff --git a/src/views/tender/bidd/index.vue b/src/views/tender/bidd/index.vue new file mode 100644 index 0000000..e32016c --- /dev/null +++ b/src/views/tender/bidd/index.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/src/views/tender/plan/index.vue b/src/views/tender/plan/index.vue index dff6321..75c3732 100644 --- a/src/views/tender/plan/index.vue +++ b/src/views/tender/plan/index.vue @@ -1,379 +1,228 @@