From a484709bc36e7439697be2d92835c5c5377a48c2 Mon Sep 17 00:00:00 2001 From: BianLzhaoMin <11485688+bianliangzhaomin123@user.noreply.gitee.com> Date: Thu, 24 Jul 2025 23:20:45 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86=E7=AD=89?= =?UTF-8?q?=E7=BA=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/pages/newDataAnalysis/projectManagement.js | 534 ++++++++++++++---- js/pages/newDataAnalysis/projectProgress.js | 4 +- 2 files changed, 432 insertions(+), 106 deletions(-) diff --git a/js/pages/newDataAnalysis/projectManagement.js b/js/pages/newDataAnalysis/projectManagement.js index 2226454..582cf8a 100644 --- a/js/pages/newDataAnalysis/projectManagement.js +++ b/js/pages/newDataAnalysis/projectManagement.js @@ -184,6 +184,11 @@ let barData = []; let barData_1 = []; let barData_2 = []; +let lineData = []; +let lineData_1 = []; +let lineData_2 = []; +let bottomData = []; + // 将setCols函数提取到外部,使其可以被全局访问 function setCols(type) { if (type === 1) { @@ -214,16 +219,16 @@ function setCols(type) { title: "偏差天数", align: "center", }, - { - field: "planCost", - title: "成本预算", - align: "center", - }, - { - field: "actualCost", - title: "实际成本", - align: "center", - }, + // { + // field: "planCost", + // title: "成本预算", + // align: "center", + // }, + // { + // field: "actualCost", + // title: "实际成本", + // align: "center", + // }, // { // title: "风险等级", // align: "center", @@ -293,7 +298,7 @@ layui.use(["layer", "table", "form"], function () { table = layui.table; form = layui.form; - currentBidCode = parent.$("#bidPro").val(); + currentBidCode = parent.parent.$("#bidPro").val(); initTable(currentType, currentBidCode); $.ajaxSetup({ @@ -309,7 +314,7 @@ layui.use(["layer", "table", "form"], function () { function changeData(that, type) { currentType = type; - currentBidCode = parent.$("#bidPro").val(); + currentBidCode = parent.parent.$("#bidPro").val(); $(".ul-box li").each(function () { if ($(this).hasClass("check")) { @@ -682,97 +687,182 @@ function initLineChart() { // 初始化右侧饼图 function initPieChart() { - const rightChart = echarts.init(document.getElementById("right-chart")); + // const rightChart = echarts.init(document.getElementById("right-chart")); - // const barData = { - // projects: ["项目A", "项目B"], - // costs: [120000, 180000], + // // const barData = { + // // projects: ["项目A", "项目B"], + // // costs: [120000, 180000], + // // }; + + // const option = { + // title: { + // text: "项目成本对比", + // left: "center", + // textStyle: { + // color: "#fff", + // fontSize: 18, + // }, + // }, + // tooltip: { + // trigger: "axis", + // axisPointer: { + // type: "shadow", + // }, + // formatter: "项目: {b}
成本: {c} 元", + // }, + // grid: { + // left: "10%", + // right: "10%", + // bottom: "15%", + // top: "20%", + // containLabel: true, + // }, + // xAxis: { + // type: "category", + // data: barData, + // axisLabel: { + // color: "#fff", + // fontSize: 12, + // interval: 0, // 强制显示所有标签 + // rotate: barData.length > 5 ? 30 : 0, // 如果项目多就旋转标签 + // }, + // axisLine: { + // lineStyle: { + // color: "#fff", // x轴线颜色设为白色 + // }, + // }, + // }, + // yAxis: { + // type: "value", + // name: "成本金额(元)", + // nameTextStyle: { + // color: "#fff", // y轴名称颜色设为白色 + // }, + // axisLabel: { + // color: "#fff", // y轴文字颜色设为白色 + // fontSize: 12, + // }, + // axisLine: { + // lineStyle: { + // color: "#fff", // y轴线颜色设为白色 + // }, + // }, + // splitLine: { + // lineStyle: { + // color: "rgba(255, 255, 255, 0.2)", // 网格线颜色设为半透明白色 + // }, + // }, + // }, + // series: [ + // { + // name: "成本金额", + // type: "bar", + // barWidth: "40%", + // data: barData_1, + // itemStyle: { + // color: function (params) { + // // 自定义柱状颜色 + // const colorList = ["#409EFF", "#67C23A"]; + // return colorList[params.dataIndex]; + // }, + // borderRadius: [5, 5, 0, 0], // 柱子上部圆角 + // }, + // label: { + // show: true, + // position: "top", + // color: "#fff", // 柱顶文字颜色 + // formatter: "{c} 元", + // }, + // }, + // ], // }; + // rightChart.setOption(option); + + // // 响应式调整 + // window.addEventListener("resize", function () { + // rightChart.resize(); + // }); + const rightChart = echarts.init(document.getElementById("right-chart")); + // + const option = { + textStyle: { + color: "#fff", + }, title: { - text: "项目成本对比", - left: "center", + text: "项目成本趋势", textStyle: { - color: "#fff", - fontSize: 18, + // 标题文字样式 + color: "#fff", // 标题颜色 + fontSize: 18, // 可以同时设置其他样式 }, }, tooltip: { trigger: "axis", - axisPointer: { - type: "shadow", + }, + legend: { + show: true, + data: ["计划成本", "实际成本"], + textStyle: { + // 图例文字样式 + color: "#fff", // 图例文字颜色 + }, + itemStyle: { + color: "auto", }, - formatter: "项目: {b}
成本: {c} 元", }, grid: { - left: "10%", - right: "10%", - bottom: "15%", - top: "20%", + left: "3%", + right: "4%", + bottom: "3%", containLabel: true, }, xAxis: { type: "category", - data: barData, - axisLabel: { - color: "#fff", - fontSize: 12, - interval: 0, // 强制显示所有标签 - rotate: barData.length > 5 ? 30 : 0, // 如果项目多就旋转标签 - }, - axisLine: { - lineStyle: { - color: "#fff", // x轴线颜色设为白色 - }, - }, + boundaryGap: false, + data: lineData, }, yAxis: { type: "value", - name: "成本金额(元)", - nameTextStyle: { - color: "#fff", // y轴名称颜色设为白色 - }, - axisLabel: { - color: "#fff", // y轴文字颜色设为白色 - fontSize: 12, - }, - axisLine: { - lineStyle: { - color: "#fff", // y轴线颜色设为白色 - }, - }, - splitLine: { - lineStyle: { - color: "rgba(255, 255, 255, 0.2)", // 网格线颜色设为半透明白色 - }, - }, + name: "成本%", }, series: [ { - name: "成本金额", - type: "bar", - barWidth: "40%", - data: barData_1, + name: "计划成本", + type: "line", + data: lineData_1, + smooth: false, + lineStyle: { + color: "#5470C6", + width: 2, + }, itemStyle: { - color: function (params) { - // 自定义柱状颜色 - const colorList = ["#409EFF", "#67C23A"]; - return colorList[params.dataIndex]; - }, - borderRadius: [5, 5, 0, 0], // 柱子上部圆角 + color: "#5470C6", + borderWidth: 0, // 去除白色边框 }, - label: { - show: true, - position: "top", - color: "#fff", // 柱顶文字颜色 - formatter: "{c} 元", + symbolSize: 8, // 可以调整小圆点的大小 + }, + { + name: "实际成本", + type: "line", + data: lineData_2, + smooth: false, + lineStyle: { + color: "#FF0000", + width: 2, }, + itemStyle: { + color: "#FF0000", + borderWidth: 0, // 去除白色边框 + }, + symbolSize: 8, // 可以调整小圆点的大小 }, ], }; rightChart.setOption(option); + // bottomChart.setOption(option); // 响应式调整 window.addEventListener("resize", function () { @@ -796,9 +886,153 @@ function initBottomPieChart() { "#FF9DA7", ]; + // const option = { + // title: { + // text: "项目风险数量", // 修改标题以反映显示的是等级 + // left: "center", + // textStyle: { + // color: "#fff", + // fontSize: 18, + // fontWeight: "bold", + // }, + // }, + // tooltip: { + // trigger: "axis", + // axisPointer: { + // type: "shadow", + // }, + // // formatter: "项目: {b}
风险等级: {c}", + // }, + // grid: { + // left: "12%", + // right: "12%", + // bottom: "15%", + // top: "25%", + // containLabel: true, + // }, + // xAxis: { + // type: "category", + // data: barData, // ['项目A','项目B'] + // axisLabel: { + // color: "#fff", + // fontSize: 12, + // interval: 0, // 强制显示所有标签 + // rotate: barData.length > 5 ? 30 : 0, // 如果项目多就旋转标签 + // }, + // axisLine: { + // lineStyle: { + // color: "rgba(255, 255, 255, 0.8)", + // width: 2, + // }, + // }, + // axisTick: { + // alignWithLabel: true, + // lineStyle: { + // color: "rgba(255, 255, 255, 0.6)", + // }, + // }, + // }, + // yAxis: { + // type: "value", + // name: "风险数量", + // nameTextStyle: { + // color: "#fff", + // fontSize: 14, + // padding: [0, 0, 0, 40], // 调整名称位置 + // }, + + // axisLine: { + // show: true, + // lineStyle: { + // color: "rgba(255, 255, 255, 0.8)", + // width: 2, + // }, + // }, + // splitLine: { + // lineStyle: { + // color: "rgba(255, 255, 255, 0.15)", + // type: "dashed", + // }, + // }, + // }, + // series: [ + // { + // name: "风险等级", + // type: "bar", + // barWidth: "60%", // 加宽柱子 + // data: barData_2, // [3,6] + // itemStyle: { + // color: function (params) { + // // 根据风险等级设置颜色,等级越高颜色越深 + // const riskLevel = barData_2[params.dataIndex]; + // if (riskLevel <= 3) return "#5B8FF9"; // 低风险 + // if (riskLevel <= 6) return "#F6BD16"; // 中风险 + // return "#E86452"; // 高风险 + // }, + // borderRadius: [6, 6, 0, 0], + // shadowColor: "rgba(0, 0, 0, 0.3)", + // shadowBlur: 5, + // shadowOffsetY: 3, + // }, + // label: { + // show: true, + // position: "top", + // color: "#fff", + // fontWeight: "bold", + // formatter: function (params) { + // return params.value + "级"; // 显示为3级、6级等 + // }, + // }, + // // 添加渐变色效果 + // emphasis: { + // itemStyle: { + // shadowBlur: 10, + // shadowOffsetX: 0, + // shadowColor: "rgba(0, 0, 0, 0.5)", + // }, + // }, + // }, + // ], + // // 添加背景色 + // backgroundColor: "rgba(10, 20, 40, 0.7)", + // }; + + // bottomChart.setOption(option); + + // // 响应式调整 + // window.addEventListener("resize", function () { + // bottomChart.resize(); + // }); + + const groupedData = bottomData.reduce((acc, item) => { + if (!acc[item.month]) { + acc[item.month] = []; + } + acc[item.month].push({ + level: item.level, + count: parseInt(item.count), + }); + return acc; + }, {}); + + // 转换为需要的格式 + const months = Object.keys(groupedData); + const level2Data = []; + const level3Data = []; + const level4Data = []; + + months.forEach((month) => { + const monthData = groupedData[month]; + monthData.forEach((item) => { + if (item.level === "2") level2Data.push(item.count); + if (item.level === "3") level3Data.push(item.count); + if (item.level === "4") level4Data.push(item.count); + }); + }); + const option = { title: { - text: "项目风险等级分布", // 修改标题以反映显示的是等级 + text: "各月份风险等级数量统计", left: "center", textStyle: { color: "#fff", @@ -811,7 +1045,20 @@ function initBottomPieChart() { axisPointer: { type: "shadow", }, - formatter: "项目: {b}
风险等级: {c}", + formatter: function (params) { + let result = params[0].axisValue + "
"; + params.forEach((param) => { + result += `${param.seriesName}: ${param.value}个
`; + }); + return result; + }, + }, + legend: { + data: ["二级风险", "三级风险", "四级风险"], + textStyle: { + color: "#fff", + }, + top: "5%", }, grid: { left: "12%", @@ -822,12 +1069,12 @@ function initBottomPieChart() { }, xAxis: { type: "category", - data: barData, // ['项目A','项目B'] + data: months, // 月份数据 axisLabel: { color: "#fff", fontSize: 12, - interval: 0, // 强制显示所有标签 - rotate: barData.length > 5 ? 30 : 0, // 如果项目多就旋转标签 + interval: 0, + rotate: months.length > 5 ? 30 : 0, }, axisLine: { lineStyle: { @@ -844,21 +1091,11 @@ function initBottomPieChart() { }, yAxis: { type: "value", - name: "风险等级", + name: "风险数量", nameTextStyle: { color: "#fff", fontSize: 14, - padding: [0, 0, 0, 40], // 调整名称位置 - }, - min: 0, - max: 10, // 假设风险等级最高为10 - interval: 1, // 固定间隔为1 - axisLabel: { - color: "#fff", - fontSize: 12, - formatter: function (value) { - return value + "级"; // 显示为1级、2级等 - }, + padding: [0, 0, 0, 40], }, axisLine: { show: true, @@ -876,18 +1113,13 @@ function initBottomPieChart() { }, series: [ { - name: "风险等级", + name: "二级风险", type: "bar", - barWidth: "60%", // 加宽柱子 - data: barData_2, // [3,6] + barWidth: "20%", + barGap: "10%", + data: level2Data, itemStyle: { - color: function (params) { - // 根据风险等级设置颜色,等级越高颜色越深 - const riskLevel = barData_2[params.dataIndex]; - if (riskLevel <= 3) return "#5B8FF9"; // 低风险 - if (riskLevel <= 6) return "#F6BD16"; // 中风险 - return "#E86452"; // 高风险 - }, + color: "#5B8FF9", // 蓝色表示低风险 borderRadius: [6, 6, 0, 0], shadowColor: "rgba(0, 0, 0, 0.3)", shadowBlur: 5, @@ -898,11 +1130,59 @@ function initBottomPieChart() { position: "top", color: "#fff", fontWeight: "bold", - formatter: function (params) { - return params.value + "级"; // 显示为3级、6级等 + }, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: "rgba(0, 0, 0, 0.5)", }, }, - // 添加渐变色效果 + }, + { + name: "三级风险", + type: "bar", + barWidth: "20%", + data: level3Data, + itemStyle: { + color: "#F6BD16", // 黄色表示中风险 + borderRadius: [6, 6, 0, 0], + shadowColor: "rgba(0, 0, 0, 0.3)", + shadowBlur: 5, + shadowOffsetY: 3, + }, + label: { + show: true, + position: "top", + color: "#fff", + fontWeight: "bold", + }, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: "rgba(0, 0, 0, 0.5)", + }, + }, + }, + { + name: "四级风险", + type: "bar", + barWidth: "20%", + data: level4Data, + itemStyle: { + color: "#E86452", // 红色表示高风险 + borderRadius: [6, 6, 0, 0], + shadowColor: "rgba(0, 0, 0, 0.3)", + shadowBlur: 5, + shadowOffsetY: 3, + }, + label: { + show: true, + position: "top", + color: "#fff", + fontWeight: "bold", + }, emphasis: { itemStyle: { shadowBlur: 10, @@ -912,13 +1192,12 @@ function initBottomPieChart() { }, }, ], - // 添加背景色 backgroundColor: "rgba(10, 20, 40, 0.7)", }; bottomChart.setOption(option); - // 响应式调整 + // // 响应式调整 window.addEventListener("resize", function () { bottomChart.resize(); }); @@ -970,6 +1249,53 @@ function getChartData() { } }, }); + + const url3 = commonUrl + "screen/largeScreen/tb_project_new/list4cost"; + $.ajax({ + url: url3, + type: "get", + headers: { + authorization: sessionStorage.getItem("zhgd_token"), + }, + success: function (data) { + console.log(data, "右侧图表数据---"); + + if (data.rows && data.rows.length > 0) { + const result = data.rows; + + result.forEach((item) => { + lineData.push(item.month); + lineData_1.push(item.monthProgress || 0); + lineData_2.push(item.monthProgress2 || 0); + }); + } + }, + }); + + const url4 = commonUrl + "screen/largeScreen/tb_project_new/list4level"; + + $.ajax({ + url: url4, + type: "get", + headers: { + authorization: sessionStorage.getItem("zhgd_token"), + }, + success: function (data) { + console.log(data, "底部图表数据---"); + + bottomData = data.rows; + + // if (data.rows && data.rows.length > 0) { + // const result = data.rows; + + // result.forEach((item) => { + // lineData.push(item.month); + // lineData_1.push(item.monthProgress || 0); + // lineData_2.push(item.monthProgress2 || 0); + // }); + // } + }, + }); } getChartData(); diff --git a/js/pages/newDataAnalysis/projectProgress.js b/js/pages/newDataAnalysis/projectProgress.js index f1b4db5..6f9cbbb 100644 --- a/js/pages/newDataAnalysis/projectProgress.js +++ b/js/pages/newDataAnalysis/projectProgress.js @@ -57,7 +57,7 @@ layui.use(["layer", "table", "form"], function () { table = layui.table; form = layui.form; - currentBidCode = parent.$("#bidPro").val(); + currentBidCode = parent.parent.$("#bidPro").val(); initTable(currentType, currentBidCode); $.ajaxSetup({ @@ -73,7 +73,7 @@ layui.use(["layer", "table", "form"], function () { function changeData(that, type) { currentType = type; - currentBidCode = parent.$("#bidPro").val(); + currentBidCode = parent.parent.$("#bidPro").val(); $(".ul-box li").each(function () { if ($(this).hasClass("check")) {