462 lines
15 KiB
JavaScript
462 lines
15 KiB
JavaScript
let table, layer, form;
|
||
let currentType = 1;
|
||
let currentBidCode = "";
|
||
let xData = [];
|
||
let yData_1 = [];
|
||
let yData_2 = [];
|
||
let pieData = [];
|
||
let pieData_1 = [];
|
||
|
||
// 将setCols函数提取到外部,使其可以被全局访问
|
||
function setCols(type) {
|
||
if (type === 1) {
|
||
return [
|
||
{ type: "numbers", title: "序号", width: "10%" },
|
||
{ field: "projectName", title: "项目名称", align: "center" },
|
||
{ field: "taskName", title: "作业任务名称", align: "center" },
|
||
{ field: "taskCode", title: "任务编号", align: "center" },
|
||
{ field: "planStartTime", title: "计划开始时间", align: "center" },
|
||
{ field: "planEndTime", title: "计划完成时间", align: "center" },
|
||
{
|
||
field: "actualStartTime",
|
||
title: "实际开始时间",
|
||
align: "center",
|
||
},
|
||
{ field: "actualEndTime", title: "实际完成时间", align: "center" },
|
||
{ field: "processDiff", title: "进度偏差", align: "center" },
|
||
// { field: "completeEffort", title: "已完成工程量", align: "center" },
|
||
// { field: "totalEffort", title: "总工程量", align: "center" },
|
||
{
|
||
title: "延误因素分析",
|
||
align: "center",
|
||
templet: (d, index) => {
|
||
let text = "";
|
||
text +=
|
||
'<a id="viewBtn" style="color: #007bff;cursor: pointer;font-size: 16px">查看</a>';
|
||
return text;
|
||
},
|
||
},
|
||
{
|
||
field: "resourceMatchStatus",
|
||
title: "资源匹配状态",
|
||
align: "center",
|
||
},
|
||
{
|
||
field: "keyPathFlag",
|
||
title: "关键路径任务标识",
|
||
align: "center",
|
||
},
|
||
];
|
||
}
|
||
// 可以添加其他type的情况
|
||
return []; // 默认返回空数组
|
||
}
|
||
|
||
layui.use(["layer", "table", "form"], function () {
|
||
layer = layui.layer;
|
||
table = layui.table;
|
||
form = layui.form;
|
||
|
||
currentBidCode = parent.parent.$("#bidPro").val();
|
||
initTable(currentType, currentBidCode);
|
||
|
||
$.ajaxSetup({
|
||
beforeSend: function (xhr, options) {
|
||
var originalSuccess = options.success;
|
||
options.success = function (data, textStatus, jqXhr) {
|
||
data = modifyResponseData(data);
|
||
originalSuccess.apply(this, arguments);
|
||
};
|
||
},
|
||
});
|
||
});
|
||
|
||
function changeData(that, type) {
|
||
currentType = type;
|
||
currentBidCode = parent.parent.$("#bidPro").val();
|
||
|
||
$(".ul-box li").each(function () {
|
||
if ($(this).hasClass("check")) {
|
||
$(this).removeClass("check").addClass("nocheck");
|
||
}
|
||
});
|
||
|
||
$(that).removeClass("nocheck").addClass("check");
|
||
|
||
if ($("#demo2").is(":visible")) {
|
||
initTable(type, currentBidCode);
|
||
}
|
||
|
||
$("#right-table-box").removeAttr("style");
|
||
$("#no-data-box").css({ display: "none" });
|
||
$("#right-box").css({ display: "none" });
|
||
}
|
||
|
||
let data1 = [
|
||
"由于大气影响,导致施工进度延误",
|
||
"由于设备判断延迟,导致施工进度延误",
|
||
"由于人员不足,导致施工进度延误",
|
||
"由于设计变更,导致施工进度延误",
|
||
"由于其他原因,导致施工进度延误",
|
||
];
|
||
// 自动生成一些结果描述
|
||
let data2 = [
|
||
"此次结果较上次有所恶化,由于大气影响(如暴雨、雾霾),现场停工3天,需调整后续工期计划。",
|
||
"此次结果与上次持平,由于设备判断延迟(如检测仪器故障),延误2天,但通过加班追回部分进度。",
|
||
"此次结果较上次有所改善,尽管人员不足(原计划10人,实际到岗7人),但通过优化分工仅延误1天。",
|
||
"此次结果出现新问题,由于设计变更(业主临时要求修改图纸),导致关键路径延期5天,需紧急协调资源。",
|
||
"此次结果较上次无显著变化,其他原因(如临时停电)导致延误1天,属于可控范围内。",
|
||
];
|
||
|
||
function initTable(type, bidCode) {
|
||
if ($("#demo2").next(".layui-table-view").length > 0) {
|
||
$("#demo2").next(".layui-table-view").remove();
|
||
}
|
||
|
||
const url = commonUrl + "screen/largeScreen/tb_project_progress_new/list";
|
||
table.render({
|
||
elem: "#demo2",
|
||
url: url,
|
||
skin: "line",
|
||
page: true,
|
||
height: "full-100",
|
||
headers: {
|
||
decrypt: "decrypt",
|
||
Authorization: token,
|
||
},
|
||
where: {
|
||
bidCode: bidCode,
|
||
type: type,
|
||
},
|
||
response: {
|
||
statusName: "code",
|
||
statusCode: 200,
|
||
countName: "count",
|
||
dataName: "rows",
|
||
},
|
||
cols: [setCols(type)], // 现在可以正确访问setCols函数
|
||
done: function (res, curr, count) {
|
||
if (res.code !== 200 || !res.rows || res.rows.length === 0) {
|
||
layer.msg("暂无数据", { icon: 2 });
|
||
}
|
||
|
||
// 查看按钮点击
|
||
$(".layui-table-body table.layui-table tbody tr #viewBtn").on(
|
||
"click",
|
||
function () {
|
||
const index = $(this).closest("tr").data("index");
|
||
console.log(index, "index");
|
||
var rowData = res.rows[index]; // 获取对应行的数据
|
||
|
||
// 弹框配置
|
||
layer.open({
|
||
type: 1,
|
||
title: "分析查看",
|
||
content:
|
||
"<div id='oneEcharts' style='width:100%;height:100%;display: flex;flex-direction: column;justify-content: space-around;'>" +
|
||
"<div style='font-size: 16px; padding: 20px;'>延误原因:" +
|
||
rowData.delayActor +
|
||
"</div>" +
|
||
"<div style='font-size: 16px; padding: 20px;'>延误对策:" +
|
||
rowData.delayPolicy +
|
||
"</div>" +
|
||
"<div style='font-size: 16px; padding: 20px;'>分析结果:" +
|
||
rowData.analyzeResult +
|
||
"</div>" +
|
||
"</div>",
|
||
area: ["600px", "300px"],
|
||
shade: 0.3, // 遮罩透明度
|
||
skin: "custom-layer-style", // 自定义皮肤
|
||
success: function (layero, index) {
|
||
// 修改弹框背景颜色
|
||
$(layero).css(
|
||
"background",
|
||
"rgba(13, 34, 37, 0.9)"
|
||
); // 半透明黑色背景
|
||
$(layero).find(".layui-layer-title").css({
|
||
fontSize: "18px",
|
||
color: "#fff", // 标题文字颜色
|
||
background: "transparent", // 标题背景透明
|
||
"border-bottom":
|
||
"1px solid rgba(255, 255, 255, 0.2)", // 标题底部边框
|
||
});
|
||
$(layero).find(".layui-layer-content").css({
|
||
background: "transparent", // 内容区域透明
|
||
});
|
||
|
||
$(layero)
|
||
.find(".layui-layer-setwin .layui-layer-close")
|
||
.css({
|
||
color: "#fff", // 文字颜色
|
||
"border-color": "#fff", // 边框颜色(如果按钮有边框)
|
||
});
|
||
},
|
||
});
|
||
}
|
||
);
|
||
},
|
||
error: function () {
|
||
layer.msg("数据加载失败", { icon: 2 });
|
||
},
|
||
});
|
||
}
|
||
|
||
$(".chart-box").hide();
|
||
|
||
$(".list-view").click(function () {
|
||
if ($(this).hasClass("active")) return;
|
||
|
||
$(".list-view").addClass("active");
|
||
$(".chart-view").removeClass("active");
|
||
|
||
$(".chart-box").hide();
|
||
$("#demo2").show();
|
||
initTable(currentType, currentBidCode);
|
||
});
|
||
|
||
$(".chart-view").click(function () {
|
||
if ($(this).hasClass("active")) return;
|
||
|
||
$(".list-view").removeClass("active");
|
||
$(".chart-view").addClass("active");
|
||
|
||
$("#demo2").hide();
|
||
$("#demo2").next(".layui-table-view").remove();
|
||
$(".chart-box").show();
|
||
|
||
initLineChart();
|
||
initPieChart();
|
||
});
|
||
|
||
// 初始化左侧双折线图
|
||
function initLineChart() {
|
||
const leftChart = echarts.init(document.getElementById("left-chart"));
|
||
|
||
const option = {
|
||
textStyle: {
|
||
color: "#fff",
|
||
},
|
||
title: {
|
||
text: "进度偏差统计",
|
||
textStyle: {
|
||
// 标题文字样式
|
||
color: "#fff", // 标题颜色
|
||
fontSize: 18, // 可以同时设置其他样式
|
||
},
|
||
},
|
||
tooltip: {
|
||
trigger: "axis",
|
||
},
|
||
legend: {
|
||
show: true,
|
||
data: ["计划进度", "实际进度"],
|
||
textStyle: {
|
||
// 图例文字样式
|
||
color: "#fff", // 图例文字颜色
|
||
},
|
||
itemStyle: {
|
||
color: "auto",
|
||
},
|
||
},
|
||
grid: {
|
||
left: "3%",
|
||
right: "4%",
|
||
bottom: "3%",
|
||
containLabel: true,
|
||
},
|
||
xAxis: {
|
||
type: "category",
|
||
boundaryGap: false,
|
||
data: xData,
|
||
},
|
||
yAxis: {
|
||
type: "value",
|
||
},
|
||
series: [
|
||
{
|
||
name: "计划进度",
|
||
type: "line",
|
||
data: yData_1,
|
||
smooth: false,
|
||
lineStyle: {
|
||
color: "#5470C6",
|
||
width: 2,
|
||
},
|
||
itemStyle: {
|
||
color: "#5470C6",
|
||
borderWidth: 0, // 去除白色边框
|
||
},
|
||
symbolSize: 8, // 可以调整小圆点的大小
|
||
},
|
||
{
|
||
name: "实际进度",
|
||
type: "line",
|
||
data: yData_2,
|
||
smooth: false,
|
||
lineStyle: {
|
||
color: "#FF0000", // 红色
|
||
width: 2,
|
||
},
|
||
itemStyle: {
|
||
color: "#FF0000",
|
||
borderWidth: 0, // 去除白色边框
|
||
},
|
||
symbolSize: 10, // 可以调整小圆点的大小
|
||
},
|
||
],
|
||
};
|
||
|
||
leftChart.setOption(option);
|
||
|
||
// 响应式调整
|
||
window.addEventListener("resize", function () {
|
||
leftChart.resize();
|
||
});
|
||
}
|
||
|
||
// 初始化右侧饼图
|
||
function initPieChart() {
|
||
const rightChart = echarts.init(document.getElementById("right-chart"));
|
||
|
||
const option = {
|
||
title: {
|
||
text: "延误因素分布",
|
||
left: "center",
|
||
textStyle: {
|
||
color: "#fff",
|
||
fontSize: 18,
|
||
},
|
||
},
|
||
tooltip: {
|
||
trigger: "item",
|
||
formatter: "{a} {b}: {c} ",
|
||
},
|
||
legend: {
|
||
orient: "vertical", // 垂直排列
|
||
right: 60, // 距离右侧 20px
|
||
top: "center", // 垂直居中
|
||
textStyle: {
|
||
color: "#fff", // 图例文字颜色设为白色
|
||
borderWidth: 0,
|
||
borderColor: "transparent",
|
||
},
|
||
itemStyle: {
|
||
borderWidth: 0, // 关键点:去除 legend 图例项(小色块)的边框
|
||
},
|
||
data: ["大气影响", "设备判断延迟", "人员不足", "设计变更", "其他"],
|
||
},
|
||
series: [
|
||
{
|
||
name: "",
|
||
type: "pie",
|
||
radius: ["30%", "50%"], // 内半径 30%,外半径 60%,形成空心效果
|
||
center: ["30%", "50%"], // 确保饼图居中
|
||
avoidLabelOverlap: false,
|
||
label: {
|
||
show: false, // 隐藏连接线末端的标签
|
||
},
|
||
labelLine: {
|
||
show: false, // 隐藏连接线
|
||
},
|
||
itemStyle: {
|
||
borderRadius: 5, // 每块扇形圆角效果
|
||
borderColor: "#333", // 边框颜色(用于间隙)
|
||
borderWidth: 2, // 边框宽度(1px 每边,形成 2px 间隙)
|
||
},
|
||
data: [
|
||
{
|
||
value: pieData_1[0],
|
||
name: "大气影响",
|
||
itemStyle: { color: "#67C23A" },
|
||
},
|
||
{
|
||
value: pieData_1[1],
|
||
name: "设备判断延迟",
|
||
itemStyle: { color: "#409EFF" },
|
||
},
|
||
{
|
||
value: pieData_1[2],
|
||
name: "人员不足",
|
||
itemStyle: { color: "#E6A23C" },
|
||
},
|
||
{
|
||
value: pieData_1[3],
|
||
name: "设计变更",
|
||
itemStyle: { color: "#909399" },
|
||
},
|
||
{
|
||
value: pieData_1[4],
|
||
name: "其他",
|
||
itemStyle: { color: "#F56C6C" },
|
||
},
|
||
],
|
||
emphasis: {
|
||
itemStyle: {
|
||
shadowBlur: 10,
|
||
shadowOffsetX: 0,
|
||
shadowColor: "rgba(0, 0, 0, 0.5)",
|
||
},
|
||
},
|
||
},
|
||
],
|
||
};
|
||
|
||
rightChart.setOption(option);
|
||
|
||
// 响应式调整
|
||
window.addEventListener("resize", function () {
|
||
rightChart.resize();
|
||
});
|
||
}
|
||
|
||
// 获取图表数据
|
||
function getChartData() {
|
||
const url =
|
||
commonUrl + "screen/largeScreen/tb_project_progress_new/list4chart";
|
||
$.ajax({
|
||
url: url,
|
||
type: "get",
|
||
headers: {
|
||
authorization: sessionStorage.getItem("zhgd_token"),
|
||
},
|
||
success: function (data) {
|
||
console.log(data, "图表数据1===折线图");
|
||
|
||
if (data.rows && data.rows.length > 0) {
|
||
// initPieChart(data.rows);
|
||
|
||
const result = data.rows;
|
||
|
||
result.forEach((item) => {
|
||
xData.push(item.month);
|
||
yData_1.push(item.monthValue || 0);
|
||
yData_2.push(item.monthValue2 || 0);
|
||
});
|
||
}
|
||
},
|
||
});
|
||
const url2 =
|
||
commonUrl + "screen/largeScreen//tb_project_progress_new/list4bing";
|
||
$.ajax({
|
||
url: url2,
|
||
type: "get",
|
||
headers: {
|
||
authorization: sessionStorage.getItem("zhgd_token"),
|
||
},
|
||
success: function (data) {
|
||
console.log(data, "图表数据2===饼图");
|
||
|
||
if (data.rows && data.rows.length > 0) {
|
||
const result = data.rows;
|
||
|
||
result.forEach((item) => {
|
||
pieData.push(item.category);
|
||
pieData_1.push(item.monthValue || 0);
|
||
});
|
||
}
|
||
},
|
||
});
|
||
}
|
||
|
||
getChartData();
|