安全危害因素(第一版)

This commit is contained in:
2026-04-01 09:49:34 +08:00
parent aca291797f
commit 3ec7008e0a
24 changed files with 4658 additions and 598 deletions
+229 -2
View File
@@ -995,11 +995,11 @@ namespace FineUIPro.Web
{
if (!html.Contains("f-checked"))
{
html = "×";
html = "";
}
else
{
html = "";
html = "";
}
}
sb.AppendFormat("<td style='vnd.ms-excel.numberformat:@;width:140px;'>{0}</td>", html);
@@ -1045,6 +1045,233 @@ namespace FineUIPro.Web
return sb.ToString();
}
/// <summary>
/// 多表头导出方法
/// </summary>
/// <param name="grid"></param>
/// <returns></returns>
public string GetGridMultiHeaderTableHtml(Grid grid)
{
StringBuilder sb = new StringBuilder();
sb.Append("<meta http-equiv=\"content-type\" content=\"application/excel; charset=UTF-8\"/>");
sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">");
//sb.Append("<tr>");
//foreach (GridColumn column in grid.Columns)
//{
// if (column.ColumnID != "ckbIsSelected" && column.ColumnID != "Punish" && column.ColumnID != "Del")
// {
// sb.AppendFormat("<td>{0}</td>", column.HeaderText);
// }
//}
//sb.Append("</tr>");
MultiHeaderTable mht = new MultiHeaderTable();
mht.ResolveMultiHeaderTable(grid.Columns);
foreach (List<object[]> rows in mht.MultiTable)
{
sb.Append("<tr>");
foreach (object[] cell in rows)
{
int rowspan = Convert.ToInt32(cell[0]);
int colspan = Convert.ToInt32(cell[1]);
GridColumn column = cell[2] as GridColumn;
if (column.Hidden == false)
{
sb.AppendFormat("<th{0}{1}{2}>{3}</th>",
rowspan != 1 ? " rowspan=\"" + rowspan + "\"" : "",
colspan != 1 ? " colspan=\"" + colspan + "\"" : "",
colspan != 1 ? " style=\"text-align:center;\"" : "",
column.HeaderText);
}
}
sb.Append("</tr>");
}
foreach (GridRow row in grid.Rows)
{
sb.Append("<tr>");
//if (row.Grid.gr.Hidden == false) {
foreach (GridColumn column in mht.Columns)
{
if (column.ColumnID != "ckbIsSelected" && column.ColumnID != "Punish" && column.ColumnID != "Del")
{
string html = row.Values[column.ColumnIndex].ToString();
if (column.ColumnID == "tfNumber")
{
html = (row.FindControl("lblNumber") as AspNet.Label).Text;
}
else if (column.ColumnID == "tfPageIndex")
{
html = (row.FindControl("lblPageIndex") as AspNet.Label).Text;
}
else if (column.ColumnID == "tfState")
{
html = (row.FindControl("lbState") as AspNet.Label).Text;
}
// 处理CheckBox
if (html.Contains("f-grid-static-checkbox"))
{
if (!html.Contains("f-checked"))
{
html = "✘";
}
else
{
html = "✔";
}
}
sb.AppendFormat("<td>{0}</td>", html);
}
}
//}
sb.Append("</tr>");
}
sb.Append("</table>");
return sb.ToString();
}
#endregion
#region
/// <summary>
/// 处理多表头的类
/// </summary>
public class MultiHeaderTable
{
// 包含 rowspancolspan 的多表头,方便生成 HTML 的 table 标签
public List<List<object[]>> MultiTable = new List<List<object[]>>();
// 最终渲染的列数组
public List<GridColumn> Columns = new List<GridColumn>();
public void ResolveMultiHeaderTable(GridColumnCollection columns)
{
List<object[]> row = new List<object[]>();
foreach (GridColumn column in columns)
{
object[] cell = new object[4];
cell[0] = 1; // rowspan
cell[1] = 1; // colspan
cell[2] = column;
cell[3] = null;
row.Add(cell);
}
ResolveMultiTable(row, 0);
ResolveColumns(row);
}
private void ResolveColumns(List<object[]> row)
{
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
List<object[]> subrow = new List<object[]>();
foreach (GridColumn column in groupField.Columns)
{
subrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
ResolveColumns(subrow);
}
else
{
Columns.Add(cell[2] as GridColumn);
}
}
}
private void ResolveMultiTable(List<object[]> row, int level)
{
List<object[]> nextrow = new List<object[]>();
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
// 如果当前列包含子列,则更改当前列的 colspan,以及增加父列(向上递归)的colspan
cell[1] = Convert.ToInt32(groupField.Columns.Count);
PlusColspan(level - 1, cell[3] as GridColumn, groupField.Columns.Count - 1);
foreach (GridColumn column in groupField.Columns)
{
nextrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
}
}
MultiTable.Add(row);
// 如果当前下一行,则增加上一行(向上递归)中没有子列的列的 rowspan
if (nextrow.Count > 0)
{
PlusRowspan(level);
ResolveMultiTable(nextrow, level + 1);
}
}
private void PlusRowspan(int level)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GroupField groupField = cells[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
// ...
}
else
{
cells[0] = Convert.ToInt32(cells[0]) + 1;
}
}
PlusRowspan(level - 1);
}
private void PlusColspan(int level, GridColumn parent, int plusCount)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GridColumn column = cells[2] as GridColumn;
if (column == parent)
{
cells[1] = Convert.ToInt32(cells[1]) + plusCount;
PlusColspan(level - 1, cells[3] as GridColumn, plusCount);
}
}
}
}
#endregion
#region
+194 -11
View File
@@ -8,10 +8,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../res/lib/flex.js"></script>
<link rel="stylesheet" href="../res/homecss/common.css?v=202512" />
<link rel="stylesheet" href="../res/homecss/layout.css?v=202512" />
<link rel="stylesheet" href="../res/homecss/index.css?v=20251208" />
<%--<link rel="stylesheet" href="../res/homecss/safe.css?v=202512" />--%>
<link rel="stylesheet" href="../res/homecss/common.css?v=202603" />
<link rel="stylesheet" href="../res/homecss/layout.css?v=202603" />
<link rel="stylesheet" href="../res/homecss/index.css?v=202604" />
<%--<link rel="stylesheet" href="../res/homecss/safe.css?v=202603" />--%>
</head>
<body style="background-color: #001B35;">
<div id="app">
@@ -170,7 +170,11 @@
</div>
</div>
</div>
<div id="map"></div>
<%--<div id="map"></div>--%>
<div class="map">
<div id="map"></div>
<div class="change-map" @click="handleChangeMap">{{mapType ? '中国地图' : '世界地图'}}</div>
</div>
</div>
<div class="side">
<div class="site_500" style="height: 2.7rem; margin-bottom: 0.25rem">
@@ -282,10 +286,11 @@
</body>
</html>
<script src="../res/lib/vue.min.js?v=20251"></script>
<script src="../res/lib/echarts.min.js?v=20251"></script>
<script src="../res/lib/china1.js?v=20251"></script>
<script src="../res/lib/jquery.js?v=20251"></script>
<script src="../res/lib/vue.min.js?v=202603"></script>
<script src="../res/lib/echarts.min.js?v=202603"></script>
<script src="../res/lib/china1.js?v=202603"></script>
<script src="../res/lib/jquery.js?v=202603"></script>
<script src="../res/lib/world.js?v=202603"></script>
<script>
new Vue({
el: '#app',
@@ -302,7 +307,9 @@
form: {},
// 当前时间显示
nowTime: '09:00:12',
chinaData: []
chinaData: [],
chainaMap: null,
mapType: true,
}
},
mounted() {
@@ -331,7 +338,8 @@
that.chinaData = [...response.d.data.chinaData]; // 更新地图数据
//console.log("地图数据",that.chinaData);
that.createChinaMap(that.chinaData); // 重新创建地图
console.log("form", that.form)
//console.log("form", that.form)
that.createWorldMap(that.chinaData); // 重新创建地图
} else {
// 更新数据失败
alert("加载数据失败:" + response.d.msg);
@@ -369,6 +377,14 @@
//onRefresh() {
// this.loadData(); // 重新加载数据
//},
handleChangeMap() {
this.mapType = !this.mapType
if (this.mapType) {
this.createWorldMap(this.chinaData)
} else {
this.createChinaMap(this.chinaData)
}
},
// 创建中国地图
createChinaMap(data) {
let list = data || [];
@@ -533,6 +549,173 @@
// 你可以在这里添加你的逻辑代码
});
},
createWorldMap(data) {
//let data = list || [
// { value: [116.407394, 39.904211], name: "北京" }, // 北京
// { value: [121.473668, 31.230389], name: "上海" }, // 上海
// { value: [113.264385, 23.129086], name: "广州" }, // 广州
// { value: [114.057868, 22.582846], name: "深圳" }, // 深圳
//]
if (!this.chainaMap) {
this.chainaMap = echarts.init(document.getElementById("map"))
}
// 中国地图 配置
echarts.registerMap("china", wordJson)
let chinaOption = {
geo: [
{
// 地理坐标系组件
map: "china",
roam: false, // 可以缩放和平移
aspectScale: 0.85, // 比例
top: 200,
zlevel: 2,
zoom: 1.2,
label: {
show: false,
},
regions: [
{
name: "南海诸岛",
itemStyle: {
// 隐藏地图
normal: {
opacity: 0, // 为 0 时不绘制该图形
},
},
label: {
show: false, // 隐藏文字
},
},
],
itemStyle: {
// 图形上的地图区域
normal: {
areaColor: "#07121B",
borderColor: "#07121B",
},
},
emphasis: {
disabled: true,
},
},
{
// 地理坐标系组件
map: "china",
roam: false, // 可以缩放和平移
aspectScale: 0.85, // 比例
top: 190,
zlevel: 9,
zoom: 1.2,
regions: [
{
name: "南海诸岛",
itemStyle: {
// 隐藏地图
normal: {
opacity: 0, // 为 0 时不绘制该图形
},
},
label: {
show: false, // 隐藏文字
},
},
],
itemStyle: {
// 图形上的地图区域
normal: {
areaColor: "#076393",
borderColor: "#076393",
},
},
emphasis: {
disabled: true,
},
},
],
tooltip: {
trigger: "item",
backgroundColor: "rgba(0,0,0,0.7)",
borderColor: "#fff",
borderWidth: 1,
padding: 10,
formatter: function (params) {
console.log("地图数据明细", params)
// 自定义 tooltip 内容
if (params.seriesType === 'effectScatter') {
return `<div style="color: white;">
<p><strong>${params.name}</strong></p>
<p>工程造价: ${params.data.projectMoney}万元</p>
<p>开工时间: ${params.data.startDate}</p>
<p>完工时间: ${params.data.endDate}</p>
<p>项目地址: ${params.data.address}</p>
</div>`;
}
},
},
series: [
{
// 地理坐标系组件
type: "map",
map: "china",
roam: false, // 可以缩放和平移
aspectScale: 0.85, // 比例
top: 180,
zlevel: 12,
zoom: 1.2,
data: data,
regions: [
{
name: "南海诸岛",
label: {
show: false, // 隐藏文字
},
},
],
itemStyle: {
// 图形上的地图区域
normal: {
borderWidth: 1,
areaColor: "rgba(0, 221, 255, .8)",
borderColor: "RGBA(27, 225, 255, 1)",
},
},
emphasis: {
disabled: true,
},
},
{
name: "散点",
type: "effectScatter",
coordinateSystem: "geo",
data: data,
zlevel: 14,
symbolSize: 10,
showEffectOn: "render",
rippleEffect: {
brushType: "stroke",
},
hoverAnimation: true,
label: {
formatter: "{b}",
position: "right",
show: false,
},
itemStyle: {
color: "#FBE795",
},
},
],
}
this.chainaMap.setOption(chinaOption)
this.chainaMap.on("click", function (params) {
//// 控制台打印点击的地区名称
//if (params.seriesType == "effectScatter") {
// alert("点击了" + params.name)
//}
//// 你可以在这里添加你的逻辑代码
})
},
}
})