劳务人员看板
This commit is contained in:
parent
c375bff46b
commit
6c67afae72
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
|
||||
INSERT INTO [dbo].[Sys_Menu] ([MenuId], [MenuName], [Icon], [Url], [SortIndex], [SuperMenu], [MenuType], [IsOffice], [IsEnd], [IsUsed]) VALUES (N'2FA61DF2-F2A2-4215-980E-005711E622AA', N'人员动态看板', NULL, N'HSSE/KqShowScreen/JZYScreen.aspx', 120, N'0', N'Menu_Person_P', '0', '1', '1');
|
||||
INSERT INTO [dbo].[Sys_Menu] ([MenuId], [MenuName], [Icon], [Url], [SortIndex], [SuperMenu], [MenuType], [IsOffice], [IsEnd], [IsUsed]) VALUES (N'CDB921B6-D9B3-4D6A-AF77-E4262ED20153', N'人员动态展示', NULL, N'HSSE/KqShowScreen/KqShowScreen.aspx', 115, N'0', N'Menu_Person_P', '0', '1', '1');
|
||||
|
|
@ -216,17 +216,31 @@ namespace BLL
|
|||
string baseurl = "/api/Resources/getSafeLawListByType";
|
||||
Dictionary<string, string> dic = new Dictionary<string, string>()
|
||||
{
|
||||
{"type",type},
|
||||
{"pageIndex","0"}
|
||||
|
||||
{ "type", type },
|
||||
{ "pageIndex", "0" }
|
||||
};
|
||||
var returnData = GerDataFromCncec(baseurl, dic, 3000);
|
||||
if (returnData != null && returnData.code == 1)
|
||||
if (returnData != null && returnData.code == 1 && returnData.data != null)
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
var data = jt["getDataList"].ToString();
|
||||
result = JsonConvert.DeserializeObject<List<Model.SafeLawItem>>(data);
|
||||
|
||||
try
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
if (jt != null && jt["getDataList"] != null)
|
||||
{
|
||||
var data = jt["getDataList"].ToString();
|
||||
if (!string.IsNullOrEmpty(data))
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Model.SafeLawItem>>(data) ??
|
||||
new List<SafeLawItem>();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// 记录异常日志,避免程序崩溃
|
||||
APICommonService.SaveSysHttpLog("Error_GetSafeLawList", baseurl, ex.Message);
|
||||
result = new List<SafeLawItem>();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -244,12 +258,25 @@ namespace BLL
|
|||
|
||||
};
|
||||
var returnData = GerDataFromCncec(baseurl, dic, 4000);
|
||||
if (returnData != null && returnData.code == 1)
|
||||
if (returnData != null && returnData.code == 1 && returnData.data != null)
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
var data = jt["getDataList"].ToString();
|
||||
result = JsonConvert.DeserializeObject<List<Model.NoticeOutput>>(data);
|
||||
|
||||
try
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
if (jt != null && jt["getDataList"] != null)
|
||||
{
|
||||
var data = jt["getDataList"].ToString();
|
||||
if (!string.IsNullOrEmpty(data))
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Model.NoticeOutput>>(data) ?? new List<NoticeOutput>();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APICommonService.SaveSysHttpLog("Error_GetNoticeList", baseurl, ex.Message);
|
||||
result = new List<NoticeOutput>();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -275,12 +302,25 @@ namespace BLL
|
|||
|
||||
};
|
||||
var returnData = GerDataFromCncec(baseurl, dic, 3000);
|
||||
if (returnData != null && returnData.code == 1)
|
||||
if (returnData != null && returnData.code == 1 && returnData.data != null)
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
var data = jt["getDataList"].ToString();
|
||||
result = JsonConvert.DeserializeObject<List<Model.NoticeOutput>>(data);
|
||||
|
||||
try
|
||||
{
|
||||
JObject jt = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(returnData.data.ToString());
|
||||
if (jt != null && jt["getDataList"] != null)
|
||||
{
|
||||
var data = jt["getDataList"].ToString();
|
||||
if (!string.IsNullOrEmpty(data))
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Model.NoticeOutput>>(data) ?? new List<NoticeOutput>();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APICommonService.SaveSysHttpLog("Error_GetNewsList", baseurl, ex.Message);
|
||||
result = new List<NoticeOutput>();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,874 @@
|
|||
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="kq.aspx.cs" Inherits="FineUIPro.Web.DataShow.kq" %>
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
<head runat="server">
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<title></title>
|
||||
</head>
|
||||
<link rel="stylesheet" href="../res/css/kq.css?t=129873"/>
|
||||
<script src="../res/lib/flex.js"></script>
|
||||
<body>
|
||||
<div id="app">
|
||||
<header>
|
||||
<div class="nav-box" style="padding-left: 0.3rem">
|
||||
<div class="logo-img"></div>
|
||||
<div class="navs" style="justify-content: flex-end">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="logo-tit">QHSE系统实名制管理看板</div>
|
||||
<div class="nav-box" style="padding-right: 0.3rem">
|
||||
<div class="navs" style="justify-content: flex-start">
|
||||
|
||||
</div>
|
||||
<div class="timer">
|
||||
<p>
|
||||
<span>{{timer.city}}</span><span>{{timer.time}}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span>{{timer.date}}</span><span>{{timer.week}}</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="set">
|
||||
<div class="iconfont icon-nav08" @click="onToggleFullscreen">全屏</div>
|
||||
</div>
|
||||
</header>
|
||||
<div id="content">
|
||||
<div>
|
||||
<div id="tools" class="block" style="height: 100%">
|
||||
<div class="block-tit">
|
||||
<span>劳务人员工种结构 TOP10</span>
|
||||
</div>
|
||||
<div class="block-main flex-between">
|
||||
<div class="top-row" v-for="(i,idx) in lw" ::key="idx">
|
||||
<div class="top-row-num color-blue">{{idx|formatNumber}}</div>
|
||||
<div class="top-row-r">
|
||||
<div class="top-row-r-t">
|
||||
<span class="color-blue">
|
||||
{{i.name}}
|
||||
</span
|
||||
><span class="color-05937B">{{i.value}}个</span>
|
||||
</div>
|
||||
<div class="top-row-r-b">
|
||||
<div
|
||||
class="top-row-r-b-inner"
|
||||
:style="{width: formatPercent(i.value)}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="tools" class="block" style="height: calc(100% - 0.25rem)">
|
||||
<div class="block-tit">
|
||||
<span>劳务人员</span>
|
||||
</div>
|
||||
<div class="block-main ry">
|
||||
<div class="th">
|
||||
<span>序号</span><span>头像</span>
|
||||
<span>
|
||||
姓名
|
||||
</span
|
||||
><span>工种</span><span>时间</span>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="tr" v-for="(item, index) in lwInOutData" :key="index">
|
||||
<div>{{index + 1}}</div>
|
||||
<div class="photo">
|
||||
<img :src="getPhotoUrl(item.PhotoUrl)" :alt="item.PersonName"/>
|
||||
</div>
|
||||
<div>{{item.PersonName}}</div>
|
||||
<div>{{item.WorkPostName}}</div>
|
||||
<div>{{item.ChangeTime}}</div>
|
||||
<div :class="item.IsIn === 'out' ? 'out' : 'in'">{{item.IsIn === 'out' ? '出' : '入'}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="grid-template-rows: 65% 35%; position: relative;">
|
||||
<div class="kq-box">
|
||||
<div class="kx-item">
|
||||
<div class="kx-item-tit">总在册</div>
|
||||
<div class="kx-item-num" style="color: #00FFFF;">{{form.person.allNum}}</div>
|
||||
</div>
|
||||
<div class="kx-item">
|
||||
<div class="kx-item-tit">当前在册</div>
|
||||
<div class="kx-item-num" style="color: #51C6FF;">{{form.person.onDutyNum}}</div>
|
||||
</div>
|
||||
<div class="kx-item">
|
||||
<div class="kx-item-tit">今日出勤</div>
|
||||
<div class="kx-item-num" style="color: #12CDA2;">{{form.person.todayAttendanceNum}}</div>
|
||||
</div>
|
||||
<div class="kx-item">
|
||||
<div class="kx-item-tit">今日出勤率</div>
|
||||
<div class="kx-item-num" style="color: #FFB82B;">{{form.person.todayAttendanceRate}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chainmap"></div>
|
||||
|
||||
<div class="block4">
|
||||
<div class="block4-tit">
|
||||
<span>出勤动态曲线</span>
|
||||
</div>
|
||||
<div class="block4-main" id="ry"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div id="tools" class="block" style="height: 100%">
|
||||
<div class="block-tit">
|
||||
<span>考勤统计</span>
|
||||
</div>
|
||||
<div class="block-main kq">
|
||||
<div class="th">
|
||||
<span>序号</span><span>组织名称</span>
|
||||
<span>
|
||||
总在册
|
||||
</span
|
||||
><span>当前在册</span><span>今日出勤</span>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div class="tr" v-for="(item, index) in attendanceStats" :key="index">
|
||||
<span>{{index + 1}}</span>
|
||||
<span>{{item.projectName}}</span>
|
||||
<span>{{item.allNum}}</span>
|
||||
<span class="zc">{{item.onDutyNum}}</span>
|
||||
<span>{{item.todayAttendanceNum}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="tools" class="block" style="height: calc(100% - 0.25rem)">
|
||||
<div class="block-tit">
|
||||
<span> 劳务人员年龄性别结构</span>
|
||||
</div>
|
||||
<div class="block-main">
|
||||
<div id="nlzb"></div>
|
||||
<div class="bl">
|
||||
<div id="man"></div>
|
||||
<div class="bl-txt">
|
||||
<span>性别</span>
|
||||
<span>占比统计</span>
|
||||
</div>
|
||||
<div id="woman"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<script src="../res/lib/china1.js"></script>
|
||||
<script src="../res/lib/echarts.min.js"></script>
|
||||
<script src="../res/lib/vue.min.js"></script>
|
||||
<script src="../res/lib/jquery.js"></script>
|
||||
<script>
|
||||
new Vue({
|
||||
el: "#app",
|
||||
data: {
|
||||
timer: {
|
||||
date: "",
|
||||
time: "",
|
||||
city: "",
|
||||
T: "15-26℃",
|
||||
week: "",
|
||||
},
|
||||
chainaMap: null,
|
||||
lw: [],
|
||||
form:{
|
||||
person:{
|
||||
allNum: 0,//总在册
|
||||
onDutyNum: 0,//总在场
|
||||
todayAttendanceNum: 0,//今日出勤
|
||||
todayAttendanceRate: 0,//今日出勤率
|
||||
}
|
||||
},
|
||||
attendanceStats: [],
|
||||
ageData: [],
|
||||
genderData: [],
|
||||
chinaMapData: [],
|
||||
lwInOutData: [],
|
||||
attendanceCurveData: {
|
||||
managerData: [],
|
||||
workerData: []
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
formatNumber(value) {
|
||||
return (value + 1).toFixed().padStart(2, "0")
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.$nextTick(() => {
|
||||
this.startAutoScroll(".ry>.body", 6)
|
||||
this.startAutoScroll(".kq>.body", 3)
|
||||
this.initNlzb()
|
||||
this.initMan("man")
|
||||
this.initMan("woman", "女", 40)
|
||||
// this.initChainaMap()
|
||||
this.initRy([],[])
|
||||
this.loadData()
|
||||
})
|
||||
setInterval(() => {
|
||||
this.getLocation()
|
||||
}, 1000)
|
||||
},
|
||||
methods: {
|
||||
onToggleFullscreen() {
|
||||
if (!document.fullscreenElement) {
|
||||
document.documentElement.requestFullscreen().catch(() => {})
|
||||
} else if (document.exitFullscreen) {
|
||||
document.exitFullscreen()
|
||||
}
|
||||
},
|
||||
getLocation() {
|
||||
let date = new Date()
|
||||
this.timer.time = `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`
|
||||
this.timer.date = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")}`
|
||||
this.timer.city = "北京市"
|
||||
this.timer.week = "星期" + "日一二三四五六".charAt(date.getDay())
|
||||
},
|
||||
getPhotoUrl(photoUrl) {
|
||||
if (!photoUrl || photoUrl.trim() === '') {
|
||||
return ''; // 默认无头像
|
||||
}
|
||||
return 'https://qhse.cncecci.com/SUBQHSE/' + photoUrl;
|
||||
},
|
||||
// 从后台加载数据
|
||||
loadData() {
|
||||
const that = this;
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "kq.aspx/GetData", //调用后台WebMethod
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
success: function (response) {
|
||||
console.log("请求结果:", response.d)
|
||||
if (response.d.success) {
|
||||
// 更新数据成功
|
||||
that.form = { ...response.d.data }; // 更新表单数据
|
||||
that.lw = response.d.data.workTypeStats || [];
|
||||
that.attendanceStats = response.d.data.attendanceStats || [];
|
||||
that.ageData = response.d.data.ageStats || [];
|
||||
that.genderData = response.d.data.genderStats || [];
|
||||
that.lwInOutData = response.d.data.lwInOutList || [];
|
||||
that.chinaMapData = response.d.data.chinaMapData; // 更新地图数据
|
||||
if (response.d.data.attendanceCurve) {
|
||||
that.attendanceCurveData.managerData = response.d.data.attendanceCurve.managerData || [];
|
||||
that.attendanceCurveData.workerData = response.d.data.attendanceCurve.workerData || [];
|
||||
}
|
||||
|
||||
that.$nextTick(() => {
|
||||
that.initNlzb(that.ageData);
|
||||
that.initGenderCharts(that.genderData);
|
||||
that.initChainaMap(that.chinaMapData); // 重新创建地图
|
||||
that.initRy(
|
||||
that.attendanceCurveData.managerData,
|
||||
that.attendanceCurveData.workerData
|
||||
)
|
||||
});
|
||||
} else {
|
||||
// 更新数据失败
|
||||
alert("加载数据失败:" + response.d.msg);
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
// AJAX请求错误处理
|
||||
alert("请求失败:" + error);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
initRy(data1, data2) {
|
||||
let xLabel = []
|
||||
for (let i = 0; i < 24; i++) {
|
||||
xLabel.push(i + ":00");
|
||||
}
|
||||
var chartDom = document.getElementById("ry")
|
||||
var myChart = echarts.init(chartDom)
|
||||
var option
|
||||
|
||||
option = {
|
||||
legend: {
|
||||
textStyle:{
|
||||
color: "#94DAFF"
|
||||
}
|
||||
},
|
||||
tooltip:{
|
||||
trigger: "axis",
|
||||
axisPointer: {
|
||||
type: "cross",
|
||||
label: {
|
||||
backgroundColor: "#6a7985",
|
||||
},
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
left: "2%",
|
||||
right: "2%",
|
||||
bottom: "10%",
|
||||
containLabel: true,
|
||||
},
|
||||
dataZoom: [
|
||||
{
|
||||
type: "slider",
|
||||
xAxisIndex: 0,
|
||||
bottom: 4,
|
||||
height: 10,
|
||||
borderColor: "transparent",
|
||||
backgroundColor: "rgba(255,255,255,0.08)",
|
||||
fillerColor: "rgba(70,180,255,0.25)",
|
||||
dataBackground: {
|
||||
lineStyle: { color: "rgba(70,180,255,0.3)" },
|
||||
areaStyle: { color: "rgba(70,180,255,0.1)" },
|
||||
},
|
||||
handleStyle: {
|
||||
color: "#46B4FF",
|
||||
borderColor: "#fff",
|
||||
borderWidth: 1,
|
||||
},
|
||||
moveHandleSize: 8,
|
||||
moveHandleColor: "rgba(70,180,255,0.5)",
|
||||
textStyle: { color: "#9FBCEE" },
|
||||
showDetail: false,
|
||||
startValue: 0,
|
||||
endValue: 9,
|
||||
},
|
||||
],
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: xLabel,
|
||||
axisLabel: {
|
||||
interval: 0,
|
||||
textStyle: {
|
||||
color: "#9FBCEE",
|
||||
},
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: "#9FBCEE",
|
||||
},
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
name: "数量",
|
||||
type: "value",
|
||||
nameTextStyle: {
|
||||
color: "#9FBCEE",
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: "#9FBCEE",
|
||||
},
|
||||
},
|
||||
axisLabel: {
|
||||
textStyle: {
|
||||
color: "#9FBCEE",
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "管理人员",
|
||||
data:data1,
|
||||
type: "line",
|
||||
smooth: true,
|
||||
showSymbol: false,
|
||||
lineStyle: { color: "#FFC72C" },
|
||||
areaStyle: {
|
||||
color: {
|
||||
type: "linear",
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{ offset: 0, color: "#FFC72C" },
|
||||
{ offset: 1, color: "rgba(70,180,255,0.02)" },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "劳务人员",
|
||||
data:data2,
|
||||
type: "line",
|
||||
smooth: true,
|
||||
showSymbol: false,
|
||||
lineStyle: { color: "#50E5FF" },
|
||||
areaStyle: {
|
||||
color: {
|
||||
type: "linear",
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{ offset: 0, color: "#50E5FF" },
|
||||
{ offset: 1, color: "rgba(255,180,70,0.02)" },
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
option && myChart.setOption(option)
|
||||
},
|
||||
|
||||
initChainaMap(list) {
|
||||
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("chainmap"))
|
||||
}
|
||||
// 中国地图 配置
|
||||
echarts.registerMap("china", chinaJson)
|
||||
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) {
|
||||
// 自定义 tooltip 内容
|
||||
if (params.seriesType === "effectScatter") {
|
||||
return `<div style="color: white;">
|
||||
<p><strong>${params.name}</strong></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)
|
||||
var projectId = params.data && params.data.id ? params.data.id : '';
|
||||
var jumpUrl = "../HSSE/KqShowScreen/KqShowScreen.aspx?projectId=" + encodeURIComponent(projectId);
|
||||
window.open(jumpUrl)
|
||||
}
|
||||
// 你可以在这里添加你的逻辑代码
|
||||
})
|
||||
},
|
||||
|
||||
initGenderCharts(genderData) {
|
||||
if (!genderData || genderData.length === 0) {
|
||||
this.initMan("man", "男", 50);
|
||||
this.initMan("woman", "女", 50);
|
||||
return;
|
||||
}
|
||||
var total = genderData.reduce((sum, item) => sum + item.value, 0);
|
||||
if (total === 0) {
|
||||
this.initMan("man", "男", 50);
|
||||
this.initMan("woman", "女", 50);
|
||||
return;
|
||||
}
|
||||
var maleData = genderData.find(item => item.name === "男");
|
||||
var femaleData = genderData.find(item => item.name === "女");
|
||||
var maleCount = maleData ? maleData.value : 0;
|
||||
var femaleCount = femaleData ? femaleData.value : 0;
|
||||
var malePercent = Math.round((maleCount / total) * 100);
|
||||
var femalePercent = Math.round((femaleCount / total) * 100);
|
||||
this.initMan("man", "男", malePercent);
|
||||
this.initMan("woman", "女", femalePercent);
|
||||
},
|
||||
|
||||
initMan(ele, tit = "男", val = 20) {
|
||||
var chartDom = document.getElementById(ele)
|
||||
var myChart = echarts.init(chartDom)
|
||||
|
||||
var option = {
|
||||
series: [
|
||||
{
|
||||
type: "gauge",
|
||||
startAngle: 220,
|
||||
endAngle: -40,
|
||||
min: 0,
|
||||
max: 100,
|
||||
center: ["50%", "50%"],
|
||||
radius: "70%",
|
||||
pointer: {
|
||||
show: false,
|
||||
},
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
width: 10,
|
||||
color: [
|
||||
[
|
||||
val / 100,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#00B4DB" },
|
||||
{ offset: 1, color: "#9D5CFF" },
|
||||
]),
|
||||
],
|
||||
[1, "#516C82"],
|
||||
],
|
||||
},
|
||||
},
|
||||
axisTick: { show: false },
|
||||
splitLine: { show: false },
|
||||
axisLabel: { show: false },
|
||||
title: { show: false },
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
offsetCenter: [0, 0],
|
||||
formatter: "{value}%",
|
||||
fontSize: 16,
|
||||
fontWeight: "bold",
|
||||
color: "#fff",
|
||||
},
|
||||
data: [{ value: val, name: tit }],
|
||||
},
|
||||
{
|
||||
type: "gauge",
|
||||
startAngle: 220,
|
||||
endAngle: -40,
|
||||
min: 0,
|
||||
max: 100,
|
||||
radius: "55%",
|
||||
pointer: { show: false },
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: { width: 10, color: [[1, "#20415D"]] },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
splitLine: { show: false },
|
||||
axisLabel: { show: false },
|
||||
title: {
|
||||
show: true,
|
||||
offsetCenter: [0, "50%"],
|
||||
fontSize: 14,
|
||||
color: "#fff",
|
||||
formatter: tit,
|
||||
},
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
offsetCenter: [0, "50%"],
|
||||
formatter: tit,
|
||||
fontSize: 14,
|
||||
fontWeight: "bold",
|
||||
color: "#fff",
|
||||
},
|
||||
data: [{ value: 100 }],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
myChart.setOption(option)
|
||||
},
|
||||
|
||||
initNlzb(data1) {
|
||||
let data = data1 || [
|
||||
{ value: 1048, name: "46-55" },
|
||||
{ value: 735, name: "36-45" },
|
||||
{ value: 580, name: "26-35" },
|
||||
{ value: 484, name: "16-25" },
|
||||
]
|
||||
|
||||
var chartDom = document.getElementById("nlzb")
|
||||
var myChart = echarts.init(chartDom)
|
||||
var option
|
||||
|
||||
option = {
|
||||
title: {
|
||||
text: "年龄占比统计",
|
||||
top: "0px",
|
||||
right: "20%",
|
||||
textStyle: {
|
||||
color: "#8CEEFF",
|
||||
fontSize: 14,
|
||||
},
|
||||
},
|
||||
legend: {
|
||||
orient: "vertical",
|
||||
top: "25px",
|
||||
right: "20%",
|
||||
// top: "middle",
|
||||
icon: "circle",
|
||||
itemWidth: 10,
|
||||
itemHeight: 10,
|
||||
textStyle: {
|
||||
color: "#fff",
|
||||
fontSize: 10,
|
||||
},
|
||||
formatter: function (name) {
|
||||
var dataItem = option.series[0].data.find(function (item) {
|
||||
return item.name === name
|
||||
})
|
||||
var total = option.series[0].data.reduce(function (acc, cur) {
|
||||
return acc + cur.value
|
||||
}, 0)
|
||||
var percent = ((dataItem.value / total) * 100).toFixed(2)
|
||||
return name + " " + percent + "%"
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "1",
|
||||
type: "pie",
|
||||
center: ["30%", "50%"],
|
||||
radius: ["40%", "70%"],
|
||||
avoidLabelOverlap: false,
|
||||
gapAngle: 3,
|
||||
itemStyle: {
|
||||
borderColor: "#001B35",
|
||||
borderWidth: 3,
|
||||
},
|
||||
color: [
|
||||
"rgba(0, 180, 219, 0.8)",
|
||||
"rgba(152, 221, 136, 0.8)",
|
||||
"rgba(247, 232, 74, 0.8)",
|
||||
"rgba(244, 122, 122, 0.8)",
|
||||
],
|
||||
label: {
|
||||
show: false,
|
||||
position: "center",
|
||||
formatter: function (params) {
|
||||
var total = option.series[0].data.reduce(function (acc, cur) {
|
||||
return acc + cur.value
|
||||
}, 0)
|
||||
var percent = ((params.value / total) * 100).toFixed(1)
|
||||
return "{a|" + percent + "%}\n{b|" + params.name + "}"
|
||||
},
|
||||
rich: {
|
||||
a: {
|
||||
fontSize: 14,
|
||||
color: "#1FC6FF",
|
||||
fontWeight: "bold",
|
||||
},
|
||||
b: {
|
||||
fontSize: 12,
|
||||
color: "#fff",
|
||||
},
|
||||
},
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false,
|
||||
},
|
||||
data,
|
||||
},
|
||||
{
|
||||
name: "2",
|
||||
type: "pie",
|
||||
center: ["30%", "50%"],
|
||||
radius: ["75%", "90%"],
|
||||
avoidLabelOverlap: false,
|
||||
gapAngle: 3,
|
||||
itemStyle: {
|
||||
borderColor: "#001B35",
|
||||
borderWidth: 3,
|
||||
},
|
||||
color: ["#00B4DB", "#98DD88", "#F7E84A", "#F47A7A"],
|
||||
label: {
|
||||
show: false,
|
||||
position: "center",
|
||||
formatter: function (params) {
|
||||
var total = option.series[0].data.reduce(function (acc, cur) {
|
||||
return acc + cur.value
|
||||
}, 0)
|
||||
var percent = ((params.value / total) * 100).toFixed(1)
|
||||
return "{a|" + percent + "%}\n{b|" + params.name + "}"
|
||||
},
|
||||
rich: {
|
||||
a: {
|
||||
fontSize: 14,
|
||||
color: "#1FC6FF",
|
||||
fontWeight: "bold",
|
||||
},
|
||||
b: {
|
||||
fontSize: 12,
|
||||
color: "#fff",
|
||||
},
|
||||
},
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false,
|
||||
},
|
||||
data,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
option && myChart.setOption(option)
|
||||
},
|
||||
|
||||
startAutoScroll(el, speed = 5) {
|
||||
const container = document.querySelector(el)
|
||||
if (!container) return
|
||||
let scrollOffset = 0
|
||||
const speed1 = speed / 100
|
||||
|
||||
const scroll = () => {
|
||||
scrollOffset += speed1
|
||||
container.scrollTop = scrollOffset
|
||||
|
||||
if (scrollOffset >= container.scrollHeight - container.clientHeight) {
|
||||
scrollOffset = 0
|
||||
}
|
||||
|
||||
requestAnimationFrame(scroll)
|
||||
}
|
||||
|
||||
requestAnimationFrame(scroll)
|
||||
},
|
||||
formatPercent(value) {
|
||||
let sum = this.lw.reduce((acc, cur) => acc + cur.value, 0)
|
||||
return ((value / sum) * 100).toFixed(2) + "%"
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,268 @@
|
|||
using BLL;
|
||||
using Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Services;
|
||||
using System.Linq;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace FineUIPro.Web.DataShow
|
||||
{
|
||||
public partial class kq : PageBase
|
||||
{
|
||||
public static string userId;
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (!IsPostBack)
|
||||
{
|
||||
userId = this.CurrUser.UserId;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据身份证号计算年龄
|
||||
/// </summary>
|
||||
private static int? CalculateAgeFromIdCard(string idCard)
|
||||
{
|
||||
if (string.IsNullOrEmpty(idCard) || idCard.Length < 17)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
string birthDateStr = idCard.Substring(6, 8);
|
||||
DateTime birthDate = DateTime.ParseExact(birthDateStr, "yyyyMMdd", null);
|
||||
|
||||
int age = DateTime.Now.Year - birthDate.Year;
|
||||
if (DateTime.Now.Month < birthDate.Month ||
|
||||
(DateTime.Now.Month == birthDate.Month && DateTime.Now.Day < birthDate.Day))
|
||||
{
|
||||
age--;
|
||||
}
|
||||
|
||||
return age > 0 ? age : (int?)null;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 看板数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[WebMethod]
|
||||
public static object GetData()
|
||||
{
|
||||
try
|
||||
{
|
||||
var db = Funs.DB;
|
||||
var projectList = (from project in db.Base_Project
|
||||
where (project.ProjectAttribute == "GONGCHENG" || project.ProjectAttribute == null)
|
||||
&& (project.IsDelete == null || project.IsDelete == false) && project.ProjectState == "1"
|
||||
select new
|
||||
{
|
||||
project.UnitId,
|
||||
project.ProjectId,
|
||||
ProjectName = string.IsNullOrEmpty(project.ShortName) ? project.ProjectName : project.ShortName,
|
||||
project.ProjectAddress,
|
||||
project.MapCoordinates,
|
||||
}).ToList();
|
||||
|
||||
int unitType = CommonService.GetUnitTypeByUserId(userId);
|
||||
if (unitType == 1)
|
||||
{
|
||||
projectList = projectList.Where(x => x.UnitId == userId).ToList();
|
||||
}
|
||||
|
||||
var chinaMapData = projectList
|
||||
.Where(x => !string.IsNullOrEmpty(x.MapCoordinates))
|
||||
.Select(x =>
|
||||
{
|
||||
var coords = x.MapCoordinates.Split(',');
|
||||
return new
|
||||
{
|
||||
id = x.ProjectId,
|
||||
name = x.ProjectName,
|
||||
address = x.ProjectAddress,
|
||||
value = coords.Length >= 2
|
||||
? new[] { Convert.ToDouble(coords[0]), Convert.ToDouble(coords[1]) }
|
||||
: new double[] { 0, 0 }
|
||||
};
|
||||
}).ToList();
|
||||
|
||||
|
||||
// 获取在建项目id列表
|
||||
List<string> beUnderConstructionList = projectList.Select(p => p.ProjectId).ToList();
|
||||
//获取所有人员列表
|
||||
var persons = db.View_SitePerson_Person.Where(x => beUnderConstructionList.Contains(x.ProjectId)).ToList();
|
||||
|
||||
var onDutyNum = persons.Where(x => x.IsUsedType == "1").Count();
|
||||
|
||||
//获取今天所有出入场记录
|
||||
DateTime todayStart = DateTime.Now.Date;
|
||||
DateTime todayEnd = todayStart.AddDays(1).AddSeconds(-1);
|
||||
var outOuts = db.SitePerson_PersonInOut.Where(x =>
|
||||
x.ChangeTime.HasValue && x.ChangeTime.Value.Date >= todayStart &&
|
||||
x.ChangeTime.Value.Date <= todayEnd && beUnderConstructionList.Contains(x.ProjectId)).ToList();
|
||||
|
||||
var inNum = outOuts.Where(x => x.IsIn == true)
|
||||
.GroupBy(x => x.PersonId)
|
||||
.Select(grp => grp.First())
|
||||
.Count(); //入场数量
|
||||
|
||||
var inRate = "0.00%";
|
||||
if (onDutyNum > 0)
|
||||
{
|
||||
inRate = (inNum * 100.0 / onDutyNum).ToString("F2") + "%";
|
||||
}
|
||||
|
||||
var attendanceStats = (from p in persons
|
||||
join proj in projectList on p.ProjectId equals proj.ProjectId
|
||||
group p by new { p.ProjectId, proj.ProjectName } into g
|
||||
let todayInCount = outOuts.Where(x => x.ProjectId == g.Key.ProjectId && x.IsIn == true)
|
||||
.GroupBy(x => x.PersonId)
|
||||
.Select(grp => grp.First())
|
||||
.Count()
|
||||
orderby g.Count() descending
|
||||
select new
|
||||
{
|
||||
projectId = g.Key.ProjectId,
|
||||
projectName = g.Key.ProjectName,
|
||||
allNum = g.Count(),
|
||||
onDutyNum = g.Count(x => x.IsUsedType == "1"),
|
||||
todayAttendanceNum = todayInCount
|
||||
}).ToList();
|
||||
|
||||
var workTypeStats = (from p in persons
|
||||
where !string.IsNullOrEmpty(p.WorkPostId)
|
||||
group p by new {p.WorkPostId,p.WorkPostName} into g
|
||||
orderby g.Count() descending
|
||||
select new
|
||||
{
|
||||
id = g.Key.WorkPostId,
|
||||
name = g.Key.WorkPostName,
|
||||
value = g.Count()
|
||||
}).Take(10).ToList();
|
||||
|
||||
var personWithAge = persons
|
||||
.Where(x => !string.IsNullOrEmpty(x.IdentityCard))
|
||||
.Select(x => new
|
||||
{
|
||||
Person = x,
|
||||
Age = CalculateAgeFromIdCard(x.IdentityCard)
|
||||
}).Where(x => x.Age.HasValue).ToList();
|
||||
|
||||
var ageStats = personWithAge
|
||||
.Where(x => x.Age.Value >= 16 && x.Age.Value <= 55)
|
||||
.GroupBy(x =>
|
||||
{
|
||||
int age = x.Age.Value;
|
||||
if (age >= 16 && age <= 25) return "16-25";
|
||||
if (age >= 26 && age <= 35) return "26-35";
|
||||
if (age >= 36 && age <= 45) return "36-45";
|
||||
return "46-55";
|
||||
})
|
||||
.Select(g => new { name = g.Key, value = g.Count() })
|
||||
.OrderByDescending(x => x.value)
|
||||
.ToList();
|
||||
|
||||
var genderStats = persons.Where(x => !string.IsNullOrEmpty(x.Sex))
|
||||
.GroupBy(x => x.Sex)
|
||||
.Select(g => new {
|
||||
name = g.Key == "1" ? "男" : (g.Key == "2" ? "女" : g.Key),
|
||||
value = g.Count()
|
||||
})
|
||||
.ToList();
|
||||
|
||||
var lwInOutList = (from o in outOuts
|
||||
join p in db.View_SitePerson_Person on o.PersonId equals p.PersonId into personGroup
|
||||
from p in personGroup.DefaultIfEmpty()
|
||||
where p != null
|
||||
orderby o.ChangeTime descending
|
||||
select new
|
||||
{
|
||||
PhotoUrl = p.PhotoUrl,
|
||||
PersonName = o.PersonName ?? string.Empty,
|
||||
WorkPostName = o.WorkPostName ?? string.Empty,
|
||||
ChangeTime = o.ChangeTime.HasValue ? o.ChangeTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : string.Empty,
|
||||
IsIn = o.IsIn.HasValue && o.IsIn.Value ? "in" : "out"
|
||||
}).Take(200).ToList();
|
||||
|
||||
//先获取管理人员的数据
|
||||
var projectUserList = (from a in db.Project_ProjectUser
|
||||
join b in db.Sys_User on a.UserId equals b.UserId into userJoin
|
||||
from b in userJoin.DefaultIfEmpty()
|
||||
where beUnderConstructionList.Contains(a.ProjectId)
|
||||
select new
|
||||
{
|
||||
ProjectId = a.ProjectId,
|
||||
IdentityCard = b.IdentityCard,
|
||||
}).ToList();
|
||||
//获取管理人员身份证
|
||||
var managerIdentityCards = projectUserList.Where(x => x.IdentityCard != null)
|
||||
.Select(x => x.IdentityCard).ToList();
|
||||
|
||||
var managerData = new List<int>();
|
||||
var workerData = new List<int>();
|
||||
|
||||
for (int hour = 0; hour < 24; hour++)
|
||||
{
|
||||
DateTime hourStart = todayStart.AddHours(hour);
|
||||
DateTime hourEnd = hourStart.AddHours(1).AddSeconds(-1);
|
||||
|
||||
var hourRecords = outOuts.Where(x => x.ChangeTime.HasValue &&
|
||||
x.ChangeTime.Value >= hourStart &&
|
||||
x.ChangeTime.Value <= hourEnd).ToList();
|
||||
|
||||
int managerCount = 0;
|
||||
int workerCount = 0;
|
||||
if (hourRecords.Count > 0)
|
||||
{
|
||||
managerCount = hourRecords.Count(x => managerIdentityCards.Contains(x.IdentityCard));
|
||||
workerCount = hourRecords.Count - managerCount;
|
||||
}
|
||||
managerData.Add(managerCount);
|
||||
workerData.Add(workerCount);
|
||||
}
|
||||
|
||||
|
||||
var returnData = new
|
||||
{
|
||||
success = true,
|
||||
data = new
|
||||
{
|
||||
person = new
|
||||
{
|
||||
allNum = persons.Count, //总在册数
|
||||
onDutyNum = onDutyNum, //总在场数
|
||||
todayAttendanceNum = inNum, //今日出勤数
|
||||
todayAttendanceRate = inRate, //今日出勤率
|
||||
},
|
||||
attendanceCurve = new
|
||||
{
|
||||
managerData = managerData,
|
||||
workerData = workerData
|
||||
},
|
||||
attendanceStats = attendanceStats,
|
||||
workTypeStats = workTypeStats,
|
||||
ageStats = ageStats,
|
||||
genderStats = genderStats,
|
||||
lwInOutList = lwInOutList,
|
||||
chinaMapData = chinaMapData,
|
||||
}
|
||||
};
|
||||
|
||||
return returnData;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new { success = false, msg = ex.Message };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <自动生成>
|
||||
// 此代码由工具生成。
|
||||
//
|
||||
// 对此文件的更改可能导致不正确的行为,如果
|
||||
// 重新生成代码,则所做更改将丢失。
|
||||
// </自动生成>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace FineUIPro.Web.DataShow
|
||||
{
|
||||
|
||||
|
||||
public partial class kq
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -694,6 +694,7 @@
|
|||
<Content Include="Customization\ZJ\HSSE\HiddenInspection\UnitHiddenRectificationView.aspx" />
|
||||
<Content Include="DataShow\Environmental.aspx" />
|
||||
<Content Include="DataShow\HazardDetection.aspx" />
|
||||
<Content Include="DataShow\kq.aspx" />
|
||||
<Content Include="DataShow\OccupationalDiseaseAccident.aspx" />
|
||||
<Content Include="DataShow\PhysicalExamination.aspx" />
|
||||
<Content Include="DataShow\ProjectDivision.aspx" />
|
||||
|
|
@ -1147,6 +1148,8 @@
|
|||
<Content Include="HSSE\Hazard\ShowWBS.aspx" />
|
||||
<Content Include="HSSE\HiddenInspection\CheckStatisticsAnalysis.aspx" />
|
||||
<Content Include="HSSE\HiddenInspection\CheckStatisticsAnalysisProject.aspx" />
|
||||
<Content Include="HSSE\KqShowScreen\JZYScreen.aspx" />
|
||||
<Content Include="HSSE\KqShowScreen\KqShowScreen.aspx" />
|
||||
<Content Include="HSSE\Meeting\MeetingManage.aspx" />
|
||||
<Content Include="HSSE\QualityAudit\SubcontractLeasingProtocolEdit.aspx" />
|
||||
<Content Include="HSSE\QualityAudit\SubcontractLeasingProtocol.aspx" />
|
||||
|
|
@ -1166,6 +1169,7 @@
|
|||
<Content Include="QualityAudit\SubcontractLeasingProtocolAttachUrl\2024-11\638666869899670730_微信图片_20241106163356.png" />
|
||||
<Content Include="res\css\commontower.css" />
|
||||
<Content Include="res\css\indextower.css" />
|
||||
<Content Include="res\css\kq.css" />
|
||||
<Content Include="res\font\iconfont.css" />
|
||||
<Content Include="res\font\iconfont.js" />
|
||||
<Content Include="res\homecss\common.css" />
|
||||
|
|
@ -1260,6 +1264,7 @@
|
|||
<Content Include="res\images\02\n03.png" />
|
||||
<Content Include="res\images\02\n04.png" />
|
||||
<Content Include="res\images\bj.jpg" />
|
||||
<Content Include="res\images\rgs.png" />
|
||||
<Content Include="res\images\logo.png" />
|
||||
<Content Include="res\images\my_face_80.png" />
|
||||
<Content Include="res\images\nav01.png" />
|
||||
|
|
@ -9516,6 +9521,13 @@
|
|||
<Compile Include="DataShow\HazardDetection.aspx.designer.cs">
|
||||
<DependentUpon>HazardDetection.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DataShow\kq.aspx.cs">
|
||||
<DependentUpon>kq.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DataShow\kq.aspx.designer.cs">
|
||||
<DependentUpon>kq.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DataShow\OccupationalDiseaseAccident.aspx.cs">
|
||||
<DependentUpon>OccupationalDiseaseAccident.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
|
|
@ -12531,6 +12543,14 @@
|
|||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="HSSE\HiddenInspection\CheckStatisticsAnalysisProject.aspx.designer.cs" />
|
||||
<Compile Include="HSSE\KqShowScreen\JZYScreen.aspx.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="HSSE\KqShowScreen\JZYScreen.aspx.designer.cs" />
|
||||
<Compile Include="HSSE\KqShowScreen\KqShowScreen.aspx.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="HSSE\KqShowScreen\KqShowScreen.aspx.designer.cs" />
|
||||
<Compile Include="HSSE\Meeting\MeetingManage.aspx.cs">
|
||||
<DependentUpon>MeetingManage.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,335 @@
|
|||
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JZYScreen.aspx.cs" Inherits="FineUIPro.Web.HSSE.KqShowScreen.JZYScreen" %>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head runat="server">
|
||||
<meta charset="UTF-8">
|
||||
<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/css/jzyscreen.css">
|
||||
</head>
|
||||
<style>
|
||||
.header{
|
||||
position: relative;
|
||||
}
|
||||
.b-wrap{
|
||||
position: absolute;
|
||||
top:6px;
|
||||
right:6px;
|
||||
font-size: 12px;
|
||||
padding:2px 6px;
|
||||
border: 1px solid #ffffff;
|
||||
text-align: center;
|
||||
color:#fff;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<div class="wrap">
|
||||
<div class="header">
|
||||
<h1><%=ProjectName%></h1>
|
||||
<div style="position: absolute;top: 0.5rem;right: 0.2rem;color: #ffffff;" id="divTime"></div>
|
||||
<div class="b-wrap"><asp:Literal runat="server" Text="全屏"/></div>
|
||||
</div>
|
||||
<div class="conterner">
|
||||
<div class="row">
|
||||
<%-- <div class="row-1">
|
||||
|
||||
<div class="label">距离12·31中交目标还剩余(天)</div>
|
||||
<div class="number" id ="divDayRel">0</div>
|
||||
|
||||
|
||||
</div>--%>
|
||||
<div class="row-1" style="margin-top: .25rem;">
|
||||
<div class="label"><asp:Literal runat="server" Text="累计安全人工时"/></div>
|
||||
<div class="number" id ="divSafeTotal">0</div>
|
||||
</div>
|
||||
<div class="row-1" style="margin-top: .25rem;">
|
||||
<div class="label"><asp:Literal runat="server" Text="一周安全人工时"/></div>
|
||||
<div class="number"id ="divSafeWeek">0</div>
|
||||
</div>
|
||||
|
||||
<div id="rs">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="c-row">
|
||||
<div class="table">
|
||||
<div class="table-head">
|
||||
<div class="th" style="width: 20%;">
|
||||
<span><asp:Literal runat="server" Text="施工单位名称"/></span>
|
||||
</div>
|
||||
<div class="th" style="width: 20%;">
|
||||
<span><asp:Literal runat="server" Text="当日总数/系统总数"/></span>
|
||||
</div>
|
||||
<div class="th" style="width: 60%;">
|
||||
<div class="th-1"><asp:Literal runat="server" Text="特种作业人员"/></div>
|
||||
<div class="th-2">
|
||||
<span style="width: 50%;"><asp:Literal runat="server" Text="特岗名称"/></span>
|
||||
<span style="width: 25%;"><asp:Literal runat="server" Text="系统登记人数"/></span>
|
||||
<span style="width: 25%;"><asp:Literal runat="server" Text="当前在场人数"/></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-body">
|
||||
<div class="scroll-box">
|
||||
<div class="t" id="divScroller">
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
<script src="../../res/lib/echarts.min.js"></script>
|
||||
<script src="../../res/lib/jquery.js"></script>
|
||||
<script>
|
||||
var projectid = '<%=ProjectId%>'
|
||||
var timer = null;
|
||||
|
||||
function isScroll() {
|
||||
let mainEle = document.querySelector('.table-body')
|
||||
let serollEle = document.querySelector('.scroll-box')
|
||||
if (serollEle.children[0].children.length < 6) {
|
||||
return
|
||||
}
|
||||
serollEle.appendChild(serollEle.children[0].cloneNode(true))
|
||||
|
||||
function Marquee() {
|
||||
if (mainEle.offsetHeight + mainEle.scrollTop < serollEle.offsetHeight) {
|
||||
mainEle.scrollTop++
|
||||
console.log(mainEle.offsetHeight, serollEle.offsetHeight)
|
||||
} else {
|
||||
serollEle.appendChild(serollEle.children[0].cloneNode(true))
|
||||
serollEle.removeChild(serollEle.children[0])
|
||||
}
|
||||
}
|
||||
|
||||
timer = setInterval(Marquee, 90)
|
||||
mainEle.onmouseover = function () { clearInterval(timer) }
|
||||
mainEle.onmouseout = function () { timer = setInterval(Marquee, 90) }
|
||||
}
|
||||
|
||||
|
||||
var temp=[]
|
||||
function createSM(value1) {
|
||||
var chartDom = document.getElementById('rs');
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
let leftLabel = ['施工人员 ', '<%=remark2 %>', '<%=remark3 %>', '<%=remark4 %>', '<%=remark5 %>', '<%=remark6 %>']
|
||||
option = {
|
||||
grid: {
|
||||
top: 4,
|
||||
left: 4,
|
||||
right: 4,
|
||||
bottom: 4,
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
type: 'value',
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
show: false,
|
||||
}
|
||||
},
|
||||
yAxis: [
|
||||
{
|
||||
type: 'category',
|
||||
position: 'left',
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
color: "#ffffff",
|
||||
fontWeight: "bolder",
|
||||
fontSize: 24,
|
||||
textShadowColor: '#000000', // 设置阴影颜色
|
||||
textShadowBlur: 1, // 设置阴影模糊度
|
||||
textShadowOffsetX: 1, // 设置阴影水平偏移
|
||||
textShadowOffsetY: 1 // 设置阴影垂直偏移
|
||||
},
|
||||
data: leftLabel,
|
||||
|
||||
}, {
|
||||
type: '',
|
||||
position: 'right',
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
fontFamily: "DIN",
|
||||
color: "#CCCCCC",
|
||||
fontWeight: "bolder",
|
||||
fontSize: 30,
|
||||
textShadowColor: '#000000', // 设置阴影颜色
|
||||
textShadowBlur: 1, // 设置阴影模糊度
|
||||
textShadowOffsetX: 1, // 设置阴影水平偏移
|
||||
textShadowOffsetY: 1 // 设置阴影垂直偏移
|
||||
},
|
||||
data: value1,
|
||||
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '人数',
|
||||
type: 'bar',
|
||||
// stack: 'total',
|
||||
barWidth: 30,
|
||||
label: {
|
||||
show: false,
|
||||
fontSize: 30,
|
||||
fontFamily: "DIN",
|
||||
align: "left",
|
||||
|
||||
},
|
||||
itemStyle: {
|
||||
color: "#1e7bc9"
|
||||
},
|
||||
emphasis: {
|
||||
focus: 'series'
|
||||
},
|
||||
data: value1
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
if (temp.length != value1.length || (temp[0] != value1[0] || temp[1] != value1[1] || temp[2] != value1[2] || temp[3] != value1[3] || temp[4] != value1[4] || temp[5] != value1[5])) {
|
||||
myChart.clear();
|
||||
temp = value1;
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getData();
|
||||
function getData() {
|
||||
$.ajax({
|
||||
url: "JZYScreen.aspx/getData",
|
||||
type: "POST",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
data: JSON.stringify({
|
||||
projectId: projectid
|
||||
}),
|
||||
success: function (data) {
|
||||
if (data.d != null) {
|
||||
var company = data.d.company;
|
||||
if (company != null) {
|
||||
$("#divScroller").html(data.d.company);
|
||||
//if (timer != null) {
|
||||
// clearInterval(timer);
|
||||
//}
|
||||
//isScroll();
|
||||
}
|
||||
debugger
|
||||
createSM(data.d.num)
|
||||
$("#divSafeTotal").html(data.d.safeTotal);
|
||||
$("#divSafeWeek").html(data.d.safeTotalWeek);
|
||||
|
||||
//const now = new Date();
|
||||
//const yearEnd = new Date(now.getFullYear(), 11, 31);
|
||||
//const diff = yearEnd - now;
|
||||
//var dayRes = diff > 0 ? Math.ceil(diff / (1000 * 60 * 60 * 24)) + 1 : 0;
|
||||
//$("#divDayRel").html(dayRes);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
setInterval(function () { //执行任务
|
||||
getData();
|
||||
}, 10000);
|
||||
|
||||
setInterval(function () { //执行任务
|
||||
var now = new Date(); // 获取当前时间
|
||||
var years = now.getFullYear(); // 小时
|
||||
var months = now.getMonth()+1; // 小时
|
||||
var days = now.getDate(); // 小时
|
||||
var hours = now.getHours(); // 小时
|
||||
var minutes = now.getMinutes(); // 分钟
|
||||
var seconds = now.getSeconds(); // 秒
|
||||
|
||||
// 确保时间总是以两位数显示
|
||||
hours = hours < 10 ? '0' + hours : hours;
|
||||
minutes = minutes < 10 ? '0' + minutes : minutes;
|
||||
seconds = seconds < 10 ? '0' + seconds : seconds;
|
||||
|
||||
// 更新时钟显示
|
||||
var clock = years + '-' + months+'-'+days+' ' + hours + ':' + minutes + ':' + seconds;
|
||||
$("#divTime").html(clock);
|
||||
|
||||
}, 1000);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$('.b-wrap').on('click', function () {
|
||||
if (isFullScreen()) {
|
||||
// 处于全屏
|
||||
exitFullScreen()
|
||||
} else {
|
||||
// 未处于全屏
|
||||
requestFullScreen(document.querySelector(".wrap"));
|
||||
}
|
||||
|
||||
|
||||
})
|
||||
|
||||
function isFullScreen() {
|
||||
return !!(document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement);
|
||||
}
|
||||
|
||||
|
||||
function requestFullScreen(element) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if (element.webkitRequestFullscreen) {
|
||||
element.webkitRequestFullscreen();
|
||||
} else if (element.msRequestFullscreen) {
|
||||
element.msRequestFullscreen();
|
||||
}
|
||||
$('.b-wrap').text('<%=title2 %>')
|
||||
}
|
||||
|
||||
// 退出全屏
|
||||
function exitFullScreen() {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
$('.b-wrap').text('<%=title1 %>')
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,416 @@
|
|||
using BLL;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Services;
|
||||
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
|
||||
namespace FineUIPro.Web.HSSE.KqShowScreen
|
||||
{
|
||||
public partial class JZYScreen : PageBase
|
||||
{
|
||||
#region 项目主键
|
||||
/// <summary>
|
||||
/// 项目主键
|
||||
/// </summary>
|
||||
public string ProjectId
|
||||
{
|
||||
get
|
||||
{
|
||||
return (string)ViewState["ProjectId"];
|
||||
}
|
||||
set
|
||||
{
|
||||
ViewState["ProjectId"] = value;
|
||||
}
|
||||
}
|
||||
public string ProjectName
|
||||
{
|
||||
get
|
||||
{
|
||||
return (string)ViewState["ProjectName"];
|
||||
}
|
||||
set
|
||||
{
|
||||
ViewState["ProjectName"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 加载
|
||||
/// <summary>
|
||||
/// 加载页面
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (!IsPostBack)
|
||||
{
|
||||
this.ProjectId = this.CurrUser.LoginProjectId;
|
||||
var project = Funs.DB.Base_Project.FirstOrDefault(x => x.ProjectId == ProjectId);
|
||||
string title = "现场人员动态看板";
|
||||
if (project != null)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(project.ShortName))
|
||||
{
|
||||
ProjectName = project.ShortName + title;
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectName = project.ProjectName + title;
|
||||
}
|
||||
}
|
||||
title1 = "全屏";
|
||||
title2 = "退出全屏";
|
||||
remark1 = "施工人员";
|
||||
remark2 = "建投管理人员";
|
||||
remark3 = "监理管理人员";
|
||||
remark4 = "业主管理人员";
|
||||
remark5 = "当前现场人数";
|
||||
remark6 = "当日最高人数";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
protected string title1 = string.Empty;
|
||||
protected string title2 = string.Empty;
|
||||
protected string remark1 = string.Empty;
|
||||
protected string remark2 = string.Empty;
|
||||
protected string remark3 = string.Empty;
|
||||
protected string remark4 = string.Empty;
|
||||
protected string remark5 = string.Empty;
|
||||
protected string remark6 = string.Empty;
|
||||
|
||||
[WebMethod]
|
||||
public static object getData(string projectId)
|
||||
{
|
||||
|
||||
//let leftLabel = ['施工人员', '十六化建管理人员', '天辰管理人员', '监理管理人员', '业主管理人员', '当前现场总人数', '当日最高人数']
|
||||
|
||||
int num1 = 0;
|
||||
int num2 = 0;
|
||||
int num3 = 0;
|
||||
int num4 = 0;
|
||||
int num5 = 0;
|
||||
int num6 = 0;
|
||||
int num7 = 0;
|
||||
|
||||
try
|
||||
{
|
||||
int total = 0;
|
||||
HashSet<string> ids = new HashSet<string>();
|
||||
HashSet<string> idsIn = new HashSet<string>();
|
||||
HashSet<string> personAll = new HashSet<string>();
|
||||
|
||||
Dictionary<string, DateTime> inperson = new Dictionary<string, DateTime>();
|
||||
Dictionary<string, DateTime> outPerson = new Dictionary<string, DateTime>();
|
||||
DateTime dateTime = DateTime.Now.AddDays(-1);
|
||||
var inout = Funs.DB.SitePerson_PersonInOut.Where(x => x.ProjectId == projectId && x.ChangeTime > dateTime).OrderByDescending(x => x.ChangeTime);
|
||||
var unitid1 = Funs.DB.Project_ProjectUnit.Where(x => x.ProjectId == projectId && x.UnitType == Const.ProjectUnitType_3).Select(x => x.UnitId).ToArray();
|
||||
var unitname1 = Funs.DB.Base_Unit.Where(x => unitid1.Contains(x.UnitId)).Select(x => x.UnitName).ToArray();
|
||||
var unitid2 = Funs.DB.Project_ProjectUnit.Where(x => x.ProjectId == projectId && x.UnitType == Const.ProjectUnitType_4).Select(x => x.UnitId);
|
||||
var unitname2 = Funs.DB.Base_Unit.Where(x => unitid2.Contains(x.UnitId)).Select(x => x.UnitName).ToArray();
|
||||
Dictionary<string, int> company = new Dictionary<string, int>();
|
||||
Dictionary<string, int> companySys = new Dictionary<string, int>();
|
||||
Dictionary<string, int> workPost = new Dictionary<string, int>();
|
||||
Dictionary<string, int> workPostSys = new Dictionary<string, int>();
|
||||
|
||||
|
||||
foreach (var io in inout)
|
||||
{
|
||||
personAll.Add(io.PersonId);
|
||||
ids.Add(io.PersonId);
|
||||
if (io.IsIn.HasValue && io.IsIn.Value) //24小时内最晚的入场
|
||||
{
|
||||
if (inperson.ContainsKey(io.PersonId))
|
||||
{
|
||||
if (inperson[io.PersonId] < io.ChangeTime.Value)
|
||||
{
|
||||
inperson[io.PersonId] = io.ChangeTime.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (io.ChangeTime.HasValue)
|
||||
{
|
||||
inperson.Add(io.PersonId, io.ChangeTime.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else //24小时内最晚的出场
|
||||
{
|
||||
if (outPerson.ContainsKey(io.PersonId))
|
||||
{
|
||||
if (outPerson[io.PersonId] < io.ChangeTime.Value)
|
||||
{
|
||||
outPerson[io.PersonId] = io.ChangeTime.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (io.ChangeTime.HasValue)
|
||||
{
|
||||
outPerson.Add(io.PersonId, io.ChangeTime.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
num7 = personAll.Count;
|
||||
foreach (var id in ids)
|
||||
{
|
||||
if (inperson.ContainsKey(id) && !outPerson.ContainsKey(id))//只有入场没有出场 在场
|
||||
{
|
||||
idsIn.Add(id);
|
||||
num6++;
|
||||
}
|
||||
else if (inperson.ContainsKey(id) && outPerson.ContainsKey(id))
|
||||
{
|
||||
if (inperson[id] > outPerson[id])//最晚入场时间 小于出场时间 在场
|
||||
{
|
||||
idsIn.Add(id);
|
||||
num6++;
|
||||
}
|
||||
}
|
||||
}
|
||||
num1 = num6;
|
||||
HashSet<string> keys1 = new HashSet<string>();
|
||||
HashSet<string> keys2 = new HashSet<string>();
|
||||
|
||||
foreach (var io in inout)
|
||||
{
|
||||
if (idsIn.Contains(io.PersonId))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(io.WorkPostName))
|
||||
{
|
||||
if (!keys1.Contains(io.PersonId))
|
||||
{
|
||||
keys1.Add(io.PersonId);
|
||||
if (workPost.ContainsKey(io.UnitName + ";" + io.WorkPostName))
|
||||
{
|
||||
workPost[io.UnitName + ";" + io.WorkPostName] = workPost[io.UnitName + ";" + io.WorkPostName] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
workPost[io.UnitName + ";" + io.WorkPostName] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(io.UnitName))
|
||||
{
|
||||
if (!keys2.Contains(io.PersonId))
|
||||
{
|
||||
keys2.Add(io.PersonId);
|
||||
if (company.ContainsKey(io.UnitName))
|
||||
{
|
||||
company[io.UnitName] = company[io.UnitName] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
company[io.UnitName] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var workPosts = Funs.DB.Base_WorkPost.ToList();
|
||||
|
||||
string strSql = @"SELECT p.UnitId
|
||||
,ISNULL((case when u.UnitName=''then null else u.UnitName end),'未知') AS UnitName
|
||||
,p.WorkPostId as PostId
|
||||
,w.PostType
|
||||
,ISNULL((case when W.WorkPostName=''then null else W.WorkPostName end),'未知') AS PostName
|
||||
,COUNT( distinct PersonId) AS PersonCountSum
|
||||
FROM dbo.SitePerson_Person AS P
|
||||
LEFT JOIN dbo.Base_Unit AS U ON P.UnitId=U.UnitId
|
||||
LEFT JOIN dbo.Base_WorkPost AS W ON P.WorkPostId=W.WorkPostId
|
||||
LEFT JOIN dbo.Project_ProjectUnit AS pu ON pu.UnitId=p.UnitId and pu.ProjectId=p.ProjectId
|
||||
WHERE pu.ProjectId is not null and P.ProjectId = '" + projectId + @"' and P.InTime <=GETDATE() and ( P.OutTime is null or P.OutTime > GETDATE()) and p.IsUsed =1
|
||||
GROUP BY P.ProjectId,P.UnitId,U.UnitName,P.WorkPostId,w.PostType,W.WorkPostName";
|
||||
|
||||
|
||||
System.Data.DataTable tb = SQLHelper.GetDataTableRunText(strSql, null);
|
||||
|
||||
if (tb != null && tb.Rows.Count > 0)
|
||||
{
|
||||
foreach (DataRow row in tb.Rows)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(row["PostName"].ToString()))
|
||||
{
|
||||
if (!workPostSys.ContainsKey(row["UnitName"].ToString() + ";" + row["PostName"].ToString()))
|
||||
{
|
||||
workPostSys.Add(row["UnitName"].ToString() + ";" + row["PostName"].ToString(), 0);
|
||||
}
|
||||
workPostSys[row["UnitName"].ToString() + ";" + row["PostName"].ToString()] = workPostSys[row["UnitName"].ToString() + ";" + row["PostName"].ToString()] + int.Parse(row["PersonCountSum"].ToString());
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(row["UnitName"].ToString()))
|
||||
{
|
||||
if (!companySys.ContainsKey(row["UnitName"].ToString()))
|
||||
{
|
||||
companySys.Add(row["UnitName"].ToString(), 0);
|
||||
}
|
||||
companySys[row["UnitName"].ToString()] = companySys[row["UnitName"].ToString()] + int.Parse(row["PersonCountSum"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
string html = "";
|
||||
List<object> comStatic = new List<object>();
|
||||
foreach (var key in company.Keys)
|
||||
{
|
||||
string unitName = key;
|
||||
var unit = Funs.DB.Base_Unit.FirstOrDefault(x => x.UnitName == unitName);
|
||||
if (unit != null && !string.IsNullOrEmpty(unit.ShortUnitName))
|
||||
{
|
||||
unitName = unit.ShortUnitName;
|
||||
}
|
||||
|
||||
if (!unitname2.Contains(key) && !unitname1.Contains(key) && "中化学建设投资集团有限公司" != key)
|
||||
{
|
||||
html += @" <div class='tr'>
|
||||
<div class='td' style='width: 20%;'><span>" + unitName + @"</span></div>
|
||||
<div class='td' style='width: 20%;'>" + company[key] + "/" + (companySys.ContainsKey(key) ? companySys[key] : 0) + @"</div>
|
||||
<div class='row-box' style='width: 60%;'> ";
|
||||
}
|
||||
int MPerson = 0;
|
||||
int MPersonSys = 0;
|
||||
|
||||
int SPerson = 0;
|
||||
int SPersonSys = 0;
|
||||
|
||||
string workPostName = "";
|
||||
string workPostNum = "";
|
||||
string workPostSysNum = "";
|
||||
|
||||
foreach (var key2 in workPost.Keys)
|
||||
{
|
||||
MPerson = 0;
|
||||
SPerson = 0;
|
||||
string[] keys = key2.Split(';');
|
||||
if (key == keys[0])
|
||||
{
|
||||
if (unitname2.Contains(key))
|
||||
{
|
||||
num5 += workPost[key2];
|
||||
}
|
||||
else if ("中化学建设投资集团有限公司" == key)
|
||||
{
|
||||
num3 += workPost[key2];
|
||||
}
|
||||
else if (unitname1.Contains(key))
|
||||
{
|
||||
num4 += workPost[key2];
|
||||
}
|
||||
var workPostTemp = workPosts.FirstOrDefault(w => w.WorkPostName == keys[1]);
|
||||
if (workPostTemp != null)
|
||||
{
|
||||
if (workPostTemp.PostType == Const.PostType_1)//管理人员
|
||||
{
|
||||
//if (Resources.Lan.ASPXSC_3064 == key)//十六化建管理人员
|
||||
//{
|
||||
// num2 += workPost[key2];
|
||||
//}
|
||||
//else
|
||||
|
||||
num1 -= workPost[key2];
|
||||
MPerson += workPost[key2];
|
||||
MPersonSys += workPostSys.ContainsKey(key2) ? workPostSys[key2] : 0;
|
||||
}
|
||||
else if (workPostTemp.PostType == Const.PostType_2)//特种作业人员
|
||||
{
|
||||
SPerson += workPost[key2];
|
||||
SPersonSys += workPostSys.ContainsKey(key2) ? workPostSys[key2] : 0;
|
||||
|
||||
workPostName += " <span> " + keys[1] + " </span> ";
|
||||
workPostNum += " <span> " + workPost[key2] + " </span> ";
|
||||
workPostSysNum += " <span> " + (workPostSys.ContainsKey(key2) ? workPostSys[key2] : 0) + " </span> ";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var ZPerson = company[key] - MPerson - SPerson;
|
||||
var ZPersonSys = company[key] - MPersonSys - SPersonSys;
|
||||
|
||||
//workPostName += "<span>作业人员</span> ";
|
||||
//workPostNum += " <span>" + ZPerson + "</span>";
|
||||
//workPostSysNum += " <span>" + ZPersonSys + "</span>";
|
||||
|
||||
//workPostName += " <span>管理人员</span> ";
|
||||
//workPostNum += " <span>" + MPerson + "</span>";
|
||||
//workPostSysNum += " <span>" + MPersonSys + "</span>";
|
||||
|
||||
if (!unitname2.Contains(key) && !unitname1.Contains(key) && "中化学建设投资集团有限公司" != key)
|
||||
{
|
||||
html += @"<div class='td' style='width: 50%;align-items:start;'>"
|
||||
+ workPostName +
|
||||
@"</div>
|
||||
<div class='td' style='width: 25%;'>"
|
||||
+ workPostSysNum +
|
||||
@"</div>
|
||||
<div class='td' style='width: 25%;'>"
|
||||
+ workPostNum +
|
||||
@"</div>
|
||||
</div>
|
||||
</div>";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int safeTotal = 0;
|
||||
int safeTotalWeek = 0;
|
||||
var getMax = from x in Funs.DB.SitePerson_DayReportDetail
|
||||
join y in Funs.DB.SitePerson_DayReport on x.DayReportId equals y.DayReportId
|
||||
where y.ProjectId == projectId
|
||||
select x;
|
||||
if (getMax.Count() > 0)
|
||||
{
|
||||
safeTotal = Convert.ToInt32(getMax.Sum(x => x.PersonWorkTime) ?? 0);
|
||||
}
|
||||
|
||||
var getWeek = from x in Funs.DB.SitePerson_DayReportDetail
|
||||
join y in Funs.DB.SitePerson_DayReport on x.DayReportId equals y.DayReportId
|
||||
where y.ProjectId == projectId
|
||||
where y.CompileDate > DateTime.Now.AddDays(-7)
|
||||
select x;
|
||||
if (getWeek.Count() > 0)
|
||||
{
|
||||
safeTotalWeek = Convert.ToInt32(getWeek.Sum(x => x.PersonWorkTime) ?? 0);
|
||||
}
|
||||
|
||||
|
||||
num1 = num6 - num5 - num4 - num3;
|
||||
|
||||
return new { company = html, total, num = new int[] { num1, num3, num4, num5, num6, num7 }, safeTotal, safeTotalWeek };
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return new { company = e.Message };
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <自动生成>
|
||||
// 此代码由工具生成。
|
||||
//
|
||||
// 对此文件的更改可能导致不正确的行为,如果
|
||||
// 重新生成代码,则所做更改将丢失。
|
||||
// </自动生成>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace FineUIPro.Web.HSSE.KqShowScreen
|
||||
{
|
||||
|
||||
|
||||
public partial class JZYScreen
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,327 @@
|
|||
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="KqShowScreen.aspx.cs" Inherits="FineUIPro.Web.HSSE.KqShowScreen.KqShowScreen" %>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head runat="server">
|
||||
<meta charset="UTF-8">
|
||||
<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/css/kqshowscreen.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="context">
|
||||
<div class="left site">
|
||||
<div class="block">
|
||||
<div class="title"><asp:Literal runat="server" Text="当前现场总人数"/></div>
|
||||
<div class="main xc">
|
||||
<div class="number" id="divTotal">
|
||||
0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block1 ">
|
||||
<div class="title"><asp:Literal runat="server" Text="当前公司现场人数"/></div>
|
||||
<div class="main gsxc">
|
||||
<ul id="ulcom" >
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right site">
|
||||
<div class="block1">
|
||||
<div class="top">
|
||||
<div class="info">
|
||||
<ul id="infoul">
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
<div class="photo">
|
||||
<img id="header" src="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block">
|
||||
<div class="title"><asp:Literal runat="server" Text="当前现场岗位人数量"/></div>
|
||||
<div class="main" id="gwnum">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<script src="../../res/lib/echarts.min.js"></script>
|
||||
<script src="../../res/lib/jquery.js"></script>
|
||||
<script>
|
||||
var projectid = '<%=ProjectId%>'
|
||||
|
||||
function createGWNUM(name, value1) {
|
||||
let type = name//['焊工', '电工', '架子工', '木工', '管工', '仪表安装工', '电气安装工', '钢筋工', '起重司机', '钳工', '起重指挥', '混凝土工', '维护电工']
|
||||
let value = value1// [100, 96, 89, 88, 87, 81, 80, 76, 75, 72, 70, 65, 62, 61]
|
||||
let opt = {
|
||||
grid: {
|
||||
top: 20,
|
||||
left: 60,
|
||||
right:60
|
||||
// bottom: 30
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: type,
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#84D7FE'
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
},
|
||||
axisLabel: {
|
||||
interval: 0, // 坐标轴刻度标签的显示间隔
|
||||
rotate: -30 // 标签倾斜的角度
|
||||
}
|
||||
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
color: '#84D7FE'
|
||||
}
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: '#2E87AC',
|
||||
type: 'dashed'
|
||||
}
|
||||
}
|
||||
},
|
||||
dataZoom: [
|
||||
{
|
||||
show: true,
|
||||
type: 'slider', // 单独滚动条
|
||||
filterMode: 'none', // 不过滤数据 - 保证 y 轴数据范围不变
|
||||
brushSelect: true,
|
||||
bottom: 0,
|
||||
height: 10,
|
||||
backgroundColor: 'transparent',
|
||||
// 选中范围的填充颜色
|
||||
fillerColor: 'transparent',
|
||||
borderWidth: 0,
|
||||
borderColor: 'transparent',
|
||||
dataBackground: {
|
||||
lineStyle: {
|
||||
color: 'transparent'
|
||||
},
|
||||
areaStyle: {
|
||||
color: 'transparent'
|
||||
}
|
||||
},
|
||||
selectedDataBackground: {
|
||||
lineStyle: {
|
||||
color: 'transparent'
|
||||
},
|
||||
areaStyle: {
|
||||
color: 'transparent'
|
||||
}
|
||||
},
|
||||
|
||||
startValue: 0,
|
||||
endValue: 10,
|
||||
xAxisIndex: [0],
|
||||
showDetail: false,
|
||||
|
||||
handleSize: '0%',
|
||||
// 移动手柄尺寸高度
|
||||
// 测试发现手柄颜色和边框颜色会出现 偏差,所有设置手柄高度为0, 添加边框高度。由边框撑起高度
|
||||
moveHandleSize: 0, // 设置拖动手柄高度为0,只由边框负责高度展示
|
||||
// 不展示拖动手柄图标
|
||||
moveHandleIcon: 'none',
|
||||
moveHandleStyle: {
|
||||
// borderColor: systemTheme === 'light' ? '#E4E6E7' : '#5d6177',
|
||||
borderColor:'#5d6177',
|
||||
borderWidth: 10, // 设置边框高度
|
||||
borderType: 'solid',
|
||||
borderCap: 'round',
|
||||
// 保证拖动手柄右边框结尾有圆角
|
||||
borderJoin: 'round'
|
||||
},
|
||||
// 拖动高亮时设置
|
||||
emphasis: {
|
||||
moveHandleStyle: {
|
||||
// borderColor: systemTheme === 'light' ? '#E4E6E7' : '#5d6177',
|
||||
borderColor: '#5d6177',
|
||||
borderWidth: 10,
|
||||
borderType: 'solid',
|
||||
borderCap: 'round'
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '',
|
||||
data: value,
|
||||
type: 'bar',
|
||||
label: {
|
||||
show: true,
|
||||
color: '#ffffff',
|
||||
position: 'top',
|
||||
},
|
||||
barWidth: 16,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1) ).toString(16);}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var myEchart = echarts.init(document.getElementById('gwnum'));
|
||||
myEchart.setOption(opt);
|
||||
}
|
||||
|
||||
|
||||
getData();
|
||||
function getData() {
|
||||
$.ajax({
|
||||
url: "KqShowScreen.aspx/getData",
|
||||
type: "POST",
|
||||
contentType: "application/json; charset=utf-8",
|
||||
dataType: "json",
|
||||
data: JSON.stringify({
|
||||
projectId: projectid
|
||||
}),
|
||||
success: function (data) {
|
||||
if (data.d != null) {
|
||||
var workPost = data.d.workPost;
|
||||
if (workPost != null) {
|
||||
createGWNUM(workPost.name, workPost.value)
|
||||
}
|
||||
|
||||
var company = data.d.company;
|
||||
if (company != null) {
|
||||
var chtml = '';
|
||||
company.forEach(function (item, index, arr) {
|
||||
chtml += ' <li><span>' + item.name + '</span><span>' + item.value +'</span></li>';
|
||||
})
|
||||
$("#ulcom").html(chtml)
|
||||
|
||||
}
|
||||
var person = data.d.person;
|
||||
if (person != null) {
|
||||
var phtml = '<li><span><asp:Literal runat="server" Text="所属单位"/></span><span>' + person.UnitName +'</span></li>'+
|
||||
'<li ><span><asp:Literal runat="server" Text="姓名"/></span><span>' + person.PersonName +'</span></li>' +
|
||||
'<li><span><asp:Literal runat="server" Text="岗位"/></span><span>' + person.WorkPostName+'</span></li>' +
|
||||
'<li><span><asp:Literal runat="server" Text="班组"/></span><span>' + person.teamGroupName +'</span></li>' +
|
||||
'<li><span>' + person.inOut+'</span><span>' + person.ChangeTime+'</span></li>';
|
||||
|
||||
|
||||
$("#infoul").html(phtml)
|
||||
$("#header").attr('src',person.PhotoUrl);
|
||||
|
||||
}
|
||||
|
||||
$("#divTotal").html(data.d.total)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 设定默认值
|
||||
var websock = null;
|
||||
var cishu = 0;
|
||||
// 每10分钟 通过 websocket 向服务器发送一次心跳 证明客户端没有离线 依然在线可以正常接受消息
|
||||
setInterval(websocketsend, 20000);
|
||||
|
||||
//initWebsocket();
|
||||
function initWebsocket() {
|
||||
/*
|
||||
* 初始化 websock
|
||||
* 连接 服务器地址
|
||||
* 并绑定 websock 四个事件方法
|
||||
*/
|
||||
websock = new WebSocket('wss://wzgl.hfnbd.com:1000');
|
||||
// 接收服务器返回的数据
|
||||
websock.onmessage = this.websocketonmessage;
|
||||
// 连接建立时触发
|
||||
websock.onopen = this.websocketonopen;
|
||||
// 连接中发生异常
|
||||
websock.onerror = this.websocketonerror;
|
||||
// 连接关闭时触发
|
||||
websock.onclose = this.websocketclose;
|
||||
cishu = 0;
|
||||
}
|
||||
function websocketonopen(){
|
||||
|
||||
websocketsend();
|
||||
}
|
||||
|
||||
|
||||
function websocketonerror() {
|
||||
/*
|
||||
* websocket 连接建立失败 执行的方法
|
||||
* 注:我这里加了个判断,如果联系建立失败就在连接几次
|
||||
*/
|
||||
if (cishu < 5) {
|
||||
cishu = cishu + 1;
|
||||
initWebsocket();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function websocketsend() {
|
||||
|
||||
/*
|
||||
* websocket 数据发送 通过 websock.send() 方法向服务器发送数据
|
||||
* 注:这里随便发哈,主要作用就是通过这个动作,让客户端与服务端建立联系
|
||||
*/
|
||||
let actions = {
|
||||
"projectid": projectid
|
||||
};
|
||||
websock.send(JSON.stringify(actions));
|
||||
}
|
||||
|
||||
|
||||
function websocketclose(e) {
|
||||
/*
|
||||
* websocket 连接关闭 执行的方法
|
||||
*/
|
||||
console.log('断开连接', e);
|
||||
}
|
||||
|
||||
|
||||
function websocketonmessage(e) {
|
||||
/*
|
||||
* websocket 数据接收 执行的方法
|
||||
* 注:服务器通过 websocke 向客户端发送数据时,这里的方法就会自动触发啦
|
||||
*/
|
||||
|
||||
if ("newinout" == e.data);
|
||||
{
|
||||
getData();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
setInterval(function () { //执行任务
|
||||
getData();
|
||||
}, 2000);
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,210 @@
|
|||
using BLL;
|
||||
using FastReport.Data;
|
||||
using FineUIPro.Web.HSSE.SitePerson;
|
||||
using FineUIPro.Web.ProjectData;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Services;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
namespace FineUIPro.Web.HSSE.KqShowScreen
|
||||
{
|
||||
public partial class KqShowScreen : PageBase
|
||||
{
|
||||
#region 项目主键
|
||||
/// <summary>
|
||||
/// 项目主键
|
||||
/// </summary>
|
||||
public string ProjectId
|
||||
{
|
||||
get
|
||||
{
|
||||
return (string)ViewState["ProjectId"];
|
||||
}
|
||||
set
|
||||
{
|
||||
ViewState["ProjectId"] = value;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
protected static string title1 = string.Empty;
|
||||
protected static string title2 = string.Empty;
|
||||
|
||||
#region 加载
|
||||
/// <summary>
|
||||
/// 加载页面
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (!IsPostBack)
|
||||
{
|
||||
this.ProjectId = this.CurrUser.LoginProjectId;
|
||||
if (!string.IsNullOrEmpty(Request.Params["projectId"]) && Request.Params["projectId"] != this.CurrUser.LoginProjectId)
|
||||
{
|
||||
this.ProjectId = Request.Params["projectId"];
|
||||
}
|
||||
title1 = "出场时间";
|
||||
title2 = "入场时间";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
[WebMethod]
|
||||
public static object getData(string projectId)
|
||||
{
|
||||
int total = 0;
|
||||
HashSet<string> ids = new HashSet<string>();
|
||||
HashSet<string> idsIn = new HashSet<string>();
|
||||
Dictionary<string, DateTime> inperson = new Dictionary<string, DateTime>();
|
||||
Dictionary<string, DateTime> outPerson = new Dictionary<string, DateTime>();
|
||||
DateTime dateTime = DateTime.Now.AddDays(-1);
|
||||
var inout = Funs.DB.SitePerson_PersonInOut.Where(x => x.ProjectId == projectId && x.ChangeTime > dateTime).OrderByDescending(x => x.ChangeTime);
|
||||
Dictionary<string, int> company = new Dictionary<string, int>();
|
||||
Dictionary<string, int> workPost = new Dictionary<string, int>();
|
||||
foreach (var io in inout)
|
||||
{
|
||||
ids.Add(io.PersonId);
|
||||
if (io.IsIn.HasValue && io.IsIn.Value) //24小时内最晚的入场
|
||||
{
|
||||
if (inperson.ContainsKey(io.PersonId))
|
||||
{
|
||||
if (inperson[io.PersonId] < io.ChangeTime.Value)
|
||||
{
|
||||
inperson[io.PersonId] = io.ChangeTime.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (io.ChangeTime.HasValue)
|
||||
{
|
||||
inperson.Add(io.PersonId, io.ChangeTime.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else //24小时内最晚的出场
|
||||
{
|
||||
if (outPerson.ContainsKey(io.PersonId))
|
||||
{
|
||||
if (outPerson[io.PersonId] < io.ChangeTime.Value)
|
||||
{
|
||||
outPerson[io.PersonId] = io.ChangeTime.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (io.ChangeTime.HasValue)
|
||||
{
|
||||
outPerson.Add(io.PersonId, io.ChangeTime.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (var id in ids)
|
||||
{
|
||||
if (inperson.ContainsKey(id) && !outPerson.ContainsKey(id))//只有入场没有出场 在场
|
||||
{
|
||||
idsIn.Add(id);
|
||||
total++;
|
||||
}
|
||||
else if (inperson.ContainsKey(id) && outPerson.ContainsKey(id))
|
||||
{
|
||||
if (inperson[id] > outPerson[id])//最晚入场时间 小于出场时间 在场
|
||||
{
|
||||
idsIn.Add(id);
|
||||
total++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HashSet<string> keys1 = new HashSet<string>();
|
||||
HashSet<string> keys2 = new HashSet<string>();
|
||||
|
||||
foreach (var io in inout)
|
||||
{
|
||||
if (idsIn.Contains(io.PersonId))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(io.WorkPostName))
|
||||
{
|
||||
if (!keys1.Contains(io.PersonId))
|
||||
{
|
||||
keys1.Add(io.PersonId);
|
||||
if (workPost.ContainsKey(io.WorkPostName))
|
||||
{
|
||||
workPost[io.WorkPostName] = workPost[io.WorkPostName] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
workPost[io.WorkPostName] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!string.IsNullOrEmpty(io.UnitName))
|
||||
{
|
||||
if (!keys2.Contains(io.PersonId))
|
||||
{
|
||||
keys2.Add(io.PersonId);
|
||||
if (company.ContainsKey(io.UnitName))
|
||||
{
|
||||
company[io.UnitName] = company[io.UnitName] + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
company[io.UnitName] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var personInOut = inout.FirstOrDefault();
|
||||
string teamGroupName = "";
|
||||
string inOut = title1;
|
||||
string PhotoUrl = "";
|
||||
string PersonName = "";
|
||||
string UnitName = "";
|
||||
string WorkPostName = "";
|
||||
string ChangeTime = "";
|
||||
if (personInOut != null)
|
||||
{
|
||||
var person = Funs.DB.SitePerson_Person.FirstOrDefault(x => x.PersonId == personInOut.PersonId);
|
||||
PersonName = personInOut.PersonName ?? "";
|
||||
UnitName = personInOut.UnitName ?? "";
|
||||
WorkPostName = personInOut.WorkPostName ?? "";
|
||||
ChangeTime = personInOut.ChangeTime.Value.ToString("yyyy-MM-dd HH:mm");
|
||||
PhotoUrl = "../../" + person.PhotoUrl;
|
||||
if (personInOut.IsIn == true)
|
||||
{
|
||||
inOut = title2;
|
||||
}
|
||||
if (!string.IsNullOrEmpty(person.TeamGroupId))
|
||||
{
|
||||
var teamGroup = Funs.DB.ProjectData_TeamGroup.FirstOrDefault(x => x.TeamGroupId == person.TeamGroupId);
|
||||
if (teamGroup != null)
|
||||
{
|
||||
teamGroupName = teamGroup.TeamGroupName;
|
||||
}
|
||||
}
|
||||
}
|
||||
List<object> comStatic = new List<object>();
|
||||
foreach (var key in company.Keys)
|
||||
{
|
||||
comStatic.Add(new { name = key, value = company[key] });
|
||||
}
|
||||
List<string> workPostName = new List<string>();
|
||||
List<int> workPostValue = new List<int>();
|
||||
foreach (var key in workPost.Keys)
|
||||
{
|
||||
workPostName.Add(key);
|
||||
workPostValue.Add(workPost[key]);
|
||||
}
|
||||
return new { company = comStatic, total, workPost = new { name = workPostName, value = workPostValue }, person = new { PersonName, UnitName, WorkPostName, inOut, PhotoUrl, teamGroupName, ChangeTime } };
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <自动生成>
|
||||
// 此代码由工具生成。
|
||||
//
|
||||
// 对此文件的更改可能导致不正确的行为,如果
|
||||
// 重新生成代码,则所做更改将丢失。
|
||||
// </自动生成>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace FineUIPro.Web.HSSE.KqShowScreen
|
||||
{
|
||||
|
||||
|
||||
public partial class KqShowScreen
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -18,6 +18,9 @@
|
|||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
.content-body::-webkit-scrollbar{
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
|
|
@ -246,6 +249,15 @@
|
|||
<div class="center">
|
||||
<div class="map">
|
||||
<div class="project-box" style="margin-top: 0.25rem;">
|
||||
<div class="p-item js-hover" data-type="manHour" style="border: 1px solid rgba(180, 199, 228, 0.164);margin-right: 0.125rem;">
|
||||
<i></i>
|
||||
<div class="p-row">
|
||||
<h6 style="white-space: nowrap;">累计人工时(实名制)</h6>
|
||||
<p>
|
||||
<span>{{form.manHour.totalManHour}}</span><span></span>
|
||||
</p >
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-item js-hover" data-type="BeUnderConstructionNum" >
|
||||
<i></i>
|
||||
<div class="p-row">
|
||||
|
|
@ -253,13 +265,13 @@
|
|||
<p><span>{{form.projectInfo.projectsUnderConstruction}}</span><span>项</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-item js-hover" data-type="ShutdownNum">
|
||||
<%--<div class="p-item js-hover" data-type="ShutdownNum">
|
||||
<i></i>
|
||||
<div class="p-row">
|
||||
<h6>停工项目</h6>
|
||||
<p><span>{{form.projectInfo.shutdownProject}}</span><span>项</span></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>--%>
|
||||
<div class="p-item js-hover" data-type="JoinConstructionPersonNum">
|
||||
<i></i>
|
||||
<div class="p-row">
|
||||
|
|
@ -688,6 +700,9 @@
|
|||
participateInNum: 0,//参建人数
|
||||
dangerousProject: 0,//在施危大工程
|
||||
},
|
||||
manHour:{
|
||||
totalManHour: 0,
|
||||
},
|
||||
dangerousProject:
|
||||
{//危大工程管控数据
|
||||
approvalCompleted: 0,//审批完成
|
||||
|
|
@ -762,7 +777,7 @@
|
|||
// 组件挂载后执行的操作
|
||||
this.show = true; // 显示内容
|
||||
this.loadData(); // 加载数据
|
||||
this.createChinaMap();
|
||||
// this.createChinaMap();
|
||||
this.createMap1();
|
||||
this.createMap2();
|
||||
this.startTimer(); //启动时间定时器
|
||||
|
|
@ -1014,6 +1029,12 @@
|
|||
}
|
||||
this.chainaMap.setOption(chinaOption);
|
||||
this.chainaMap.on('click', function (params) {
|
||||
// 控制台打印点击的地区名称
|
||||
if (params.seriesType == "effectScatter") {
|
||||
var projectId = params.data && params.data.id ? params.data.id : '';
|
||||
var jumpUrl = "../HSSE/KqShowScreen/KqShowScreen.aspx?projectId=" + encodeURIComponent(projectId);
|
||||
window.open(jumpUrl)
|
||||
}
|
||||
// 控制台打印点击的地区名称
|
||||
//if (params.seriesType == 'effectScatter') {
|
||||
// alert('点击了' + params.name);
|
||||
|
|
@ -1493,6 +1514,11 @@
|
|||
else if (type == 'AccidentEventData') {
|
||||
$('iframe').attr('src', '../DataShow/Accident.aspx') //事故事件数据
|
||||
window.open("../DataShow/Accident.aspx")
|
||||
}else if (type == 'manHour') {
|
||||
// $('.container').hide()
|
||||
// $('#contentContainer').show()
|
||||
// $('#contentFrame').attr('src', '../DataShow/kq.aspx')
|
||||
window.open("../DataShow/kq.aspx")
|
||||
}
|
||||
else {
|
||||
// $('iframe').attr('src', '../SysManage/Unit.aspx')
|
||||
|
|
|
|||
|
|
@ -203,6 +203,47 @@ namespace FineUIPro.Web.common
|
|||
|
||||
#endregion
|
||||
|
||||
#region 累计人工时
|
||||
//累计人工时
|
||||
var allProjectsDetails = (from detail in db.SitePerson_DayReportDetail
|
||||
join report in db.SitePerson_DayReport
|
||||
on detail.DayReportId equals report.DayReportId
|
||||
join unit in db.Base_Unit
|
||||
on detail.UnitId equals unit.UnitId
|
||||
join project in db.Base_Project
|
||||
on report.ProjectId equals project.ProjectId
|
||||
where BaseDataService.BeUnderConstructionList.Contains(report.ProjectId) &&
|
||||
report.CompileDate == (from r in db.SitePerson_DayReport
|
||||
where r.ProjectId == report.ProjectId
|
||||
select r.CompileDate).Max()
|
||||
orderby project.ShortName, unit.UnitCode
|
||||
select new
|
||||
{
|
||||
detail.DayReportDetailId,
|
||||
report.ProjectId,
|
||||
ProjectName = project.ShortName,
|
||||
unit.UnitName,
|
||||
detail.PersonWorkTime,
|
||||
// 当年累计
|
||||
YearPersonWorkTime = (from d in db.SitePerson_DayReportDetail
|
||||
join r in db.SitePerson_DayReport on d.DayReportId equals r.DayReportId
|
||||
where r.ProjectId == report.ProjectId
|
||||
&& d.UnitId == detail.UnitId
|
||||
&& r.CompileDate <= report.CompileDate
|
||||
&& r.CompileDate.Value.Year == report.CompileDate.Value.Year
|
||||
select d.PersonWorkTime ?? 0).Sum(),
|
||||
// 总累计
|
||||
TotalPersonWorkTime = (from d in db.SitePerson_DayReportDetail
|
||||
join r in db.SitePerson_DayReport on d.DayReportId equals r.DayReportId
|
||||
where r.ProjectId == report.ProjectId
|
||||
&& d.UnitId == detail.UnitId
|
||||
&& r.CompileDate <= report.CompileDate
|
||||
select d.PersonWorkTime ?? 0).Sum()
|
||||
}).ToList();
|
||||
// 计算所有项目累计人工时总和
|
||||
var totalManHour = allProjectsDetails.Sum(x => x.TotalPersonWorkTime);
|
||||
|
||||
#endregion
|
||||
// 构造返回数据
|
||||
var returnData = new
|
||||
{
|
||||
|
|
@ -350,6 +391,10 @@ namespace FineUIPro.Web.common
|
|||
useNum = inspectionMachineList.Where(x => x.InspectionType == "计量").Sum(x => x.UnitsCount ?? 0),
|
||||
okNum = inspectionMachineList.Where(x => x.InspectionType == "计量" && x.IsCheckOK.HasValue && x.IsCheckOK == true).Sum(x => x.UnitsCount ?? 0),
|
||||
},
|
||||
manHour = new
|
||||
{//工时数
|
||||
totalManHour = totalManHour,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,209 @@
|
|||
*{
|
||||
margin: 0;
|
||||
padding: 0%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
html, body, .wrap {
|
||||
height: 100%;
|
||||
font-family: 'Microsoft YaHei', '微软雅黑', sans-serif;
|
||||
background-color: #0B5695;
|
||||
font-size:20px;
|
||||
}
|
||||
|
||||
.header{
|
||||
height: 1rem;
|
||||
background-color: #0E5D9F;
|
||||
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.header>h1{
|
||||
text-align: center;
|
||||
text-shadow: 0px 0px 0px #fff, -1px -1px 0px #000;
|
||||
color: #ffffff;
|
||||
height: 1rem;
|
||||
line-height: 1rem;
|
||||
}
|
||||
.conterner{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: calc(100% - 1rem);
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
padding: .25rem;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.c-row{
|
||||
width: 70%;
|
||||
height: 100%;
|
||||
padding: .375rem ;
|
||||
margin-left: .375rem;
|
||||
background-color: #0E5D9F;
|
||||
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.table{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
/* border: 1px solid #f2f2f2; */
|
||||
|
||||
}
|
||||
.table>.table-head{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-bottom: 1px solid #fff;
|
||||
background-color: #0a4a7f91;
|
||||
}
|
||||
.table>.table-head>.th{
|
||||
border-right: 1px solid #fff;
|
||||
height: 1rem;
|
||||
line-height: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: 800;
|
||||
font-size:22px;
|
||||
text-shadow: 0px 0px 0px #fff, -1px -1px 0px #000;
|
||||
}
|
||||
.table>.table-head>.th:last-child{
|
||||
border-right: none;
|
||||
}
|
||||
.table>.table-head>.th>.th-1{
|
||||
width: 100%;
|
||||
height: .5rem;
|
||||
line-height: .5rem;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #fff;
|
||||
}
|
||||
.table>.table-head>.th>.th-2{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: .5rem;
|
||||
line-height: .5rem;
|
||||
|
||||
}
|
||||
.table>.table-head>.th>.th-2>span{
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
border-right: 1px solid #fff ;
|
||||
}
|
||||
.table>.table-head>.th>.th-2>span:last-child{
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.table-body {
|
||||
height: calc(100% - .75rem);
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
overflow-y: scroll;
|
||||
font-size: 22px;
|
||||
font-weight: 800;
|
||||
}
|
||||
.table-body::-webkit-scrollbar{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.table-body>.scroll-box .tr{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
border-bottom: 1px solid #fff ;
|
||||
}
|
||||
.table-body > .scroll-box .tr:last-child {
|
||||
/* margin-bottom: .375rem; */
|
||||
}
|
||||
.row-box{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.table-body>.scroll-box .tr .td{
|
||||
border-right: 1px solid #fff ;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.table-body>.scroll-box .tr>.row-box>.td{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
|
||||
}
|
||||
.table-body>.scroll-box .tr>.row-box>.td:last-child{
|
||||
border-right: none;
|
||||
}
|
||||
.table-body > .scroll-box .tr > .row-box > .td > span {
|
||||
width: 100%;
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: .05rem 0;
|
||||
border-bottom: 1px solid #fff;
|
||||
}
|
||||
.table-body>.scroll-box .tr>.row-box>.td>span:last-child{
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.row{
|
||||
width: 30%;
|
||||
|
||||
}
|
||||
|
||||
|
||||
.row>.row-1{
|
||||
width: 100%;
|
||||
height: 1.5rem;
|
||||
background-color: #0E5D9F;
|
||||
padding: .1875rem;
|
||||
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
|
||||
/* 添加一个内阴影增加立体感 */
|
||||
/* box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5); */
|
||||
}
|
||||
.row>.row-1>.label{
|
||||
width: 100%;
|
||||
font-size: .35rem;
|
||||
/* color: #bfe2ff; */
|
||||
color: #fff;
|
||||
font-weight: 700;
|
||||
text-shadow: 0px 0px 0px #fff, -1px -1px 0px #000;
|
||||
}
|
||||
|
||||
.row>.row-1>.number{
|
||||
width: 100%;
|
||||
font-size: .65rem;
|
||||
text-align: right;
|
||||
margin-top: 0rem;
|
||||
font-family: DIN;
|
||||
font-weight: 700;
|
||||
/* text-shadow: 0px 0px 0px #fff, -1px -1px 0px #000; */
|
||||
/* color: #fff; */
|
||||
letter-spacing: 4px;
|
||||
background: linear-gradient(to bottom, #0b9576, #00ffff, #0072d1);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
font-size: 45px;
|
||||
}
|
||||
|
||||
#rs{
|
||||
margin-top: .25rem;
|
||||
height: calc(100% - 5.25rem);
|
||||
width: 100%;
|
||||
background-color: #0E5D9F;
|
||||
padding: .1875rem;
|
||||
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@font-face {
|
||||
font-family: 'DIN';
|
||||
/* src: url(../font/font.ttf); */
|
||||
/* src: url(../font//DINCond-RegularAlternate.otf); */
|
||||
src: url(../fonts/dinfont.ttf);
|
||||
}
|
||||
|
|
@ -0,0 +1,496 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
html,
|
||||
body,
|
||||
#app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #001B35;
|
||||
}
|
||||
|
||||
#content {
|
||||
height: calc(100% - 1rem);
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1.5fr 1fr;
|
||||
gap: 0.25rem;
|
||||
padding: 20px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#content>div {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: grid;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#content>div:nth-child(1),
|
||||
#content>div:nth-child(3) {
|
||||
gap: 0.25rem;
|
||||
grid-template-rows: 60% 40%;
|
||||
}
|
||||
|
||||
.block {
|
||||
width: 100%;
|
||||
background: linear-gradient(180deg, rgba(1, 32, 56, 0.4) 0%, rgba(10, 58, 92, 0.7) 100%);
|
||||
border: 2px solid;
|
||||
border-image: linear-gradient(176deg, rgba(78, 167, 203, 0), rgba(78, 167, 203, 1)) 2 2;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.block-tit {
|
||||
width: 100%;
|
||||
height: 0.4125rem;
|
||||
background-image: url(../images/01/l01.png);
|
||||
background-position: left top;
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
line-height: 0.4125rem;
|
||||
padding-left: 0.6rem;
|
||||
}
|
||||
|
||||
.block-tit>span {
|
||||
font-weight: bold;
|
||||
font-size: 0.2rem;
|
||||
color: #E4FBFF;
|
||||
text-align: left;
|
||||
background: linear-gradient(180deg, #FFFFFF 17%, #8CEEFF 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.block-main {
|
||||
height: calc(100% - 0.4125rem);
|
||||
width: 100%;
|
||||
padding: 0.125rem;
|
||||
}
|
||||
.flex-between{
|
||||
display: flex;
|
||||
flex-direction:column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.top-row {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.top-row>.top-row-num {
|
||||
width: 0.5rem;
|
||||
font-weight: 700;
|
||||
|
||||
font-size: 0.2rem;
|
||||
line-height: 0.2rem;
|
||||
}
|
||||
|
||||
.top-row-r {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
width: calc(100% - 0.5rem);
|
||||
}
|
||||
|
||||
.top-row-r-t {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 0.05rem;
|
||||
}
|
||||
.top-row-r-t>span{
|
||||
font-size: 0.175rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
.top-row-r-b {
|
||||
width: 100%;
|
||||
background-color: #173A55;
|
||||
height: 0.125rem;
|
||||
}
|
||||
|
||||
.top-row-r-b>.top-row-r-b-inner {
|
||||
height: 0.125rem;
|
||||
background: linear-gradient(90deg, #144269 0%, #34ECFE 100%);
|
||||
}
|
||||
|
||||
.color-blue {
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
background: linear-gradient(180deg, #FFFFFF 0%, #00E9FF 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.color-05937B {
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
background: linear-gradient(180deg, #FFFFFF 0%, #05937B 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
|
||||
}
|
||||
|
||||
.ry>.th{
|
||||
padding: 0 0.1875rem;
|
||||
line-height: 0.5rem;
|
||||
height: 0.5rem;
|
||||
background-color: #13395E;
|
||||
display: grid;
|
||||
grid-template-columns: 0.5rem 0.75rem 1.25rem 1.25rem 1fr ;
|
||||
}
|
||||
.ry>.th>span{
|
||||
text-align: left;
|
||||
color: #ffffff;
|
||||
font-size: 0.175rem;
|
||||
}
|
||||
.ry>.body>.tr{
|
||||
position: relative;
|
||||
padding: 0 0.1875rem;
|
||||
line-height: 0.5rem;
|
||||
height: 0.5rem;
|
||||
display: grid;
|
||||
grid-template-columns: 0.5rem 0.75rem 1.25rem 1.25rem 1fr ;
|
||||
}
|
||||
.ry>.body>.tr>div{
|
||||
text-align: left;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ry>.body>.tr:nth-child(2n){
|
||||
|
||||
background-color: #13395E;
|
||||
}
|
||||
.ry>.body>.tr>.photo{
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
}
|
||||
.ry>.body>.tr>.photo>img{
|
||||
width: 0.375rem;
|
||||
height: 0.375rem;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.ry>.body>.tr>.out{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
line-height: 1;
|
||||
right: 10px;
|
||||
color: #ffffff;
|
||||
padding: 0.05rem;
|
||||
background-color: #FF0000;
|
||||
border-radius: 0.05rem;
|
||||
|
||||
}
|
||||
.ry>.body>.tr>.in{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
line-height: 1;
|
||||
right: 10px;
|
||||
color: #ffffff;
|
||||
padding: 0.05rem;
|
||||
border-radius: 0.05rem;
|
||||
background-color: #278F77;
|
||||
}
|
||||
.ry>.body{
|
||||
overflow: hidden;
|
||||
height: calc(100% - 0.5rem);
|
||||
}
|
||||
|
||||
.kq>.th{
|
||||
padding: 0 0.1875rem;
|
||||
line-height: 0.5rem;
|
||||
height: 0.5rem;
|
||||
background-color: #13395E;
|
||||
display: grid;
|
||||
grid-template-columns: 0.5rem 1fr 1.25rem 1rem 1rem;
|
||||
}
|
||||
.kq>.th>span{
|
||||
text-align: left;
|
||||
color: #ffffff;
|
||||
font-size: 0.175rem;
|
||||
}
|
||||
.kq>.body{
|
||||
overflow: hidden;
|
||||
height: calc(100% - 0.5rem);
|
||||
}
|
||||
.kq>.body>.tr{
|
||||
position: relative;
|
||||
padding: 0 0.1875rem;
|
||||
line-height: 0.5rem;
|
||||
height: 0.5rem;
|
||||
display: grid;
|
||||
grid-template-columns: 0.5rem 1fr 1.25rem 1rem 1rem ;
|
||||
}
|
||||
.kq>.body>.tr>span{
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0 0.025rem;
|
||||
}
|
||||
.kq>.body>.tr>.zc{
|
||||
color: #12CDA2;
|
||||
}
|
||||
.kq>.body>.tr:nth-child(2n){
|
||||
background-color: #13395E;
|
||||
}
|
||||
|
||||
#nlzb{
|
||||
width: 100%;
|
||||
height: 50%;
|
||||
}
|
||||
.bl{
|
||||
width: 100%;
|
||||
height: 50%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 0.8rem 1fr;
|
||||
}
|
||||
.bl-txt>span{
|
||||
margin-bottom: 0.125rem;
|
||||
}
|
||||
.bl-txt{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
font-size: 0.175rem;
|
||||
color: #ffffff;
|
||||
font-weight: 700;
|
||||
}
|
||||
#man,#woman{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-height: 120px;
|
||||
}
|
||||
#chainmap{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.block4 {
|
||||
width: 100%;
|
||||
background: linear-gradient(180deg, rgba(1, 32, 56, 0.4) 0%, rgba(10, 58, 92, 0.7) 100%);
|
||||
border: 2px solid;
|
||||
border-image: linear-gradient(176deg, rgba(78, 167, 203, 0), rgba(78, 167, 203, 1)) 2 2;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.block4-tit {
|
||||
width: 100%;
|
||||
height: 0.4125rem;
|
||||
background-image: url(../images/01/m07.png);
|
||||
background-position: left top;
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
line-height: 0.4125rem;
|
||||
padding-left: 0.6rem;
|
||||
}
|
||||
|
||||
.block4-tit>span {
|
||||
font-weight: bold;
|
||||
font-size: 0.2rem;
|
||||
color: #E4FBFF;
|
||||
text-align: left;
|
||||
background: linear-gradient(180deg, #FFFFFF 17%, #8CEEFF 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
.block4-main {
|
||||
height: calc(100% - 0.4125rem);
|
||||
width: 100%;
|
||||
padding: 0.1875rem 0.25rem;
|
||||
}
|
||||
|
||||
.kq-box{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
column-gap: 0.375rem;
|
||||
height: 0.75rem;
|
||||
}
|
||||
.kq-box>.kx-item{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient( 180deg, rgba(1,32,56,0.4) 0%, rgba(10,58,92,0.7) 100%);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.kq-box>.kx-item>.kx-item-tit{
|
||||
color: #ffffff;
|
||||
font-size: 0.2rem;
|
||||
}
|
||||
.kq-box>.kx-item>.kx-item-num{
|
||||
|
||||
font-size: 0.25rem;
|
||||
}
|
||||
|
||||
|
||||
header {
|
||||
width: 100%;
|
||||
height: 1rem;
|
||||
background-image: url(../images/01/top.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: left top;
|
||||
background-size: 100% 0.7125rem;
|
||||
display: grid;
|
||||
grid-template-columns: 8.2625rem 1fr 8.2625rem;
|
||||
position: relative;
|
||||
}
|
||||
.nav-box{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
align-items: center;
|
||||
}
|
||||
.logo-img{
|
||||
width: 1.9375rem;
|
||||
height: 0.5rem;
|
||||
background-image: url(../images/logo.png);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100% 100%;
|
||||
|
||||
}
|
||||
.refresh-img{
|
||||
margin-left: 0.125rem;
|
||||
background: url('../images/sprite.png') no-repeat 0 0;
|
||||
width: 27px;
|
||||
height: 26px;
|
||||
}
|
||||
.navs{
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.navs>.nav{
|
||||
|
||||
font-size: 14px;
|
||||
color: #FFFFFF;
|
||||
text-align: center;
|
||||
height: 0.375rem;
|
||||
line-height: 0.375rem;
|
||||
width: 1.4rem;
|
||||
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.navs>.nav-l{
|
||||
background-image: url(../images/nav01.png);
|
||||
}
|
||||
.navs>.nav-l-active{
|
||||
background-image: url(../images/nav02.png);
|
||||
}
|
||||
.navs>.nav-r{
|
||||
background-image: url(../images/nav03.png);
|
||||
}
|
||||
.navs>.nav-r-active{
|
||||
background-image: url(../images/nav04.png);
|
||||
}
|
||||
.timer{
|
||||
height: 0.425rem;
|
||||
width: 2.375rem;
|
||||
margin-left: 0.125rem;
|
||||
color: #FFFFFF;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.timer>p{
|
||||
font-size: 0.175rem;
|
||||
}
|
||||
.timer>p>span{
|
||||
margin-left: 0.125rem;
|
||||
}
|
||||
.timer>p>span:first-child{
|
||||
margin: 0;
|
||||
}
|
||||
.logo-tit {
|
||||
font-weight: bold;
|
||||
font-size: 0.4rem;
|
||||
line-height: 0.575rem;
|
||||
letter-spacing: 3px;
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
background: linear-gradient(179.9998548775837deg, #E7EDF3 0%, #3EAEE3 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
.set{
|
||||
position: absolute;
|
||||
left: 0;right: 0;
|
||||
bottom: 0;
|
||||
height: 14px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.set>div{
|
||||
margin: 0 0.125rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 4891760 */
|
||||
src: url('../font/iconfont.woff2?t=1744614833234') format('woff2'),
|
||||
url('../font/iconfont.woff?t=1744614833234') format('woff'),
|
||||
url('../font/iconfont.ttf?t=1744614833234') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 14px;
|
||||
font-style: normal;
|
||||
color: #FFFFFF;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-nav07:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.icon-nav06:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-nav08:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-nav05:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-l09:before {
|
||||
content: "\e605";
|
||||
}
|
||||
|
||||
.icon-l10:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
|
@ -0,0 +1,167 @@
|
|||
* {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
font-size: .175rem;
|
||||
color: #1ab1ff;
|
||||
}
|
||||
|
||||
*::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
background-color: #010a2c;
|
||||
}
|
||||
|
||||
.context {
|
||||
height: calc(100% - 1rem);
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
padding: .25rem;
|
||||
background-color: #010a2c;
|
||||
}
|
||||
|
||||
.site {
|
||||
flex: 1;
|
||||
padding: .125rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.block {
|
||||
height: calc((100% - .5rem) / 3);
|
||||
width: 100%;
|
||||
border: 2px solid #112A67;
|
||||
border-radius: .125rem;
|
||||
}
|
||||
|
||||
.block1 > .title,
|
||||
.block > .title {
|
||||
padding: .125rem 0;
|
||||
color: #00ffff;
|
||||
font-weight: 700;
|
||||
font-size: .25rem;
|
||||
text-align: center;
|
||||
line-height: .35rem;
|
||||
}
|
||||
|
||||
.block > .main {
|
||||
height: calc(100% - .35rem);
|
||||
width: 100%;
|
||||
padding: .25rem;
|
||||
}
|
||||
|
||||
.context > .right {
|
||||
/* padding-top: .25rem; */
|
||||
}
|
||||
|
||||
.block1 {
|
||||
height: calc((100% - .5rem) / 3 * 2 + .25rem);
|
||||
background-color: #010E35;
|
||||
border: 2px solid #112A67;
|
||||
border-radius: .125rem;
|
||||
}
|
||||
|
||||
.xc {
|
||||
background-image: url(../image/y01.png);
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 60% 90%;
|
||||
/* background-size: ; */
|
||||
}
|
||||
|
||||
.xc > .number {
|
||||
text-align: center;
|
||||
color: #1ab1ff;
|
||||
margin-top: .375rem;
|
||||
font-size: .625rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.gsxc {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
ul {
|
||||
width: 100%;
|
||||
padding: 0 .375rem;
|
||||
}
|
||||
|
||||
ul > li {
|
||||
padding: .1rem 0;
|
||||
width: 100%;
|
||||
list-style: none;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
ul > li > span {
|
||||
flex: 1;
|
||||
font-size: .325rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.info > ul > li > span:nth-child(2) {
|
||||
flex: 2.5;
|
||||
}
|
||||
|
||||
.gsxc ul > li > span:nth-child(2) {
|
||||
color: #00ffff;
|
||||
font-size: .35rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.context .right {
|
||||
flex: 2;
|
||||
}
|
||||
|
||||
.context > .right > .block1 > .top {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.context > .right > .block1 > .top > .info {
|
||||
width: 58%;
|
||||
padding: .75rem .5rem .25rem;
|
||||
}
|
||||
|
||||
.context > .right > .block1 > .top > .photo {
|
||||
width: 42%;
|
||||
padding: .25rem 1.5rem 1rem 1.875rem;
|
||||
}
|
||||
|
||||
.context > .right > .block1 > .top > .photo > img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
img {
|
||||
user-drag: none;
|
||||
user-select: none;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-drag: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none;
|
||||
}
|
||||
|
||||
#gwnum {
|
||||
padding: .125rem;
|
||||
}
|
||||
|
||||
.header {
|
||||
height: 1rem;
|
||||
background-image: url(../image/header-bg.png);
|
||||
background-position: center;
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
font-size: .5rem;
|
||||
line-height: 1rem;
|
||||
text-align: center;
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
Loading…
Reference in New Issue