Merge remote-tracking branch 'origin/deng' into deng
This commit is contained in:
@ -0,0 +1,194 @@
|
||||
package com.sipai.controller.administration;
|
||||
|
||||
import net.sf.json.JSONArray;
|
||||
import net.sf.json.JSONObject;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/administration/attendance")
|
||||
public class AttendanceController {
|
||||
private static final DateTimeFormatter DAY_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
||||
|
||||
@RequestMapping("/showList.do")
|
||||
public String showList(HttpServletRequest request, Model model) {
|
||||
return "/administration/attendanceRecordList";
|
||||
}
|
||||
|
||||
@RequestMapping("/getList.do")
|
||||
public ModelAndView getList(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "page") Integer page,
|
||||
@RequestParam(value = "rows") Integer rows,
|
||||
@RequestParam(value = "sort", required = false) String sort,
|
||||
@RequestParam(value = "order", required = false) String order) {
|
||||
String name = safe(request.getParameter("search_name"));
|
||||
String dept = safe(request.getParameter("search_dept"));
|
||||
String status = safe(request.getParameter("search_status"));
|
||||
String start = safe(request.getParameter("search_start"));
|
||||
String end = safe(request.getParameter("search_end"));
|
||||
|
||||
LocalDate startDate = parseDay(start);
|
||||
LocalDate endDate = parseDay(end);
|
||||
List<Map<String, Object>> allRows = buildMockRows();
|
||||
List<Map<String, Object>> filtered = new ArrayList<Map<String, Object>>();
|
||||
|
||||
for (Map<String, Object> item : allRows) {
|
||||
String employeeNo = str(item.get("employeeNo"));
|
||||
String employeeName = str(item.get("employeeName"));
|
||||
String deptName = str(item.get("deptName"));
|
||||
String st = str(item.get("status"));
|
||||
LocalDate day = parseDay(str(item.get("attendanceDate")));
|
||||
|
||||
if (!name.isEmpty()) {
|
||||
String q = name.toLowerCase();
|
||||
if (!employeeNo.toLowerCase().contains(q) && !employeeName.toLowerCase().contains(q)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!dept.isEmpty() && !dept.equals(deptName)) {
|
||||
continue;
|
||||
}
|
||||
if (!status.isEmpty() && !status.equals(st)) {
|
||||
continue;
|
||||
}
|
||||
if (startDate != null && day != null && day.isBefore(startDate)) {
|
||||
continue;
|
||||
}
|
||||
if (endDate != null && day != null && day.isAfter(endDate)) {
|
||||
continue;
|
||||
}
|
||||
filtered.add(item);
|
||||
}
|
||||
|
||||
sortRows(filtered, sort, order);
|
||||
int total = filtered.size();
|
||||
int from = Math.max(0, (page - 1) * rows);
|
||||
int to = Math.min(total, from + rows);
|
||||
List<Map<String, Object>> pageRows = from >= to ? Collections.<Map<String, Object>>emptyList() : filtered.subList(from, to);
|
||||
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("total", total);
|
||||
result.put("rows", JSONArray.fromObject(pageRows));
|
||||
model.addAttribute("result", result.toString());
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
private static void sortRows(List<Map<String, Object>> rows, String sort, String order) {
|
||||
final boolean asc = "asc".equalsIgnoreCase(order);
|
||||
final String sortField = (sort == null || sort.trim().isEmpty() || "id".equals(sort)) ? "attendanceDate" : sort;
|
||||
Collections.sort(rows, new Comparator<Map<String, Object>>() {
|
||||
@Override
|
||||
public int compare(Map<String, Object> a, Map<String, Object> b) {
|
||||
int cmp;
|
||||
if ("employeeNo".equals(sortField)) {
|
||||
cmp = str(a.get("employeeNo")).compareTo(str(b.get("employeeNo")));
|
||||
} else if ("employeeName".equals(sortField)) {
|
||||
cmp = str(a.get("employeeName")).compareTo(str(b.get("employeeName")));
|
||||
} else if ("deptName".equals(sortField)) {
|
||||
cmp = str(a.get("deptName")).compareTo(str(b.get("deptName")));
|
||||
} else if ("status".equals(sortField)) {
|
||||
cmp = str(a.get("status")).compareTo(str(b.get("status")));
|
||||
} else if ("checkInTime".equals(sortField)) {
|
||||
cmp = str(a.get("checkInTime")).compareTo(str(b.get("checkInTime")));
|
||||
} else {
|
||||
cmp = str(a.get("attendanceDate")).compareTo(str(b.get("attendanceDate")));
|
||||
}
|
||||
if (!asc) {
|
||||
cmp = -cmp;
|
||||
}
|
||||
if (cmp == 0) {
|
||||
return str(a.get("employeeNo")).compareTo(str(b.get("employeeNo")));
|
||||
}
|
||||
return cmp;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static List<Map<String, Object>> buildMockRows() {
|
||||
String[][] employees = {
|
||||
{"E0001", "张三", "生产部"},
|
||||
{"E0002", "李四", "设备部"},
|
||||
{"E0003", "王五", "品控部"},
|
||||
{"E0004", "赵六", "仓储部"},
|
||||
{"E0005", "钱七", "行政部"}
|
||||
};
|
||||
|
||||
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
|
||||
LocalDate today = LocalDate.now();
|
||||
int idSeq = 1;
|
||||
|
||||
for (int d = 0; d < 45; d++) {
|
||||
LocalDate day = today.minusDays(d);
|
||||
String dayStr = DAY_FMT.format(day);
|
||||
for (int i = 0; i < employees.length; i++) {
|
||||
String[] emp = employees[i];
|
||||
int flag = d + i;
|
||||
|
||||
String status = "正常";
|
||||
String checkIn = "08:55";
|
||||
String checkOut = "18:05";
|
||||
String workHours = "8.5";
|
||||
|
||||
if (flag % 19 == 0) {
|
||||
status = "缺卡";
|
||||
checkOut = "--";
|
||||
workHours = "4.2";
|
||||
} else if (flag % 11 == 0) {
|
||||
status = "迟到";
|
||||
checkIn = "09:" + (10 + (flag % 20));
|
||||
workHours = "7.8";
|
||||
} else if (flag % 13 == 0) {
|
||||
status = "早退";
|
||||
checkOut = "17:" + (20 + (flag % 30));
|
||||
workHours = "7.1";
|
||||
}
|
||||
|
||||
Map<String, Object> row = new LinkedHashMap<String, Object>();
|
||||
row.put("id", "mock-" + idSeq++);
|
||||
row.put("employeeNo", emp[0]);
|
||||
row.put("employeeName", emp[1]);
|
||||
row.put("deptName", emp[2]);
|
||||
row.put("attendanceDate", dayStr);
|
||||
row.put("checkInTime", checkIn);
|
||||
row.put("checkOutTime", checkOut);
|
||||
row.put("workHours", workHours);
|
||||
row.put("status", status);
|
||||
row.put("source", "第三方接口(MOCK)");
|
||||
rows.add(row);
|
||||
}
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
|
||||
private static String safe(String s) {
|
||||
return s == null ? "" : s.trim();
|
||||
}
|
||||
|
||||
private static String str(Object o) {
|
||||
return o == null ? "" : String.valueOf(o);
|
||||
}
|
||||
|
||||
private static LocalDate parseDay(String day) {
|
||||
if (day == null || day.trim().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return LocalDate.parse(day.trim(), DAY_FMT);
|
||||
} catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
package com.sipai.controller.jsyw;
|
||||
|
||||
import net.sf.json.JSONArray;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/jsyw/vehicleGate")
|
||||
public class VehicleGateController {
|
||||
|
||||
@RequestMapping("/showList.do")
|
||||
public String showList(HttpServletRequest request, Model model) {
|
||||
return "/jsyw/vehicleGateList";
|
||||
}
|
||||
|
||||
@RequestMapping("/getList.do")
|
||||
public ModelAndView getList(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
|
||||
@RequestParam(value = "rows", required = false, defaultValue = "10") Integer rows) {
|
||||
String plateNo = safeStr(request.getParameter("plateNo")).toUpperCase(Locale.ROOT);
|
||||
String passDate = safeStr(request.getParameter("passDate"));
|
||||
String direction = safeStr(request.getParameter("direction"));
|
||||
String status = safeStr(request.getParameter("status"));
|
||||
|
||||
List<Map<String, Object>> mockRows = buildMockRows();
|
||||
List<Map<String, Object>> filteredRows = new ArrayList<Map<String, Object>>();
|
||||
int inCount = 0;
|
||||
int outCount = 0;
|
||||
int abnormalCount = 0;
|
||||
|
||||
for (Map<String, Object> item : mockRows) {
|
||||
String itemPlateNo = safeStr(item.get("plateNo")).toUpperCase(Locale.ROOT);
|
||||
String itemPassTime = safeStr(item.get("passTime"));
|
||||
String itemDirection = safeStr(item.get("direction"));
|
||||
String itemStatus = safeStr(item.get("status"));
|
||||
|
||||
boolean matchPlate = plateNo.isEmpty() || itemPlateNo.contains(plateNo);
|
||||
boolean matchDate = passDate.isEmpty() || itemPassTime.startsWith(passDate);
|
||||
boolean matchDirection = direction.isEmpty() || direction.equals(itemDirection);
|
||||
boolean matchStatus = status.isEmpty() || status.equals(itemStatus);
|
||||
if (matchPlate && matchDate && matchDirection && matchStatus) {
|
||||
filteredRows.add(item);
|
||||
if ("IN".equals(itemDirection)) {
|
||||
inCount++;
|
||||
} else if ("OUT".equals(itemDirection)) {
|
||||
outCount++;
|
||||
}
|
||||
if ("ABNORMAL".equals(itemStatus)) {
|
||||
abnormalCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int total = filteredRows.size();
|
||||
int pageStart = Math.max((page - 1) * rows, 0);
|
||||
int pageEnd = Math.min(pageStart + rows, total);
|
||||
List<Map<String, Object>> pageRows = new ArrayList<Map<String, Object>>();
|
||||
if (pageStart < pageEnd) {
|
||||
pageRows = filteredRows.subList(pageStart, pageEnd);
|
||||
}
|
||||
|
||||
JSONArray rowsJson = JSONArray.fromObject(pageRows);
|
||||
String result = "{"
|
||||
+ "\"total\":" + total + ","
|
||||
+ "\"rows\":" + rowsJson + ","
|
||||
+ "\"summaryInCount\":" + inCount + ","
|
||||
+ "\"summaryOutCount\":" + outCount + ","
|
||||
+ "\"summaryInsideCount\":" + (inCount - outCount) + ","
|
||||
+ "\"summaryAbnormalCount\":" + abnormalCount
|
||||
+ "}";
|
||||
model.addAttribute("result", result);
|
||||
return new ModelAndView("result");
|
||||
}
|
||||
|
||||
private String safeStr(Object value) {
|
||||
return value == null ? "" : String.valueOf(value).trim();
|
||||
}
|
||||
|
||||
private List<Map<String, Object>> buildMockRows() {
|
||||
List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
|
||||
rows.add(buildRow("鲁A12345", "IN", "2026-03-03 08:12:21", "东门1号闸", "张三", "NORMAL", "自动识别放行"));
|
||||
rows.add(buildRow("鲁B66K88", "OUT", "2026-03-03 08:18:46", "东门1号闸", "李四", "NORMAL", "自动识别放行"));
|
||||
rows.add(buildRow("鲁C99871", "IN", "2026-03-03 08:27:19", "南门2号闸", "王五", "ABNORMAL", "车牌识别异常,人工放行"));
|
||||
rows.add(buildRow("鲁A77889", "IN", "2026-03-03 09:04:52", "北门1号闸", "赵六", "NORMAL", "自动识别放行"));
|
||||
rows.add(buildRow("鲁D22319", "OUT", "2026-03-03 09:19:11", "南门2号闸", "钱七", "NORMAL", "自动识别放行"));
|
||||
rows.add(buildRow("鲁E55120", "IN", "2026-03-03 10:03:35", "西门1号闸", "孙八", "NORMAL", "访客车辆"));
|
||||
rows.add(buildRow("鲁F90111", "OUT", "2026-03-03 10:16:05", "北门1号闸", "周九", "ABNORMAL", "未登记离场,值班确认"));
|
||||
rows.add(buildRow("鲁A0P365", "IN", "2026-03-03 10:42:30", "东门1号闸", "吴十", "NORMAL", "自动识别放行"));
|
||||
return rows;
|
||||
}
|
||||
|
||||
private Map<String, Object> buildRow(String plateNo, String direction, String passTime, String gateName,
|
||||
String driverName, String status, String note) {
|
||||
Map<String, Object> row = new HashMap<String, Object>();
|
||||
row.put("plateNo", plateNo);
|
||||
row.put("direction", direction);
|
||||
row.put("passTime", passTime);
|
||||
row.put("gateName", gateName);
|
||||
row.put("driverName", driverName);
|
||||
row.put("status", status);
|
||||
row.put("note", note);
|
||||
return row;
|
||||
}
|
||||
}
|
||||
@ -74,7 +74,7 @@ public class PipelineDataController {
|
||||
|
||||
@RequestMapping("/delete.do")
|
||||
public String dodelete(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "id") String id) {
|
||||
@RequestParam(value = "id") Long id) {
|
||||
int result = this.pipelineDataService.deleteById(id);
|
||||
model.addAttribute("result", result);
|
||||
return "result";
|
||||
@ -83,15 +83,14 @@ public class PipelineDataController {
|
||||
@RequestMapping("/deletes.do")
|
||||
public String dodeletes(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "ids") String ids) {
|
||||
ids = ids.replace(",", "','");
|
||||
int result = this.pipelineDataService.deleteByWhere("where id in ('" + ids + "')");
|
||||
int result = this.pipelineDataService.deleteByWhere("where id in (" + ids + ")");
|
||||
model.addAttribute("result", result);
|
||||
return "result";
|
||||
}
|
||||
|
||||
@RequestMapping("/edit.do")
|
||||
public String doedit(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "id") String id) {
|
||||
@RequestParam(value = "id") Long id) {
|
||||
PipelineData pipelineData = this.pipelineDataService.selectById(id);
|
||||
model.addAttribute("pipelineData", pipelineData);
|
||||
return "/pipeline/pipelineDataEdit";
|
||||
@ -109,7 +108,7 @@ public class PipelineDataController {
|
||||
|
||||
@RequestMapping("/view.do")
|
||||
public String doview(HttpServletRequest request, Model model,
|
||||
@RequestParam(value = "id") String id) {
|
||||
@RequestParam(value = "id") Long id) {
|
||||
PipelineData pipelineData = this.pipelineDataService.selectById(id);
|
||||
model.addAttribute("pipelineData", pipelineData);
|
||||
return "/pipeline/pipelineDataView";
|
||||
|
||||
@ -49,6 +49,14 @@ public class CommDaoImpl<T> implements CommDao<T> {
|
||||
T o = getSqlSession().selectOne(mappernamespace+"."+Thread.currentThread().getStackTrace()[1].getMethodName(), t);
|
||||
return o;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID查询(Long类型)
|
||||
*/
|
||||
public T selectByPrimaryKey(Long t){
|
||||
T o = getSqlSession().selectOne(mappernamespace+"."+Thread.currentThread().getStackTrace()[1].getMethodName(), t);
|
||||
return o;
|
||||
}
|
||||
/**
|
||||
* wxp为activiti测试修改
|
||||
* @param t
|
||||
@ -62,6 +70,13 @@ public class CommDaoImpl<T> implements CommDao<T> {
|
||||
return getSqlSession().delete(mappernamespace+"."+Thread.currentThread().getStackTrace()[1].getMethodName(), t);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID删除(Long类型)
|
||||
*/
|
||||
public int deleteByPrimaryKey(Long t) {
|
||||
return getSqlSession().delete(mappernamespace+"."+Thread.currentThread().getStackTrace()[1].getMethodName(), t);
|
||||
}
|
||||
|
||||
public int insert(T t){
|
||||
return getSqlSession().insert(mappernamespace+"."+Thread.currentThread().getStackTrace()[1].getMethodName(), t);
|
||||
}
|
||||
|
||||
@ -16,32 +16,30 @@
|
||||
id, pipeline_name, diameter_mm, length_m, start_burial_depth_m, end_burial_depth_m,
|
||||
start_ground_elevation_m, end_ground_elevation_m, pipeline_invert_elevation_m
|
||||
</sql>
|
||||
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
|
||||
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
|
||||
select
|
||||
<include refid="Base_Column_List" />
|
||||
from pipeline_data
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
from tb_pipeline_data
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
</select>
|
||||
<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
|
||||
delete from pipeline_data
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
|
||||
delete from tb_pipeline_data
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
</delete>
|
||||
<insert id="insert" parameterType="com.sipai.entity.pipeline.PipelineData" >
|
||||
insert into pipeline_data (id, pipeline_name, diameter_mm,
|
||||
<insert id="insert" parameterType="com.sipai.entity.pipeline.PipelineData" useGeneratedKeys="true" keyProperty="id" >
|
||||
insert into tb_pipeline_data (pipeline_name, diameter_mm,
|
||||
length_m, start_burial_depth_m, end_burial_depth_m,
|
||||
start_ground_elevation_m, end_ground_elevation_m,
|
||||
pipeline_invert_elevation_m)
|
||||
values (#{id,jdbcType=VARCHAR}, #{pipelineName,jdbcType=VARCHAR}, #{diameterMm,jdbcType=DECIMAL},
|
||||
values (#{pipelineName,jdbcType=VARCHAR}, #{diameterMm,jdbcType=DECIMAL},
|
||||
#{lengthM,jdbcType=DECIMAL}, #{startBurialDepthM,jdbcType=DECIMAL}, #{endBurialDepthM,jdbcType=DECIMAL},
|
||||
#{startGroundElevationM,jdbcType=DECIMAL}, #{endGroundElevationM,jdbcType=DECIMAL},
|
||||
#{pipelineInvertElevationM,jdbcType=DECIMAL})
|
||||
</insert>
|
||||
<insert id="insertSelective" parameterType="com.sipai.entity.pipeline.PipelineData" >
|
||||
insert into pipeline_data
|
||||
<insert id="insertSelective" parameterType="com.sipai.entity.pipeline.PipelineData" useGeneratedKeys="true" keyProperty="id" >
|
||||
insert into tb_pipeline_data
|
||||
<trim prefix="(" suffix=")" suffixOverrides="," >
|
||||
<if test="id != null" >
|
||||
id,
|
||||
</if>
|
||||
|
||||
<if test="pipelineName != null" >
|
||||
pipeline_name,
|
||||
</if>
|
||||
@ -68,9 +66,7 @@
|
||||
</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides="," >
|
||||
<if test="id != null" >
|
||||
#{id,jdbcType=VARCHAR},
|
||||
</if>
|
||||
|
||||
<if test="pipelineName != null" >
|
||||
#{pipelineName,jdbcType=VARCHAR},
|
||||
</if>
|
||||
@ -98,7 +94,7 @@
|
||||
</trim>
|
||||
</insert>
|
||||
<update id="updateByPrimaryKeySelective" parameterType="com.sipai.entity.pipeline.PipelineData" >
|
||||
update pipeline_data
|
||||
update tb_pipeline_data
|
||||
<set >
|
||||
<if test="pipelineName != null" >
|
||||
pipeline_name = #{pipelineName,jdbcType=VARCHAR},
|
||||
@ -125,10 +121,10 @@
|
||||
pipeline_invert_elevation_m = #{pipelineInvertElevationM,jdbcType=DECIMAL},
|
||||
</if>
|
||||
</set>
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
</update>
|
||||
<update id="updateByPrimaryKey" parameterType="com.sipai.entity.pipeline.PipelineData" >
|
||||
update pipeline_data
|
||||
update tb_pipeline_data
|
||||
set pipeline_name = #{pipelineName,jdbcType=VARCHAR},
|
||||
diameter_mm = #{diameterMm,jdbcType=DECIMAL},
|
||||
length_m = #{lengthM,jdbcType=DECIMAL},
|
||||
@ -137,17 +133,17 @@
|
||||
start_ground_elevation_m = #{startGroundElevationM,jdbcType=DECIMAL},
|
||||
end_ground_elevation_m = #{endGroundElevationM,jdbcType=DECIMAL},
|
||||
pipeline_invert_elevation_m = #{pipelineInvertElevationM,jdbcType=DECIMAL}
|
||||
where id = #{id,jdbcType=VARCHAR}
|
||||
where id = #{id,jdbcType=BIGINT}
|
||||
</update>
|
||||
<select id="selectListByWhere" parameterType="java.lang.String" resultMap="BaseResultMap">
|
||||
select
|
||||
<include refid="Base_Column_List" />
|
||||
from pipeline_data
|
||||
from tb_pipeline_data
|
||||
${where}
|
||||
</select>
|
||||
<delete id="deleteByWhere" parameterType="java.lang.String">
|
||||
delete from
|
||||
pipeline_data
|
||||
tb_pipeline_data
|
||||
${where}
|
||||
</delete>
|
||||
</mapper>
|
||||
|
||||
@ -19,11 +19,25 @@ public class PipelineDataService implements CommService<PipelineData> {
|
||||
return pipelineData;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID查询(Long类型)
|
||||
*/
|
||||
public PipelineData selectById(Long id) {
|
||||
return pipelineDataDao.selectByPrimaryKey(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int deleteById(String id) {
|
||||
return pipelineDataDao.deleteByPrimaryKey(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID删除(Long类型)
|
||||
*/
|
||||
public int deleteById(Long id) {
|
||||
return pipelineDataDao.deleteByPrimaryKey(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int save(PipelineData pipelineData) {
|
||||
return pipelineDataDao.insert(pipelineData);
|
||||
|
||||
@ -2,8 +2,8 @@ es.nodes=127.0.0.1
|
||||
#es.nodes=122.51.194.184
|
||||
es.host=9300
|
||||
#es.name=elastic
|
||||
es.name=my-application
|
||||
#es.name=elasticsearch
|
||||
#es.name=elasticsearch-sipaiis
|
||||
|
||||
es.name=my-application
|
||||
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
#redis<69><73><EFBFBD><EFBFBD>
|
||||
#redis.host=122.51.194.184
|
||||
redis.host=127.0.0.1
|
||||
redis.host=122.51.194.184
|
||||
# redis.host=127.0.0.1
|
||||
#<23><><EFBFBD><EFBFBD>single <20><>Ⱥcluster
|
||||
redis.mode=single
|
||||
#redis.port=26739
|
||||
redis.port=6379
|
||||
redis.port=26739
|
||||
# redis.port=6379
|
||||
redis.password=Aa112211
|
||||
redis.maxIdle=100
|
||||
redis.maxActive=300
|
||||
|
||||
39
src/main/webapp/CSS/module/jsyw-vehicle-gate.css
Normal file
39
src/main/webapp/CSS/module/jsyw-vehicle-gate.css
Normal file
@ -0,0 +1,39 @@
|
||||
.gate-summary-row .small-box {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.gate-summary-row .small-box .icon {
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
.gate-search-line {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.gate-input {
|
||||
width: 170px;
|
||||
margin-right: 8px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.gate-detail-line {
|
||||
line-height: 28px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.gate-detail-line span:first-child {
|
||||
color: #666;
|
||||
display: inline-block;
|
||||
width: 72px;
|
||||
}
|
||||
|
||||
.gate-photo-placeholder {
|
||||
margin-top: 12px;
|
||||
border: 1px dashed #d2d6de;
|
||||
background: #fafafa;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
line-height: 120px;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
@ -532,9 +532,9 @@ function initMenu() {
|
||||
// 注意:新菜单项可能直接是文本,也可能包含 i 标签
|
||||
var exists = false;
|
||||
$treeviewMenu.find('li').each(function() {
|
||||
if ($(this).text().indexOf('新源头GIS管理') > -1) {
|
||||
exists = true;
|
||||
}
|
||||
// if ($(this).text().indexOf('管道管理') > -1) {
|
||||
// exists = true;
|
||||
// }
|
||||
});
|
||||
|
||||
if (!exists) {
|
||||
@ -545,9 +545,6 @@ function initMenu() {
|
||||
var newMenuHtml = '';
|
||||
if (typeof addTab === 'function') {
|
||||
// 假设 addTab(id, name, url)
|
||||
// /jsp/pipeline/pipelineDataList.jsp
|
||||
// newMenuHtml = '<li><a href="javascript:void(0);" onclick="addTab(\'newSourceGIS\', \'新源头GIS管理\', \'/jsp/visual/newSourceGISPage.jsp\')"><i class="fa fa-map-marker"></i> 新源头GIS管理</a></li>';
|
||||
newMenuHtml = '<li><a href="javascript:void(0);" onclick="addTab(\'pipelineDataList\', \'管道管理\', \'/jsp/pipeline/pipelineDataList.jsp\')"><i class="fa fa-map-marker"></i> 管道管理</a></li>';
|
||||
} else {
|
||||
// 如果没有 addTab,尝试使用 iframe 加载或者直接跳转(但在框架内)
|
||||
// refreshPage 通常是 location.replace,这会刷新整个页面。
|
||||
@ -565,8 +562,6 @@ function initMenu() {
|
||||
// 所以我们应该优先使用 addTab。
|
||||
// 如果 addTab 未定义(可能在 index.jsp 中定义),我们尝试模拟它。
|
||||
// 由于 comm.js 被 index.jsp 引用,addTab 应该可用。
|
||||
// newMenuHtml = '<li><a href="javascript:void(0);" onclick="if(typeof addTab === \'function\'){addTab(\'newSourceGIS\', \'新源头GIS管理\', \'/jsp/visual/newSourceGISPage.jsp\');}else{refreshPage(\'' + ext.contextPath + '/jsp/visual/newSourceGISPage.jsp\');}"><i class="fa fa-map-marker"></i> 新源头GIS管理</a></li>';
|
||||
newMenuHtml = '<li><a href="javascript:void(0);" onclick="if(typeof addTab === \'function\'){addTab(\'pipelineDataList\', \'管道管理\', \'/jsp/pipeline/pipelineDataList.jsp\');}else{refreshPage(\'' + ext.contextPath + '/jsp/pipeline/pipelineDataList.jsp\');}"><i class="fa fa-map-marker"></i> 管道管理</a></li>';
|
||||
}
|
||||
$treeviewMenu.append(newMenuHtml);
|
||||
|
||||
|
||||
161
src/main/webapp/JS/jsyw/vehicleGateList.js
Normal file
161
src/main/webapp/JS/jsyw/vehicleGateList.js
Normal file
@ -0,0 +1,161 @@
|
||||
function getDirectionText(direction) {
|
||||
return direction === "IN" ? "进闸" : "出闸";
|
||||
}
|
||||
|
||||
function getStatusText(status) {
|
||||
return status === "ABNORMAL" ? "异常" : "正常";
|
||||
}
|
||||
|
||||
function getDirectionLabel(direction) {
|
||||
if (direction === "IN") {
|
||||
return "<span class='label label-success'>进闸</span>";
|
||||
}
|
||||
return "<span class='label label-info'>出闸</span>";
|
||||
}
|
||||
|
||||
function getStatusLabel(status) {
|
||||
if (status === "ABNORMAL") {
|
||||
return "<span class='label label-danger'>异常</span>";
|
||||
}
|
||||
return "<span class='label label-primary'>正常</span>";
|
||||
}
|
||||
|
||||
function renderSummaryByResponse(res) {
|
||||
$("#summaryInCount").text(res.summaryInCount || 0);
|
||||
$("#summaryOutCount").text(res.summaryOutCount || 0);
|
||||
$("#summaryInsideCount").text(res.summaryInsideCount || 0);
|
||||
$("#summaryAbnormalCount").text(res.summaryAbnormalCount || 0);
|
||||
}
|
||||
|
||||
function initGateTable() {
|
||||
$("#gateTable").bootstrapTable({
|
||||
url: ext.contextPath + "/jsyw/vehicleGate/getList.do",
|
||||
method: "post",
|
||||
cache: false,
|
||||
striped: true,
|
||||
pagination: true,
|
||||
pageList: [10, 20, 50],
|
||||
pageSize: 10,
|
||||
pageNumber: 1,
|
||||
sidePagination: "server",
|
||||
queryParams: function (params) {
|
||||
return {
|
||||
rows: params.limit,
|
||||
page: params.offset / params.limit + 1,
|
||||
sort: params.sort,
|
||||
order: params.order,
|
||||
plateNo: $.trim($("#search_plateNo").val()),
|
||||
passDate: $.trim($("#search_passDate").val()),
|
||||
direction: $("#search_direction").val(),
|
||||
status: $("#search_status").val()
|
||||
};
|
||||
},
|
||||
responseHandler: function (res) {
|
||||
renderSummaryByResponse(res || {});
|
||||
return {
|
||||
total: (res && res.total) ? res.total : 0,
|
||||
rows: (res && res.rows) ? res.rows : []
|
||||
};
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
field: "plateNo",
|
||||
title: "车牌号",
|
||||
align: "center",
|
||||
valign: "middle"
|
||||
},
|
||||
{
|
||||
field: "direction",
|
||||
title: "通行方向",
|
||||
align: "center",
|
||||
valign: "middle",
|
||||
formatter: function (value) {
|
||||
return getDirectionLabel(value);
|
||||
}
|
||||
},
|
||||
{
|
||||
field: "passTime",
|
||||
title: "通行时间",
|
||||
align: "center",
|
||||
valign: "middle"
|
||||
},
|
||||
{
|
||||
field: "gateName",
|
||||
title: "闸机",
|
||||
align: "center",
|
||||
valign: "middle"
|
||||
},
|
||||
{
|
||||
field: "driverName",
|
||||
title: "司机",
|
||||
align: "center",
|
||||
valign: "middle"
|
||||
},
|
||||
{
|
||||
field: "status",
|
||||
title: "状态",
|
||||
align: "center",
|
||||
valign: "middle",
|
||||
formatter: function (value) {
|
||||
return getStatusLabel(value);
|
||||
}
|
||||
},
|
||||
{
|
||||
field: "note",
|
||||
title: "备注",
|
||||
align: "center",
|
||||
valign: "middle"
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
align: "center",
|
||||
valign: "middle",
|
||||
width: 100,
|
||||
formatter: function (value, row, index) {
|
||||
return "<button class='btn btn-default btn-sm' onclick='showGateDetail(" + index + ")'><i class='fa fa-eye'></i> 查看</button>";
|
||||
}
|
||||
}
|
||||
],
|
||||
onLoadSuccess: function () {
|
||||
adjustBootstrapTableView("gateTable");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function searchGateRecords() {
|
||||
$("#gateTable").bootstrapTable("refresh", {pageNumber: 1});
|
||||
}
|
||||
|
||||
function resetGateSearch() {
|
||||
$("#search_plateNo").val("");
|
||||
$("#search_passDate").val("");
|
||||
$("#search_direction").val("");
|
||||
$("#search_status").val("");
|
||||
$("#gateTable").bootstrapTable("refresh", {pageNumber: 1});
|
||||
}
|
||||
|
||||
function showGateDetail(index) {
|
||||
var pageRows = $("#gateTable").bootstrapTable("getData") || [];
|
||||
var row = pageRows[index];
|
||||
if (!row) {
|
||||
return;
|
||||
}
|
||||
$("#detail_plateNo").text(row.plateNo || "");
|
||||
$("#detail_direction").text(getDirectionText(row.direction || ""));
|
||||
$("#detail_passTime").text(row.passTime || "");
|
||||
$("#detail_gateName").text(row.gateName || "");
|
||||
$("#detail_driverName").text(row.driverName || "");
|
||||
$("#detail_status").text(getStatusText(row.status || ""));
|
||||
$("#detail_note").text(row.note || "");
|
||||
$("#gateDetailModal").modal("show");
|
||||
}
|
||||
|
||||
$(function () {
|
||||
$("#search_passDate").datepicker({
|
||||
autoclose: true,
|
||||
language: "zh-CN",
|
||||
format: "yyyy-mm-dd"
|
||||
});
|
||||
initGateTable();
|
||||
});
|
||||
|
||||
BIN
src/main/webapp/WEB-INF/lib/sqljdbc4-4.0.jar
Normal file
BIN
src/main/webapp/WEB-INF/lib/sqljdbc4-4.0.jar
Normal file
Binary file not shown.
201
src/main/webapp/jsp/administration/attendanceRecordList.jsp
Normal file
201
src/main/webapp/jsp/administration/attendanceRecordList.jsp
Normal file
@ -0,0 +1,201 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8"%>
|
||||
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
|
||||
<%@ page import="com.sipai.entity.base.ServerObject"%>
|
||||
<%@ taglib uri="http://www.springsecurity.org/jsp" prefix="security"%>
|
||||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title><%= ServerObject.atttable.get("TOPTITLE")%></title>
|
||||
<jsp:include page="/jsp/inc.jsp"></jsp:include>
|
||||
|
||||
<script type="text/javascript">
|
||||
var dosearch = function () {
|
||||
$("#table").bootstrapTable('refresh', {pageNumber: 1});
|
||||
};
|
||||
|
||||
var resetSearch = function () {
|
||||
$('#search_name').val('');
|
||||
$('#search_dept').val('');
|
||||
$('#search_status').val('');
|
||||
$('#search_start').val('');
|
||||
$('#search_end').val('');
|
||||
dosearch();
|
||||
};
|
||||
|
||||
var statusFormatter = function (value) {
|
||||
if (value === '正常') {
|
||||
return '<span class="label label-success">正常</span>';
|
||||
}
|
||||
if (value === '迟到') {
|
||||
return '<span class="label label-warning">迟到</span>';
|
||||
}
|
||||
if (value === '早退') {
|
||||
return '<span class="label label-primary">早退</span>';
|
||||
}
|
||||
return '<span class="label label-danger">' + value + '</span>';
|
||||
};
|
||||
|
||||
$(function () {
|
||||
$('#search_start,#search_end').datepicker({
|
||||
format: 'yyyy-mm-dd',
|
||||
autoclose: true,
|
||||
language: 'zh-CN',
|
||||
clearBtn: true
|
||||
});
|
||||
|
||||
$('#table').bootstrapTable({
|
||||
url: ext.contextPath + '/administration/attendance/getList.do',
|
||||
cache: false,
|
||||
striped: true,
|
||||
pagination: true,
|
||||
pageList: [10, 20, 50],
|
||||
pageSize: 20,
|
||||
pageNumber: 1,
|
||||
sidePagination: 'server',
|
||||
sortName: 'attendanceDate',
|
||||
sortOrder: 'desc',
|
||||
queryParams: function (params) {
|
||||
return {
|
||||
rows: params.limit,
|
||||
page: params.offset / params.limit + 1,
|
||||
sort: params.sort,
|
||||
order: params.order,
|
||||
search_name: $('#search_name').val(),
|
||||
search_dept: $('#search_dept').val(),
|
||||
search_status: $('#search_status').val(),
|
||||
search_start: $('#search_start').val(),
|
||||
search_end: $('#search_end').val()
|
||||
};
|
||||
},
|
||||
columns: [{
|
||||
field: 'employeeNo',
|
||||
title: '工号',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'employeeName',
|
||||
title: '姓名',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'deptName',
|
||||
title: '部门',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'attendanceDate',
|
||||
title: '日期',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'checkInTime',
|
||||
title: '上班打卡',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'checkOutTime',
|
||||
title: '下班打卡',
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'workHours',
|
||||
title: '工时(小时)',
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}, {
|
||||
field: 'status',
|
||||
title: '状态',
|
||||
sortable: true,
|
||||
align: 'center',
|
||||
valign: 'middle',
|
||||
formatter: statusFormatter
|
||||
}, {
|
||||
field: 'source',
|
||||
title: '数据来源',
|
||||
align: 'center',
|
||||
valign: 'middle'
|
||||
}],
|
||||
onLoadSuccess: function () {
|
||||
adjustBootstrapTableView("table");
|
||||
},
|
||||
onLoadError: function () {
|
||||
console.info("加载考勤数据失败");
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body onload="initMenu()" class="hold-transition ${cu.themeclass} sidebar-mini">
|
||||
<div class="wrapper">
|
||||
<div class="content-wrapper">
|
||||
<section class="content-header">
|
||||
<h1 id="head_title"></h1>
|
||||
<ol class="breadcrumb">
|
||||
<li><a id='head_firstlevel' href="#"><i class="fa fa-dashboard"></i> </a></li>
|
||||
</ol>
|
||||
</section>
|
||||
<section class="content container-fluid">
|
||||
<div id="mainAlertdiv"></div>
|
||||
<div id="subDiv"></div>
|
||||
|
||||
<div class="box box-primary">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">员工考勤记录</h3>
|
||||
<span class="text-muted" style="margin-left: 10px;">当前为第三方考勤接口模拟数据(MOCK)</span>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="form-inline" style="margin-bottom: 10px;">
|
||||
<div class="form-group" style="margin-right: 8px;">
|
||||
<input type="text" id="search_name" class="form-control input-sm" style="width: 180px;"
|
||||
placeholder="姓名/工号">
|
||||
</div>
|
||||
<div class="form-group" style="margin-right: 8px;">
|
||||
<select id="search_dept" class="form-control input-sm" style="width: 120px;">
|
||||
<option value="">全部部门</option>
|
||||
<option value="生产部">生产部</option>
|
||||
<option value="设备部">设备部</option>
|
||||
<option value="品控部">品控部</option>
|
||||
<option value="仓储部">仓储部</option>
|
||||
<option value="行政部">行政部</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" style="margin-right: 8px;">
|
||||
<select id="search_status" class="form-control input-sm" style="width: 100px;">
|
||||
<option value="">全部状态</option>
|
||||
<option value="正常">正常</option>
|
||||
<option value="迟到">迟到</option>
|
||||
<option value="早退">早退</option>
|
||||
<option value="缺卡">缺卡</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" style="margin-right: 8px;">
|
||||
<input type="text" id="search_start" class="form-control input-sm" style="width: 120px;"
|
||||
placeholder="开始日期">
|
||||
</div>
|
||||
<div class="form-group" style="margin-right: 8px;">
|
||||
<input type="text" id="search_end" class="form-control input-sm" style="width: 120px;"
|
||||
placeholder="结束日期">
|
||||
</div>
|
||||
<div class="btn-group btn-group-sm">
|
||||
<button type="button" class="btn btn-default" onclick="dosearch();"><i
|
||||
class="fa fa-search"></i> 查询
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" onclick="resetSearch();"><i
|
||||
class="fa fa-undo"></i> 重置
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<table id="table"></table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@ -1,11 +1,19 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>水厂大屏展示</title>
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/JS/echarts3.0.js"></script>
|
||||
<!-- <script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script>
|
||||
<script type="text/javascript" src="../../JS/echarts3.0.js"></script> -->
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -17,54 +25,595 @@
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
background-image: url('<%=request.getContextPath()%>/IMG/screen1-1.png');
|
||||
/* background-image: url('../../IMG/screen1-1.png'); */
|
||||
/* background-image: url("../../IMG/screen1.png"); */
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
}
|
||||
/* Specific Position for Data 6040 */
|
||||
.val-6040 {
|
||||
.slqs {
|
||||
position: absolute;
|
||||
top: 335px;
|
||||
left: 209px;
|
||||
width: 121px;
|
||||
height: 62px;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
font-family: 'Gilroy', 'DIN Alternate', 'Arial Narrow', sans-serif;
|
||||
font-family: "Gilroy", "DIN Alternate", "Arial Narrow", sans-serif;
|
||||
font-weight: 900;
|
||||
font-size: 50px;
|
||||
z-index: 10;
|
||||
text-align: center;
|
||||
line-height: 62px;
|
||||
}
|
||||
.val-4197 {
|
||||
.slqs-jinri {
|
||||
top: 335px;
|
||||
left: 209px;
|
||||
}
|
||||
.slqs-zuori {
|
||||
top: 335px;
|
||||
left: 592px;
|
||||
width: fit-content;
|
||||
height: fit-content;
|
||||
display: inline-flex;
|
||||
place-content: flex-start;
|
||||
place-items: flex-end;
|
||||
gap: 8px;
|
||||
}
|
||||
.val-12356 {
|
||||
.slqs-benyue {
|
||||
top: 335px;
|
||||
left: 975px;
|
||||
width: fit-content;
|
||||
height: fit-content;
|
||||
display: inline-flex;
|
||||
place-content: flex-start;
|
||||
place-items: flex-end;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.ncl-val {
|
||||
position: absolute;
|
||||
width: 76px;
|
||||
height: 36px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: right;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
font-family: Gilroy;
|
||||
font-weight: 500;
|
||||
font-size: 36px;
|
||||
line-height: 36px;
|
||||
}
|
||||
.ncl-val1 {
|
||||
top: 1168px;
|
||||
left: 318px;
|
||||
}
|
||||
.ncl-val2 {
|
||||
top: 1168px;
|
||||
left: 653px;
|
||||
}
|
||||
.ncl-val3 {
|
||||
top: 1168px;
|
||||
left: 1023px;
|
||||
}
|
||||
.ncl2 {
|
||||
position: absolute;
|
||||
top: 1310px;
|
||||
left: 66px;
|
||||
width: 1077px;
|
||||
height: 440px;
|
||||
}
|
||||
#ncl-chart {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.seven-days-sl {
|
||||
position: absolute;
|
||||
top: 591px;
|
||||
left: 66px;
|
||||
width: 1077px;
|
||||
height: 400px;
|
||||
}
|
||||
#seven-days-chart {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.quality-table {
|
||||
position: absolute;
|
||||
top: 630px;
|
||||
left: 1183px;
|
||||
width: 975px;
|
||||
}
|
||||
.quality-table table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
color: #7ef3ff;
|
||||
font-size: 27px;
|
||||
text-align: center;
|
||||
background: transparent;
|
||||
}
|
||||
.quality-table th,
|
||||
.quality-table td {
|
||||
border: 1px solid rgba(0, 163, 255, 0.4);
|
||||
padding: 16px 23px;
|
||||
}
|
||||
.quality-table th {
|
||||
color: #ffffff;
|
||||
font-size: 27px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.quality-table td:first-child {
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
padding-left: 12px;
|
||||
}
|
||||
.quality-table td:last-child {
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
.quality-chart {
|
||||
position: absolute;
|
||||
top: 1380px;
|
||||
left: 1183px;
|
||||
width: 975px;
|
||||
height: 370px;
|
||||
}
|
||||
#quality-chart {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* 药耗 */
|
||||
.yaohao {
|
||||
position: absolute;
|
||||
top: 343px;
|
||||
width: 94px;
|
||||
height: 56px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: right;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
font-family: Gilroy;
|
||||
font-weight: 700;
|
||||
font-size: 40px;
|
||||
line-height: 56px;
|
||||
}
|
||||
.yaohao1 {
|
||||
left: 1317px;
|
||||
}
|
||||
.yaohao2 {
|
||||
left: 1652px;
|
||||
}
|
||||
.yaohao3 {
|
||||
left: 2056px;
|
||||
}
|
||||
|
||||
.Middle3 {
|
||||
width: 2100px;
|
||||
position: absolute;
|
||||
top: 300px;
|
||||
left: 2700px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<!-- <div class="val-6040">6040</div>
|
||||
<div class="val-4197">4197</div>
|
||||
<div class="val-12356">12356</div> -->
|
||||
<div class="left">
|
||||
<div>
|
||||
<div class="slqs slqs-jinri">6040</div>
|
||||
<div class="slqs slqs-zuori">4197</div>
|
||||
<div class="slqs slqs-benyue">12356</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<!-- 七日水量 -->
|
||||
<div class="seven-days-sl">
|
||||
<div id="seven-days-chart"></div>
|
||||
</div>
|
||||
|
||||
<!-- 泥处理指标 -->
|
||||
<div class="ncl">
|
||||
<div class="ncl1">
|
||||
<div class="ncl-val ncl-val1">0</div>
|
||||
<div class="ncl-val ncl-val2">200</div>
|
||||
<div class="ncl-val ncl-val3">4.89</div>
|
||||
</div>
|
||||
<div class="ncl2">
|
||||
<div id="ncl-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Middle">
|
||||
<div class="Middle1">
|
||||
<!-- 药耗 -->
|
||||
<div>
|
||||
<div class="yaohao yaohao1">300</div>
|
||||
<div class="yaohao yaohao2">200</div>
|
||||
<div class="yaohao yaohao3">1</div>
|
||||
</div>
|
||||
|
||||
<!-- 质量指标 表格 -->
|
||||
<div class="quality-table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>参数</th>
|
||||
<th>当前值</th>
|
||||
<th>平均值</th>
|
||||
<th>最高</th>
|
||||
<th>最低</th>
|
||||
<th>指标</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>COD (mg/L)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TP (mg/L)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>NH3–N (mg/L)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TN (mg/L)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>PH (mg/L)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SS</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>温度(℃)</td>
|
||||
<td>13.186</td>
|
||||
<td>12.996</td>
|
||||
<td>14.666</td>
|
||||
<td>11.92</td>
|
||||
<td>0.000–20.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="quality-chart">
|
||||
<div id="quality-chart"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="Middle2">
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
|
||||
<!-- 中间图表 -->
|
||||
<div class="Middle3">
|
||||
<img src="../../IMG/monitor.png" style="width: 100%; height: 100%" />
|
||||
</div>
|
||||
|
||||
<div class="Middle4">
|
||||
<!-- 进水 -->
|
||||
<div></div>
|
||||
|
||||
<!-- 出水 -->
|
||||
<div></div>
|
||||
|
||||
<div></div>
|
||||
|
||||
<div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 视频 -->
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
<script>
|
||||
$(function () {
|
||||
var chartDom = document.getElementById("seven-days-chart");
|
||||
if (!chartDom) return;
|
||||
var myChart = echarts.init(chartDom);
|
||||
var dataAxis = [
|
||||
"11-10",
|
||||
"11-11",
|
||||
"11-12",
|
||||
"11-13",
|
||||
"11-14",
|
||||
"11-15",
|
||||
"11-16",
|
||||
"11-17",
|
||||
];
|
||||
var data = [5200, 4300, 4200, 4300, 6800, 5200, 7400, 5600];
|
||||
var option = {
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ["处理水量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: dataAxis,
|
||||
axisLine: {
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
max: 10000,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 18,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
dataZoom: [{ type: "inside" }],
|
||||
series: [
|
||||
{
|
||||
name: "处理水量",
|
||||
type: "bar",
|
||||
barWidth: 20,
|
||||
data: data,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#46F2FF" },
|
||||
{ offset: 1, color: "#0B4DB5" },
|
||||
]),
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)",
|
||||
shadowBlur: 10,
|
||||
},
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#6af8ff" },
|
||||
{ offset: 1, color: "#1560d6" },
|
||||
]),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: "bar",
|
||||
barGap: "-100%",
|
||||
data: (function () {
|
||||
var yMax = 10000;
|
||||
var shadow = [];
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
shadow.push(yMax);
|
||||
}
|
||||
return shadow;
|
||||
})(),
|
||||
itemStyle: { normal: { color: "rgba(0,0,0,0.05)" } },
|
||||
silent: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
var zoomSize = 6;
|
||||
myChart.on("click", function (params) {
|
||||
var startIndex = Math.max(
|
||||
params.dataIndex - Math.floor(zoomSize / 2),
|
||||
0,
|
||||
);
|
||||
var endIndex = Math.min(
|
||||
params.dataIndex + Math.floor(zoomSize / 2),
|
||||
data.length - 1,
|
||||
);
|
||||
myChart.dispatchAction({
|
||||
type: "dataZoom",
|
||||
startValue: dataAxis[startIndex],
|
||||
endValue: dataAxis[endIndex],
|
||||
});
|
||||
});
|
||||
var nclDom = document.getElementById("ncl-chart");
|
||||
if (nclDom) {
|
||||
var nclChart = echarts.init(nclDom, "dark");
|
||||
var nclData = [120, 160, 90, 250, 170, 340, 280, 330, 80, 260];
|
||||
var nclOption = {
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ["实际小时排泥量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: [
|
||||
"2:00",
|
||||
"4:00",
|
||||
"6:00",
|
||||
"8:00",
|
||||
"10:00",
|
||||
"12:00",
|
||||
"14:00",
|
||||
"16:00",
|
||||
"18:00",
|
||||
"20:00",
|
||||
],
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
max: 500,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "实际小时排泥量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: "none",
|
||||
lineStyle: { normal: { width: 2 } },
|
||||
itemStyle: { normal: { color: "#46F2FF" } },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "rgba(70, 242, 255, 0.45)" },
|
||||
{ offset: 1, color: "rgba(11, 77, 181, 0.05)" },
|
||||
]),
|
||||
opacity: 1,
|
||||
},
|
||||
},
|
||||
data: nclData,
|
||||
},
|
||||
],
|
||||
};
|
||||
nclChart.setOption(nclOption);
|
||||
window.addEventListener("resize", function () {
|
||||
nclChart.resize();
|
||||
});
|
||||
}
|
||||
window.addEventListener("resize", function () {
|
||||
myChart.resize();
|
||||
});
|
||||
var qualityDom = document.getElementById("quality-chart");
|
||||
if (qualityDom) {
|
||||
var qualityChart = echarts.init(qualityDom);
|
||||
var qualityData = [8, 13, 9, 14, 21, 14, 18];
|
||||
var qualityOption = {
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ["水质量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: ["11", "12", "13", "14", "15", "16", "17"],
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
max: 25,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "水质量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: "none",
|
||||
lineStyle: { normal: { width: 2 } },
|
||||
itemStyle: { normal: { color: "#46F2FF" } },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "rgba(70, 242, 255, 0.45)" },
|
||||
{ offset: 1, color: "rgba(11, 77, 181, 0.05)" },
|
||||
]),
|
||||
opacity: 1,
|
||||
},
|
||||
},
|
||||
data: qualityData,
|
||||
},
|
||||
],
|
||||
};
|
||||
qualityChart.setOption(qualityOption);
|
||||
window.addEventListener("resize", function () {
|
||||
qualityChart.resize();
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -1,15 +1,20 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>区域管线大屏展示</title>
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/JS/echarts3.0.js"></script>
|
||||
<!-- <script type="text/javascript" src="../../node_modules/jquery/dist/jquery.min.js"></script> -->
|
||||
<!-- <script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script> -->
|
||||
<!-- <script type="text/javascript" src="../../JS/echarts3.0.js"></script> -->
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -20,7 +25,7 @@
|
||||
.screen-container {
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
/* background-image: url('../../IMG/screen2.png'); */
|
||||
/* background-image: url("../../IMG/screen2.png"); */
|
||||
background-image: url('<%=request.getContextPath()%>/IMG/screen2.png');
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
@ -38,9 +43,15 @@
|
||||
font-size: 60px;
|
||||
}
|
||||
|
||||
.card-1 { left: 1910px; }
|
||||
.card-2 { left: 2832px; }
|
||||
.card-3 { left: 3754px; }
|
||||
.card-1 {
|
||||
left: 1910px;
|
||||
}
|
||||
.card-2 {
|
||||
left: 2832px;
|
||||
}
|
||||
.card-3 {
|
||||
left: 3754px;
|
||||
}
|
||||
|
||||
.ring-chart-wrapper {
|
||||
position: absolute;
|
||||
@ -96,7 +107,12 @@
|
||||
box-sizing: border-box;
|
||||
/* background: rgba(27, 126, 242, 0.6); */
|
||||
}
|
||||
#ring-chart-content, #pie-chart-content-2, #gauge-chart-content-3, #gauge-chart-content-4, #bar-chart-content-5, #bar-chart-content-6 {
|
||||
#ring-chart-content,
|
||||
#pie-chart-content-2,
|
||||
#gauge-chart-content-3,
|
||||
#gauge-chart-content-4,
|
||||
#bar-chart-content-5,
|
||||
#bar-chart-content-6 {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
@ -104,8 +120,8 @@
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<div class="stat-card card-1">53829.5</div>
|
||||
<div class="stat-card card-2">2495</div>
|
||||
@ -143,117 +159,153 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$(document).ready(function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
initPieChart();
|
||||
initPieChart2();
|
||||
initGaugeChart('gauge-chart-content-3', 53829.5);
|
||||
initGaugeChart('gauge-chart-content-4', 12345.6);
|
||||
initBarChart('bar-chart-content-5', [3000, 4500, 1500, 5000, 23000, 1500, 15000, 3000, 4000, 5000, 2000, 1000, 500, 2563, 4000]);
|
||||
initBarChart('bar-chart-content-6', [2000, 3000, 1000, 4000, 18000, 1000, 12000, 2000, 3000, 4000, 1500, 800, 400, 2000, 3000]);
|
||||
initGaugeChart("gauge-chart-content-3", 53829.5);
|
||||
initGaugeChart("gauge-chart-content-4", 12345.6);
|
||||
initBarChart(
|
||||
"bar-chart-content-5",
|
||||
[
|
||||
3000, 4500, 1500, 5000, 23000, 1500, 15000, 3000, 4000, 5000, 2000,
|
||||
1000, 500, 2563, 4000,
|
||||
],
|
||||
);
|
||||
initBarChart(
|
||||
"bar-chart-content-6",
|
||||
[
|
||||
2000, 3000, 1000, 4000, 18000, 1000, 12000, 2000, 3000, 4000, 1500,
|
||||
800, 400, 2000, 3000,
|
||||
],
|
||||
);
|
||||
|
||||
// Double click to toggle fullscreen
|
||||
$('body').on('dblclick', function() {
|
||||
$("body").on("dblclick", function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
});
|
||||
});
|
||||
|
||||
function initPieChart() {
|
||||
var chartDom = document.getElementById('ring-chart-content');
|
||||
var chartDom = document.getElementById("ring-chart-content");
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option = {
|
||||
color: [
|
||||
'#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc',
|
||||
'#00d4ff', '#ffb700', '#2bff89', '#915eff', '#ff7f00'
|
||||
"#5470c6",
|
||||
"#91cc75",
|
||||
"#fac858",
|
||||
"#ee6666",
|
||||
"#73c0de",
|
||||
"#3ba272",
|
||||
"#fc8452",
|
||||
"#9a60b4",
|
||||
"#ea7ccc",
|
||||
"#00d4ff",
|
||||
"#ffb700",
|
||||
"#2bff89",
|
||||
"#915eff",
|
||||
"#ff7f00",
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '管线类型统计',
|
||||
type: 'pie',
|
||||
radius: '55%',
|
||||
center: ['50%', '50%'],
|
||||
name: "管线类型统计",
|
||||
type: "pie",
|
||||
radius: "55%",
|
||||
center: ["50%", "50%"],
|
||||
avoidLabelOverlap: true,
|
||||
label: {
|
||||
show: true,
|
||||
position: 'outside',
|
||||
formatter: '{b}',
|
||||
position: "outside",
|
||||
formatter: "{b}",
|
||||
fontSize: 14,
|
||||
lineHeight: 20,
|
||||
align: 'left'
|
||||
align: "left",
|
||||
},
|
||||
labelLine: {
|
||||
show: true,
|
||||
length: 20,
|
||||
length2: 30,
|
||||
lineStyle: {
|
||||
type: 'solid'
|
||||
}
|
||||
type: "solid",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 335, name: 'II级钢筋混凝土管 承插接口' },
|
||||
{ value: 310, name: '焊接钢管 焊接接口' },
|
||||
{ value: 274, name: '高密度聚乙烯双壁波纹管' },
|
||||
{ value: 235, name: '聚乙烯PE管' },
|
||||
{ value: 200, name: 'II级钢筋混凝土管' },
|
||||
{ value: 180, name: '高密度聚乙烯缠绕管' },
|
||||
{ value: 150, name: '焊接钢管 焊接连接' },
|
||||
{ value: 140, name: '高密度聚乙烯中空壁缠绕管' },
|
||||
{ value: 130, name: '钢筋混凝土管' },
|
||||
{ value: 110, name: '球墨铸铁管' },
|
||||
{ value: 100, name: '预应力钢筒混凝土管' }
|
||||
]
|
||||
}
|
||||
]
|
||||
{ value: 335, name: "II级钢筋混凝土管 承插接口" },
|
||||
{ value: 310, name: "焊接钢管 焊接接口" },
|
||||
{ value: 274, name: "高密度聚乙烯双壁波纹管" },
|
||||
{ value: 235, name: "聚乙烯PE管" },
|
||||
{ value: 200, name: "II级钢筋混凝土管" },
|
||||
{ value: 180, name: "高密度聚乙烯缠绕管" },
|
||||
{ value: 150, name: "焊接钢管 焊接连接" },
|
||||
{ value: 140, name: "高密度聚乙烯中空壁缠绕管" },
|
||||
{ value: 130, name: "钢筋混凝土管" },
|
||||
{ value: 110, name: "球墨铸铁管" },
|
||||
{ value: 100, name: "预应力钢筒混凝土管" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
|
||||
function initPieChart2() {
|
||||
var chartDom = document.getElementById('pie-chart-content-2');
|
||||
var chartDom = document.getElementById("pie-chart-content-2");
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option = {
|
||||
color: [
|
||||
'#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc',
|
||||
'#00d4ff', '#ffb700', '#2bff89', '#915eff', '#ff7f00'
|
||||
"#5470c6",
|
||||
"#91cc75",
|
||||
"#fac858",
|
||||
"#ee6666",
|
||||
"#73c0de",
|
||||
"#3ba272",
|
||||
"#fc8452",
|
||||
"#9a60b4",
|
||||
"#ea7ccc",
|
||||
"#00d4ff",
|
||||
"#ffb700",
|
||||
"#2bff89",
|
||||
"#915eff",
|
||||
"#ff7f00",
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '管线类型统计2',
|
||||
type: 'pie',
|
||||
radius: '55%',
|
||||
center: ['50%', '50%'],
|
||||
name: "管线类型统计2",
|
||||
type: "pie",
|
||||
radius: "55%",
|
||||
center: ["50%", "50%"],
|
||||
avoidLabelOverlap: true,
|
||||
label: {
|
||||
show: true,
|
||||
position: 'outside',
|
||||
formatter: '{b}',
|
||||
position: "outside",
|
||||
formatter: "{b}",
|
||||
fontSize: 14,
|
||||
lineHeight: 20,
|
||||
align: 'left'
|
||||
align: "left",
|
||||
},
|
||||
labelLine: {
|
||||
show: true,
|
||||
length: 20,
|
||||
length2: 30,
|
||||
lineStyle: {
|
||||
type: 'solid'
|
||||
}
|
||||
type: "solid",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 335, name: 'II级钢筋混凝土管 承插接口' },
|
||||
{ value: 310, name: '焊接钢管 焊接接口' },
|
||||
{ value: 274, name: '高密度聚乙烯双壁波纹管' },
|
||||
{ value: 235, name: '聚乙烯PE管' },
|
||||
{ value: 200, name: 'II级钢筋混凝土管' },
|
||||
{ value: 180, name: '高密度聚乙烯缠绕管' },
|
||||
{ value: 150, name: '焊接钢管 焊接连接' },
|
||||
{ value: 140, name: '高密度聚乙烯中空壁缠绕管' },
|
||||
{ value: 130, name: '钢筋混凝土管' },
|
||||
{ value: 110, name: '球墨铸铁管' },
|
||||
{ value: 100, name: '预应力钢筒混凝土管' }
|
||||
]
|
||||
}
|
||||
]
|
||||
{ value: 335, name: "II级钢筋混凝土管 承插接口" },
|
||||
{ value: 310, name: "焊接钢管 焊接接口" },
|
||||
{ value: 274, name: "高密度聚乙烯双壁波纹管" },
|
||||
{ value: 235, name: "聚乙烯PE管" },
|
||||
{ value: 200, name: "II级钢筋混凝土管" },
|
||||
{ value: 180, name: "高密度聚乙烯缠绕管" },
|
||||
{ value: 150, name: "焊接钢管 焊接连接" },
|
||||
{ value: 140, name: "高密度聚乙烯中空壁缠绕管" },
|
||||
{ value: 130, name: "钢筋混凝土管" },
|
||||
{ value: 110, name: "球墨铸铁管" },
|
||||
{ value: 100, name: "预应力钢筒混凝土管" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
@ -264,58 +316,65 @@
|
||||
var option = {
|
||||
series: [
|
||||
{
|
||||
type: 'gauge',
|
||||
type: "gauge",
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 0,
|
||||
max: 300,
|
||||
splitNumber: 6,
|
||||
radius: '90%',
|
||||
center: ['50%', '70%'],
|
||||
radius: "90%",
|
||||
center: ["50%", "70%"],
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
width: 40,
|
||||
color: [[1, new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: 'rgba(65, 108, 243, 1)' },
|
||||
{ offset: 1, color: 'rgba(0, 68, 160, 1)' }
|
||||
])]]
|
||||
}
|
||||
color: [
|
||||
[
|
||||
1,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "rgba(65, 108, 243, 1)" },
|
||||
{ offset: 1, color: "rgba(0, 68, 160, 1)" },
|
||||
]),
|
||||
],
|
||||
],
|
||||
},
|
||||
},
|
||||
pointer: {
|
||||
show: true,
|
||||
length: '60%',
|
||||
length: "60%",
|
||||
width: 6,
|
||||
itemStyle: {
|
||||
color: '#00d4ff'
|
||||
}
|
||||
color: "#00d4ff",
|
||||
},
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
show: false,
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
show: false,
|
||||
},
|
||||
axisLabel: {
|
||||
color: '#00d4ff',
|
||||
color: "#00d4ff",
|
||||
fontSize: 14,
|
||||
distance: -60,
|
||||
formatter: function (value) {
|
||||
return value;
|
||||
}
|
||||
},
|
||||
},
|
||||
detail: {
|
||||
show: true,
|
||||
offsetCenter: [0, '40%'],
|
||||
offsetCenter: [0, "40%"],
|
||||
fontSize: 30,
|
||||
color: '#fff',
|
||||
formatter: '{value} m'
|
||||
color: "#fff",
|
||||
formatter: "{value} m",
|
||||
},
|
||||
data: [{
|
||||
data: [
|
||||
{
|
||||
value: value,
|
||||
name: ''
|
||||
}]
|
||||
}
|
||||
]
|
||||
name: "",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// Adjust value if it exceeds max for visual representation (optional)
|
||||
@ -325,7 +384,7 @@
|
||||
// Let's set the gauge pointer to max if value > 300
|
||||
if (value > 300) {
|
||||
option.series[0].data[0].value = 300; // Pointer at max
|
||||
option.series[0].detail.formatter = value + ' m'; // Show real value
|
||||
option.series[0].detail.formatter = value + " m"; // Show real value
|
||||
}
|
||||
|
||||
myChart.setOption(option);
|
||||
@ -341,122 +400,175 @@
|
||||
|
||||
var option = {
|
||||
grid: {
|
||||
top: '20%',
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
containLabel: true
|
||||
top: "20%",
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
containLabel: true,
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis'
|
||||
trigger: "axis",
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15'],
|
||||
type: "category",
|
||||
data: [
|
||||
"01",
|
||||
"02",
|
||||
"03",
|
||||
"04",
|
||||
"05",
|
||||
"06",
|
||||
"07",
|
||||
"08",
|
||||
"09",
|
||||
"10",
|
||||
"11",
|
||||
"12",
|
||||
"13",
|
||||
"14",
|
||||
"15",
|
||||
],
|
||||
axisLine: {
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.3)'
|
||||
}
|
||||
// lineStyle: {
|
||||
// color: 'rgba(255, 255, 255, 0.3)'
|
||||
// }
|
||||
},
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: 14
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
// axisTick: {
|
||||
// show: false
|
||||
// }
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '长度(m)',
|
||||
nameTextStyle: {
|
||||
color: '#fff',
|
||||
padding: [0, 0, 0, 20]
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
type: "value",
|
||||
name: "长度(m)",
|
||||
// nameTextStyle: {
|
||||
// color: '#fff',
|
||||
// padding: [0, 0, 0, 20]
|
||||
// },
|
||||
// axisLabel: {
|
||||
// color: '#fff',
|
||||
// fontSize: 14
|
||||
// },
|
||||
// splitLine: {
|
||||
// show: true,
|
||||
// lineStyle: {
|
||||
// color: 'rgba(255, 255, 255, 0.1)'
|
||||
// }
|
||||
// },
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: 14
|
||||
color: "#B7C9E2",
|
||||
fontSize: 18,
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)'
|
||||
}
|
||||
}
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
dataZoom: [{ type: "inside" }],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: 'bar',
|
||||
barWidth: '40%',
|
||||
type: "bar",
|
||||
barWidth: "40%",
|
||||
// itemStyle: {
|
||||
// color: '#FF9900',
|
||||
// borderColor: '#FF9900',
|
||||
// borderWidth: 1
|
||||
// },
|
||||
itemStyle: {
|
||||
color: '#FF9900',
|
||||
borderColor: '#FF9900',
|
||||
borderWidth: 1
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#46F2FF" },
|
||||
{ offset: 1, color: "#0B4DB5" },
|
||||
]),
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)",
|
||||
shadowBlur: 10,
|
||||
},
|
||||
markPoint: {
|
||||
symbol: 'pin',
|
||||
symbolSize: 50,
|
||||
label: {
|
||||
show: true,
|
||||
color: '#fff',
|
||||
fontSize: 12
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: '#FF9900'
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#6af8ff" },
|
||||
{ offset: 1, color: "#1560d6" },
|
||||
]),
|
||||
},
|
||||
data: [
|
||||
{ type: 'max', name: 'Max' },
|
||||
{ type: 'min', name: 'Min' }
|
||||
]
|
||||
},
|
||||
markLine: {
|
||||
symbol: 'none',
|
||||
data: [
|
||||
{ yAxis: 2563.31, name: 'Average' }
|
||||
// markPoint: {
|
||||
// symbol: 'pin',
|
||||
// symbolSize: 50,
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#fff',
|
||||
// fontSize: 12
|
||||
// },
|
||||
// itemStyle: {
|
||||
// color: '#FF9900'
|
||||
// },
|
||||
// data: [
|
||||
// { type: 'max', name: 'Max' },
|
||||
// { type: 'min', name: 'Min' }
|
||||
// ]
|
||||
// },
|
||||
// markLine: {
|
||||
// symbol: 'none',
|
||||
// data: [
|
||||
// { yAxis: 2563.31, name: 'Average' }
|
||||
// ],
|
||||
// label: {
|
||||
// show: true,
|
||||
// position: 'end',
|
||||
// formatter: '{c}',
|
||||
// color: '#FF9900'
|
||||
// },
|
||||
// lineStyle: {
|
||||
// type: 'dotted',
|
||||
// color: '#FF9900'
|
||||
// }
|
||||
// }
|
||||
},
|
||||
// {
|
||||
// type: 'bar',
|
||||
// barGap: '-100%',
|
||||
// data: (function(){ var yMax = 10000; var shadow=[]; for (var i=0;i<data.length;i++){shadow.push(yMax);} return shadow; })(),
|
||||
// itemStyle: { normal: { color: 'rgba(0,0,0,0.05)' } },
|
||||
// silent: true
|
||||
// }
|
||||
],
|
||||
label: {
|
||||
show: true,
|
||||
position: 'end',
|
||||
formatter: '{c}',
|
||||
color: '#FF9900'
|
||||
},
|
||||
lineStyle: {
|
||||
type: 'dotted',
|
||||
color: '#FF9900'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
|
||||
function launchIntoFullscreen(element) {
|
||||
if(element.requestFullscreen) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if(element.mozRequestFullScreen) {
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if(element.webkitRequestFullscreen) {
|
||||
} else if (element.webkitRequestFullscreen) {
|
||||
element.webkitRequestFullscreen();
|
||||
} else if(element.msRequestFullscreen) {
|
||||
} else if (element.msRequestFullscreen) {
|
||||
element.msRequestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
function exitFullscreen() {
|
||||
if(document.exitFullscreen) {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if(document.mozCancelFullScreen) {
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if(document.webkitExitFullscreen) {
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -1,15 +1,20 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>排污户大屏展示</title>
|
||||
<!-- <script type="text/javascript" src="../../node_modules/jquery/dist/jquery.min.js"></script> -->
|
||||
<!-- <script type="text/javascript" src="../../JS/echarts3.0.js"></script> -->
|
||||
<!-- <script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script>
|
||||
<script type="text/javascript" src="../../JS/echarts3.0.js"></script> -->
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/JS/echarts3.0.js"></script>
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -22,7 +27,7 @@
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
background-image: url('<%=request.getContextPath()%>/IMG/screen3.png');
|
||||
/* background-image: url('../../IMG/screen3.png'); */
|
||||
/* background-image: url("../../IMG/screen3.png"); */
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
@ -66,7 +71,7 @@
|
||||
font-size: 48px;
|
||||
font-weight: bold;
|
||||
color: #00eaff;
|
||||
font-family: 'DIN Alternate', sans-serif;
|
||||
font-family: "DIN Alternate", sans-serif;
|
||||
}
|
||||
|
||||
.stat-unit {
|
||||
@ -199,7 +204,7 @@
|
||||
color: #ffaa00;
|
||||
font-weight: bold;
|
||||
margin-left: 15px;
|
||||
font-family: 'DIN Alternate', sans-serif;
|
||||
font-family: "DIN Alternate", sans-serif;
|
||||
}
|
||||
|
||||
.photo-section {
|
||||
@ -265,43 +270,70 @@
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<div class="rank-module-container">
|
||||
<!-- Statistics -->
|
||||
<div class="stats-header">
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">辖区排污企业总数</div>
|
||||
<div class="stat-value" id="totalCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" id="totalCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">已接入监控</div>
|
||||
<div class="stat-value" style="color: #00ff00;" id="connectedCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" style="color: #00ff00" id="connectedCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">正在接入中</div>
|
||||
<div class="stat-value" style="color: #ffaa00;" id="connectingCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" style="color: #ffaa00" id="connectingCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Ranking List -->
|
||||
<div class="ranking-list-wrapper" style="flex: 1; display: flex; flex-direction: column; overflow: hidden;">
|
||||
<div id="chartRanking" style="flex: 1; width: 100%;"></div>
|
||||
<div
|
||||
class="ranking-list-wrapper"
|
||||
style="
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
"
|
||||
>
|
||||
<div id="chartRanking" style="flex: 1; width: 100%"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Left Side Detail Module -->
|
||||
<div class="detail-module-container">
|
||||
<div class="enterprise-detail-header" id="detailTitle">企业名称加载中...</div>
|
||||
<div class="enterprise-detail-header" id="detailTitle">
|
||||
企业名称加载中...
|
||||
</div>
|
||||
<div class="detail-content">
|
||||
<div class="info-section">
|
||||
<div class="info-item">污水特性: <span id="sewageType">--</span></div>
|
||||
<div class="info-item">当前排污量: <span id="dischargeVolume">--</span></div>
|
||||
<div class="info-item">接入状态: <span id="connectionStatus">--</span></div>
|
||||
<div class="info-item">
|
||||
污水特性: <span id="sewageType">--</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
当前排污量: <span id="dischargeVolume">--</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
接入状态: <span id="connectionStatus">--</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="photo-section">
|
||||
<img id="sitePhoto" src="<%=request.getContextPath()%>/IMG/login/company.png" alt="现场照片" style="width:100%; height:100%; object-fit: cover;">
|
||||
<img
|
||||
id="sitePhoto"
|
||||
src="<%=request.getContextPath()%>/IMG/login/company.png"
|
||||
alt="现场照片"
|
||||
style="width: 100%; height: 100%; object-fit: cover"
|
||||
/>
|
||||
<div class="photo-label">现场监控画面</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -319,7 +351,7 @@
|
||||
|
||||
<!-- New Bar Chart Area -->
|
||||
<div class="new-bar-chart-container">
|
||||
<div id="newBarChart" style="width: 100%; height: 100%;"></div>
|
||||
<div id="newBarChart" style="width: 100%; height: 100%"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -335,34 +367,34 @@
|
||||
var currentFocusIndex = 0;
|
||||
var rotationTimer = null;
|
||||
|
||||
$(document).ready(function() {
|
||||
$(document).ready(function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
initData();
|
||||
|
||||
// Double click to toggle fullscreen
|
||||
$('body').on('dblclick', function() {
|
||||
$("body").on("dblclick", function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
});
|
||||
});
|
||||
|
||||
function launchIntoFullscreen(element) {
|
||||
if(element.requestFullscreen) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if(element.mozRequestFullScreen) {
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if(element.webkitRequestFullscreen) {
|
||||
} else if (element.webkitRequestFullscreen) {
|
||||
element.webkitRequestFullscreen();
|
||||
} else if(element.msRequestFullscreen) {
|
||||
} else if (element.msRequestFullscreen) {
|
||||
element.msRequestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
function exitFullscreen() {
|
||||
if(document.exitFullscreen) {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if(document.mozCancelFullScreen) {
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if(document.webkitExitFullscreen) {
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
}
|
||||
@ -372,40 +404,50 @@
|
||||
var total = 158;
|
||||
var connected = 124;
|
||||
var connecting = 34;
|
||||
$('#totalCount').html(total + '<span class="stat-unit">家</span>');
|
||||
$('#connectedCount').html(connected + '<span class="stat-unit">家</span>');
|
||||
$('#connectingCount').html(connecting + '<span class="stat-unit">家</span>');
|
||||
$("#totalCount").html(total + '<span class="stat-unit">家</span>');
|
||||
$("#connectedCount").html(
|
||||
connected + '<span class="stat-unit">家</span>',
|
||||
);
|
||||
$("#connectingCount").html(
|
||||
connecting + '<span class="stat-unit">家</span>',
|
||||
);
|
||||
|
||||
// Generate Enterprises with Details
|
||||
var enterprises = [];
|
||||
var sewageTypes = ['化学需氧量', '氨氮', '总磷', '重金属', '酸碱废水'];
|
||||
var connectionStatuses = ['已接入', '接入中'];
|
||||
var sewageTypes = ["化学需氧量", "氨氮", "总磷", "重金属", "酸碱废水"];
|
||||
var connectionStatuses = ["已接入", "接入中"];
|
||||
|
||||
for (var i = 1; i <= 50; i++) {
|
||||
var val = Math.floor(Math.random() * 10000) + 500;
|
||||
enterprises.push({
|
||||
id: i,
|
||||
name: '企业-' + i,
|
||||
name: "企业-" + i,
|
||||
value: val,
|
||||
// Details
|
||||
sewageType: sewageTypes[Math.floor(Math.random() * sewageTypes.length)],
|
||||
connectionStatus: connectionStatuses[Math.floor(Math.random() * connectionStatuses.length)],
|
||||
indicator: val > 8000 ? '超级' : '普通',
|
||||
photo: '<%=request.getContextPath()%>/IMG/login/company.png', // Placeholder
|
||||
sewageType:
|
||||
sewageTypes[Math.floor(Math.random() * sewageTypes.length)],
|
||||
connectionStatus:
|
||||
connectionStatuses[
|
||||
Math.floor(Math.random() * connectionStatuses.length)
|
||||
],
|
||||
indicator: val > 8000 ? "超级" : "普通",
|
||||
photo: "<%=request.getContextPath()%>/IMG/login/company.png", // Placeholder
|
||||
// Map Coordinates (Relative % in map container)
|
||||
x: Math.random() * 90 + 5, // 5% to 95%
|
||||
y: Math.random() * 80 + 10, // 10% to 90%
|
||||
// History Data
|
||||
instantHistory: generateHistoryData(72), // 3 days * 24 hours
|
||||
cumulativeHistory: generateHistoryData(14) // 14 days
|
||||
cumulativeHistory: generateHistoryData(14), // 14 days
|
||||
});
|
||||
}
|
||||
allEnterprises = enterprises;
|
||||
|
||||
// Init Charts
|
||||
myChartInstant = echarts.init(document.getElementById('chartInstant'));
|
||||
myChartCumulative = echarts.init(document.getElementById('chartCumulative'));
|
||||
myChartRanking = echarts.init(document.getElementById('chartRanking'));
|
||||
myChartInstant = echarts.init(document.getElementById("chartInstant"));
|
||||
myChartCumulative = echarts.init(
|
||||
document.getElementById("chartCumulative"),
|
||||
);
|
||||
myChartRanking = echarts.init(document.getElementById("chartRanking"));
|
||||
// myNewBarChart = echarts.init(document.getElementById('newBarChart'));
|
||||
|
||||
// renderNewBarChart();
|
||||
@ -426,7 +468,7 @@
|
||||
|
||||
function generateHistoryData(count) {
|
||||
var data = [];
|
||||
for(var k=0; k<count; k++) {
|
||||
for (var k = 0; k < count; k++) {
|
||||
data.push(Math.floor(Math.random() * 500) + 50);
|
||||
}
|
||||
return data;
|
||||
@ -434,10 +476,14 @@
|
||||
|
||||
function updateSortedData(enterprises) {
|
||||
// Sort Descending for Max
|
||||
currentMaxData = [...enterprises].sort((a, b) => b.value - a.value).slice(0, 10);
|
||||
currentMaxData = [...enterprises]
|
||||
.sort((a, b) => b.value - a.value)
|
||||
.slice(0, 10);
|
||||
|
||||
// Sort Ascending for Min
|
||||
currentMinData = [...enterprises].sort((a, b) => a.value - b.value).slice(0, 10);
|
||||
currentMinData = [...enterprises]
|
||||
.sort((a, b) => a.value - b.value)
|
||||
.slice(0, 10);
|
||||
}
|
||||
|
||||
function renderRankingChart() {
|
||||
@ -454,13 +500,18 @@
|
||||
value: item.value,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
|
||||
offset: 0, color: '#ff5500'
|
||||
}, {
|
||||
offset: 1, color: '#ffb700'
|
||||
}])
|
||||
}
|
||||
}
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#ff5500",
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#ffb700",
|
||||
},
|
||||
]),
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@ -471,194 +522,262 @@
|
||||
value: item.value,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
|
||||
offset: 0, color: '#00aa00'
|
||||
}, {
|
||||
offset: 1, color: '#00ff00'
|
||||
}])
|
||||
}
|
||||
}
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#00aa00",
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#00ff00",
|
||||
},
|
||||
]),
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
var option = {
|
||||
title: [{
|
||||
text: '近30日排污量 TOP 10 (最大)',
|
||||
left: '25%',
|
||||
top: '2%',
|
||||
textAlign: 'center',
|
||||
textStyle: { color: '#ffffff', fontSize: 30, fontWeight: 'bold' }
|
||||
}, {
|
||||
text: '近30日排污量 TOP 10 (最小)',
|
||||
left: '75%',
|
||||
top: '2%',
|
||||
textAlign: 'center',
|
||||
textStyle: { color: '#ffffff', fontSize: 30, fontWeight: 'bold' }
|
||||
}],
|
||||
grid: [{
|
||||
top: '12%',
|
||||
left: '2%',
|
||||
right: '52%',
|
||||
bottom: '5%',
|
||||
containLabel: true
|
||||
}, {
|
||||
top: '12%',
|
||||
left: '52%',
|
||||
right: '2%',
|
||||
bottom: '5%',
|
||||
containLabel: true
|
||||
}],
|
||||
xAxis: [{
|
||||
type: 'value',
|
||||
title: [
|
||||
{
|
||||
text: "近30日排污量 TOP 10 (最大)",
|
||||
left: "25%",
|
||||
top: "2%",
|
||||
textAlign: "center",
|
||||
textStyle: { color: "#ffffff", fontSize: 30, fontWeight: "bold" },
|
||||
},
|
||||
{
|
||||
text: "近30日排污量 TOP 10 (最小)",
|
||||
left: "75%",
|
||||
top: "2%",
|
||||
textAlign: "center",
|
||||
textStyle: { color: "#ffffff", fontSize: 30, fontWeight: "bold" },
|
||||
},
|
||||
],
|
||||
grid: [
|
||||
{
|
||||
top: "12%",
|
||||
left: "2%",
|
||||
right: "52%",
|
||||
bottom: "5%",
|
||||
containLabel: true,
|
||||
},
|
||||
{
|
||||
top: "12%",
|
||||
left: "52%",
|
||||
right: "2%",
|
||||
bottom: "5%",
|
||||
containLabel: true,
|
||||
},
|
||||
],
|
||||
xAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false,
|
||||
gridIndex: 0
|
||||
}, {
|
||||
type: 'value',
|
||||
gridIndex: 0,
|
||||
},
|
||||
{
|
||||
type: "value",
|
||||
show: false,
|
||||
gridIndex: 1
|
||||
}],
|
||||
yAxis: [{
|
||||
type: 'category',
|
||||
gridIndex: 1,
|
||||
},
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: maxNames,
|
||||
inverse: true,
|
||||
axisLabel: { color: '#fff', fontSize: 20 },
|
||||
axisLabel: { color: "#fff", fontSize: 20 },
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
gridIndex: 0
|
||||
}, {
|
||||
type: 'category',
|
||||
gridIndex: 0,
|
||||
},
|
||||
{
|
||||
type: "category",
|
||||
data: minNames,
|
||||
inverse: true,
|
||||
axisLabel: { color: '#fff', fontSize: 20 },
|
||||
axisLabel: { color: "#fff", fontSize: 20 },
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
gridIndex: 1
|
||||
}],
|
||||
series: [{
|
||||
name: 'Max',
|
||||
type: 'bar',
|
||||
gridIndex: 1,
|
||||
},
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: "Max",
|
||||
type: "bar",
|
||||
xAxisIndex: 0,
|
||||
yAxisIndex: 0,
|
||||
data: maxValues,
|
||||
barWidth: 45,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)',
|
||||
barBorderRadius: [0, 22, 22, 0]
|
||||
color: "rgba(255, 255, 255, 0.1)",
|
||||
barBorderRadius: [0, 22, 22, 0],
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'right',
|
||||
textStyle: { color: '#ffffff', fontSize: 20 },
|
||||
formatter: '{c}'
|
||||
}
|
||||
position: "right",
|
||||
textStyle: { color: "#ffffff", fontSize: 20 },
|
||||
formatter: "{c}",
|
||||
},
|
||||
},
|
||||
itemStyle: { normal: { barBorderRadius: [0, 22, 22, 0] } },
|
||||
}, {
|
||||
name: 'Min',
|
||||
type: 'bar',
|
||||
},
|
||||
{
|
||||
name: "Min",
|
||||
type: "bar",
|
||||
xAxisIndex: 1,
|
||||
yAxisIndex: 1,
|
||||
data: minValues,
|
||||
barWidth: 45,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)',
|
||||
barBorderRadius: [0, 22, 22, 0]
|
||||
color: "rgba(255, 255, 255, 0.1)",
|
||||
barBorderRadius: [0, 22, 22, 0],
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'right',
|
||||
textStyle: { color: '#ffffff', fontSize: 20 },
|
||||
formatter: '{c}'
|
||||
}
|
||||
position: "right",
|
||||
textStyle: { color: "#ffffff", fontSize: 20 },
|
||||
formatter: "{c}",
|
||||
},
|
||||
},
|
||||
itemStyle: { normal: { barBorderRadius: [0, 22, 22, 0] } },
|
||||
}]
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
myChartRanking.setOption(option);
|
||||
}
|
||||
|
||||
function renderMapPoints() {
|
||||
var html = '';
|
||||
var html = "";
|
||||
allEnterprises.forEach((item) => {
|
||||
html += '<div class="map-point ' + (item.value > 8000 ? 'super' : '') + '" id="point-' + item.id + '" style="left:' + item.x + '%; top:' + item.y + '%;" onclick="handleMapClick(' + item.id + ')">';
|
||||
html +=
|
||||
'<div class="map-point ' +
|
||||
(item.value > 8000 ? "super" : "") +
|
||||
'" id="point-' +
|
||||
item.id +
|
||||
'" style="left:' +
|
||||
item.x +
|
||||
"%; top:" +
|
||||
item.y +
|
||||
'%;" onclick="handleMapClick(' +
|
||||
item.id +
|
||||
')">';
|
||||
html += '<div class="map-tooltip" onclick="event.stopPropagation()">'; // Stop prop to prevent point click
|
||||
html += '<div class="map-tooltip-row" style="font-weight:bold; color:#00eaff; font-size:22px; margin-bottom:10px; cursor:pointer;" onclick="handleMapClick(' + item.id + ')">' + item.name + '</div>';
|
||||
html += '<div class="map-tooltip-row"><span class="map-tooltip-label">瞬时流量:</span><span class="clickable-val" onclick="showHistoryModal(\'instant\', ' + item.id + ')">' + item.value + ' m³/h</span></div>';
|
||||
html += '<div class="map-tooltip-row"><span class="map-tooltip-label">累计流量:</span><span class="clickable-val" onclick="showHistoryModal(\'cumulative\', ' + item.id + ')">' + (item.value * 24) + ' m³</span></div>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html +=
|
||||
'<div class="map-tooltip-row" style="font-weight:bold; color:#00eaff; font-size:22px; margin-bottom:10px; cursor:pointer;" onclick="handleMapClick(' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.name +
|
||||
"</div>";
|
||||
html +=
|
||||
'<div class="map-tooltip-row"><span class="map-tooltip-label">瞬时流量:</span><span class="clickable-val" onclick="showHistoryModal(\'instant\', ' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.value +
|
||||
" m³/h</span></div>";
|
||||
html +=
|
||||
'<div class="map-tooltip-row"><span class="map-tooltip-label">累计流量:</span><span class="clickable-val" onclick="showHistoryModal(\'cumulative\', ' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.value * 24 +
|
||||
" m³</span></div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
});
|
||||
$('#mapContainer').html(html);
|
||||
$("#mapContainer").html(html);
|
||||
}
|
||||
|
||||
function closeModal() {
|
||||
$('#historyModal').fadeOut();
|
||||
$("#historyModal").fadeOut();
|
||||
}
|
||||
|
||||
var modalChartInstance = null;
|
||||
|
||||
function showHistoryModal(type, id) {
|
||||
var ent = allEnterprises.find(e => e.id === id);
|
||||
if(!ent) return;
|
||||
var ent = allEnterprises.find((e) => e.id === id);
|
||||
if (!ent) return;
|
||||
|
||||
$('#historyModal').css('display', 'flex').hide().fadeIn();
|
||||
$("#historyModal").css("display", "flex").hide().fadeIn();
|
||||
|
||||
if(modalChartInstance) {
|
||||
if (modalChartInstance) {
|
||||
modalChartInstance.dispose();
|
||||
}
|
||||
modalChartInstance = echarts.init(document.getElementById('modalChart'));
|
||||
modalChartInstance = echarts.init(
|
||||
document.getElementById("modalChart"),
|
||||
);
|
||||
|
||||
var title = (type === 'instant' ? '瞬时排污量' : '累计流量') + '历史曲线 - ' + ent.name;
|
||||
$('#modalTitle').text(title);
|
||||
var title =
|
||||
(type === "instant" ? "瞬时排污量" : "累计流量") +
|
||||
"历史曲线 - " +
|
||||
ent.name;
|
||||
$("#modalTitle").text(title);
|
||||
|
||||
var xData, yData, color;
|
||||
if(type === 'instant') {
|
||||
if (type === "instant") {
|
||||
xData = [];
|
||||
for(var i=0; i<72; i++) xData.push(i + 'h');
|
||||
for (var i = 0; i < 72; i++) xData.push(i + "h");
|
||||
yData = ent.instantHistory;
|
||||
color = '#ffaa00';
|
||||
color = "#ffaa00";
|
||||
} else {
|
||||
xData = [];
|
||||
for(var j=0; j<14; j++) xData.push('D' + (j+1));
|
||||
for (var j = 0; j < 14; j++) xData.push("D" + (j + 1));
|
||||
yData = ent.cumulativeHistory;
|
||||
color = '#00eaff';
|
||||
color = "#00eaff";
|
||||
}
|
||||
|
||||
var option = {
|
||||
tooltip: { trigger: 'axis', backgroundColor: 'rgba(0,0,0,0.8)', textStyle: {color: '#fff'} },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '10%', containLabel: true },
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
backgroundColor: "rgba(0,0,0,0.8)",
|
||||
textStyle: { color: "#fff" },
|
||||
},
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "10%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLabel: { color: '#fff', fontSize: 16 },
|
||||
axisLine: { lineStyle: { color: '#00eaff' } }
|
||||
axisLabel: { color: "#fff", fontSize: 16 },
|
||||
axisLine: { lineStyle: { color: "#00eaff" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#fff', fontSize: 16 },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#fff", fontSize: 16 },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: type === 'instant' ? '瞬时流量' : '累计流量',
|
||||
type: 'line',
|
||||
series: [
|
||||
{
|
||||
name: type === "instant" ? "瞬时流量" : "累计流量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
data: yData,
|
||||
lineStyle: { width: 3, color: color },
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0, color: color
|
||||
}, {
|
||||
offset: 1, color: 'rgba(0,0,0,0)'
|
||||
}])
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{
|
||||
offset: 0,
|
||||
color: color,
|
||||
},
|
||||
itemStyle: { color: color }
|
||||
}]
|
||||
{
|
||||
offset: 1,
|
||||
color: "rgba(0,0,0,0)",
|
||||
},
|
||||
]),
|
||||
},
|
||||
itemStyle: { color: color },
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
modalChartInstance.setOption(option);
|
||||
@ -666,7 +785,7 @@
|
||||
|
||||
function handleMapClick(id) {
|
||||
// Find if this enterprise is in currentMaxData
|
||||
var index = currentMaxData.findIndex(e => e.id === id);
|
||||
var index = currentMaxData.findIndex((e) => e.id === id);
|
||||
if (index !== -1) {
|
||||
currentFocusIndex = index;
|
||||
updateDetailView();
|
||||
@ -678,32 +797,34 @@
|
||||
// If clicked item is not in Top 10, we can still show it in Detail View
|
||||
// But rotation logic might overwrite it next tick.
|
||||
// Let's just show it temporarily.
|
||||
var enterprise = allEnterprises.find(e => e.id === id);
|
||||
if(enterprise) {
|
||||
var enterprise = allEnterprises.find((e) => e.id === id);
|
||||
if (enterprise) {
|
||||
renderDetailContent(enterprise);
|
||||
highlightMapPoint(enterprise.id);
|
||||
// Clear ranking highlight since it's not in the list (visually)
|
||||
$('.ranking-row').removeClass('active');
|
||||
$(".ranking-row").removeClass("active");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startDataSimulation(enterprises) {
|
||||
setInterval(function() {
|
||||
setInterval(function () {
|
||||
// Randomize values
|
||||
enterprises.forEach(item => {
|
||||
enterprises.forEach((item) => {
|
||||
item.value += Math.floor(Math.random() * 200) - 100;
|
||||
if(item.value < 0) item.value = 0;
|
||||
item.indicator = item.value > 8000 ? '超级' : '普通';
|
||||
if (item.value < 0) item.value = 0;
|
||||
item.indicator = item.value > 8000 ? "超级" : "普通";
|
||||
|
||||
// Update Map Point Style
|
||||
var el = $('#point-' + item.id);
|
||||
if(item.value > 8000) {
|
||||
el.addClass('super');
|
||||
var el = $("#point-" + item.id);
|
||||
if (item.value > 8000) {
|
||||
el.addClass("super");
|
||||
} else {
|
||||
el.removeClass('super');
|
||||
el.removeClass("super");
|
||||
}
|
||||
el.find('.map-tooltip').html(item.name + '<br>排污量: ' + item.value);
|
||||
el.find(".map-tooltip").html(
|
||||
item.name + "<br>排污量: " + item.value,
|
||||
);
|
||||
});
|
||||
|
||||
updateSortedData(enterprises);
|
||||
@ -721,15 +842,15 @@
|
||||
}
|
||||
|
||||
function startRotation() {
|
||||
rotationTimer = setInterval(function() {
|
||||
rotationTimer = setInterval(function () {
|
||||
currentFocusIndex = (currentFocusIndex + 1) % 10;
|
||||
updateDetailView();
|
||||
}, 10000); // Rotate every 5 seconds
|
||||
}
|
||||
|
||||
function updateDetailView() {
|
||||
if(!currentMaxData || currentMaxData.length === 0) return;
|
||||
if(currentFocusIndex >= currentMaxData.length) currentFocusIndex = 0;
|
||||
if (!currentMaxData || currentMaxData.length === 0) return;
|
||||
if (currentFocusIndex >= currentMaxData.length) currentFocusIndex = 0;
|
||||
|
||||
var enterprise = currentMaxData[currentFocusIndex];
|
||||
|
||||
@ -743,16 +864,16 @@
|
||||
}
|
||||
|
||||
function highlightMapPoint(id) {
|
||||
$('.map-point').removeClass('active');
|
||||
$('#point-' + id).addClass('active');
|
||||
$(".map-point").removeClass("active");
|
||||
$("#point-" + id).addClass("active");
|
||||
}
|
||||
|
||||
function renderDetailContent(enterprise) {
|
||||
// Update DOM
|
||||
$('#detailTitle').text(enterprise.name);
|
||||
$('#sewageType').text(enterprise.sewageType);
|
||||
$('#dischargeVolume').text(enterprise.value + ' m³');
|
||||
$('#connectionStatus').text(enterprise.connectionStatus);
|
||||
$("#detailTitle").text(enterprise.name);
|
||||
$("#sewageType").text(enterprise.sewageType);
|
||||
$("#dischargeVolume").text(enterprise.value + " m³");
|
||||
$("#connectionStatus").text(enterprise.connectionStatus);
|
||||
|
||||
renderDetailCharts(enterprise);
|
||||
}
|
||||
@ -760,66 +881,90 @@
|
||||
function renderDetailCharts(enterprise) {
|
||||
// Generate X labels
|
||||
var hours = [];
|
||||
for(var i=0; i<72; i++) hours.push(i+'h');
|
||||
for (var i = 0; i < 72; i++) hours.push(i + "h");
|
||||
|
||||
var days = [];
|
||||
for(var j=0; j<14; j++) days.push('D'+(j+1));
|
||||
for (var j = 0; j < 14; j++) days.push("D" + (j + 1));
|
||||
|
||||
// Instant Chart (Line)
|
||||
var optionInstant = {
|
||||
tooltip: { trigger: 'axis' },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '15%', containLabel: true },
|
||||
tooltip: { trigger: "axis" },
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "15%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
data: hours,
|
||||
axisLabel: { color: '#ccc' },
|
||||
axisLine: { lineStyle: { color: '#00eaff' } }
|
||||
axisLabel: { color: "#ccc" },
|
||||
axisLine: { lineStyle: { color: "#00eaff" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#ccc' },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#ccc" },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: '瞬时量',
|
||||
type: 'line',
|
||||
series: [
|
||||
{
|
||||
name: "瞬时量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: { color: '#00eaff' },
|
||||
areaStyle: { normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 234, 255, 0.5)' }, { offset: 1, color: 'rgba(0, 234, 255, 0)' }]) } },
|
||||
data: enterprise.instantHistory
|
||||
}]
|
||||
symbol: "none",
|
||||
sampling: "average",
|
||||
itemStyle: { color: "#00eaff" },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "rgba(0, 234, 255, 0.5)" },
|
||||
{ offset: 1, color: "rgba(0, 234, 255, 0)" },
|
||||
]),
|
||||
},
|
||||
},
|
||||
data: enterprise.instantHistory,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// Cumulative Chart (Bar)
|
||||
var optionCumulative = {
|
||||
tooltip: { trigger: 'axis' },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '15%', containLabel: true },
|
||||
tooltip: { trigger: "axis" },
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "15%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
data: days,
|
||||
axisLabel: { color: '#ccc' },
|
||||
axisLine: { lineStyle: { color: '#ffaa00' } }
|
||||
axisLabel: { color: "#ccc" },
|
||||
axisLine: { lineStyle: { color: "#ffaa00" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#ccc' },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#ccc" },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: '累计流量',
|
||||
type: 'bar',
|
||||
itemStyle: { normal: { color: '#ffaa00', barBorderRadius: [5, 5, 0, 0] } },
|
||||
data: enterprise.cumulativeHistory
|
||||
}]
|
||||
series: [
|
||||
{
|
||||
name: "累计流量",
|
||||
type: "bar",
|
||||
itemStyle: {
|
||||
normal: { color: "#ffaa00", barBorderRadius: [5, 5, 0, 0] },
|
||||
},
|
||||
data: enterprise.cumulativeHistory,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
myChartInstant.setOption(optionInstant);
|
||||
myChartCumulative.setOption(optionCumulative);
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
122
src/main/webapp/jsp/jsyw/vehicleGateList.jsp
Normal file
122
src/main/webapp/jsp/jsyw/vehicleGateList.jsp
Normal file
@ -0,0 +1,122 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8" %>
|
||||
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
|
||||
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
|
||||
<%@ page import="com.sipai.entity.base.ServerObject" %>
|
||||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title><%= ServerObject.atttable.get("TOPTITLE")%></title>
|
||||
<jsp:include page="/jsp/inc.jsp"></jsp:include>
|
||||
<link rel="stylesheet" href="<%=request.getContextPath()%>/CSS/module/jsyw-vehicle-gate.css">
|
||||
<script type="text/javascript" src="<%=request.getContextPath()%>/JS/jsyw/vehicleGateList.js"></script>
|
||||
</head>
|
||||
|
||||
<body onload="initMenu()" class="hold-transition ${cu.themeclass} sidebar-mini">
|
||||
<div class="wrapper">
|
||||
<div class="content-wrapper">
|
||||
<section class="content-header">
|
||||
<h1 id="head_title"></h1>
|
||||
<ol class="breadcrumb">
|
||||
<li><a id="head_firstlevel" href="#"><i class="fa fa-dashboard"></i></a></li>
|
||||
</ol>
|
||||
</section>
|
||||
<section class="content container-fluid">
|
||||
<div id="mainAlertdiv"></div>
|
||||
|
||||
<div class="row gate-summary-row">
|
||||
<div class="col-sm-3 col-xs-6">
|
||||
<div class="small-box bg-aqua">
|
||||
<div class="inner">
|
||||
<h3 id="summaryInCount">0</h3>
|
||||
<p>今日进闸</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fa fa-sign-in"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3 col-xs-6">
|
||||
<div class="small-box bg-green">
|
||||
<div class="inner">
|
||||
<h3 id="summaryOutCount">0</h3>
|
||||
<p>今日出闸</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fa fa-sign-out"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3 col-xs-6">
|
||||
<div class="small-box bg-yellow">
|
||||
<div class="inner">
|
||||
<h3 id="summaryInsideCount">0</h3>
|
||||
<p>当前场内车辆</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fa fa-car"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3 col-xs-6">
|
||||
<div class="small-box bg-red">
|
||||
<div class="inner">
|
||||
<h3 id="summaryAbnormalCount">0</h3>
|
||||
<p>异常记录</p>
|
||||
</div>
|
||||
<div class="icon"><i class="fa fa-warning"></i></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box box-primary">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">车辆通行记录(静态展示)</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<form id="searchForm" onsubmit="return false;">
|
||||
<div class="form-group form-inline gate-search-line">
|
||||
<input type="text" class="form-control input-sm gate-input" id="search_plateNo" placeholder="车牌号">
|
||||
<input type="text" class="form-control input-sm gate-input" id="search_passDate" placeholder="通行日期(yyyy-mm-dd)">
|
||||
<select class="form-control input-sm gate-input" id="search_direction">
|
||||
<option value="">通行方向(全部)</option>
|
||||
<option value="IN">进闸</option>
|
||||
<option value="OUT">出闸</option>
|
||||
</select>
|
||||
<select class="form-control input-sm gate-input" id="search_status">
|
||||
<option value="">状态(全部)</option>
|
||||
<option value="NORMAL">正常</option>
|
||||
<option value="ABNORMAL">异常</option>
|
||||
</select>
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick="searchGateRecords()"><i class="fa fa-search"></i> 查询</button>
|
||||
<button type="button" class="btn btn-default btn-sm" onclick="resetGateSearch()"><i class="fa fa-refresh"></i> 重置</button>
|
||||
</div>
|
||||
</form>
|
||||
<table id="gateTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="gateDetailModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
<h4 class="modal-title">车辆通行详情</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="gate-detail-line"><span>车牌号:</span><strong id="detail_plateNo"></strong></div>
|
||||
<div class="gate-detail-line"><span>通行方向:</span><span id="detail_direction"></span></div>
|
||||
<div class="gate-detail-line"><span>通行时间:</span><span id="detail_passTime"></span></div>
|
||||
<div class="gate-detail-line"><span>闸机:</span><span id="detail_gateName"></span></div>
|
||||
<div class="gate-detail-line"><span>司机:</span><span id="detail_driverName"></span></div>
|
||||
<div class="gate-detail-line"><span>状态:</span><span id="detail_status"></span></div>
|
||||
<div class="gate-detail-line"><span>备注:</span><span id="detail_note"></span></div>
|
||||
<div class="gate-photo-placeholder">抓拍图占位(静态版)</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -179,7 +179,7 @@
|
||||
<div style="float:left;height:50%;width:100%;padding:5px 5px 5px 5px;">
|
||||
<div style="height:100%;width:100%;background-color:#ffffff;">
|
||||
<div class="section-header">
|
||||
上海金山卫污水公司
|
||||
上海金山卫污水公司11
|
||||
</div>
|
||||
<div style="width:20%;height:95%;float:left;">
|
||||
<div style="width:100%;height:25%;float:left;background-color:#cbe3f9;margin:6%;">
|
||||
|
||||
@ -1,13 +1,17 @@
|
||||
<!-- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -->
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>水厂大屏展示</title>
|
||||
<script type="text/javascript" src="../../node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script>
|
||||
<script type="text/javascript" src="../../JS/echarts3.0.js"></script>
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -19,7 +23,7 @@
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
/* background-image: url('<%=request.getContextPath()%>/IMG/screen1-1.png'); */
|
||||
background-image: url('../../IMG/screen1.png');
|
||||
background-image: url("../../IMG/screen1.png");
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
@ -30,7 +34,7 @@
|
||||
width: 121px;
|
||||
height: 62px;
|
||||
color: rgba(255, 255, 255, 1);
|
||||
font-family: 'Gilroy', 'DIN Alternate', 'Arial Narrow', sans-serif;
|
||||
font-family: "Gilroy", "DIN Alternate", "Arial Narrow", sans-serif;
|
||||
font-weight: 900;
|
||||
font-size: 50px;
|
||||
z-index: 10;
|
||||
@ -142,7 +146,7 @@
|
||||
}
|
||||
|
||||
/* 药耗 */
|
||||
.yaohao{
|
||||
.yaohao {
|
||||
position: absolute;
|
||||
top: 343px;
|
||||
width: 94px;
|
||||
@ -172,10 +176,9 @@
|
||||
top: 300px;
|
||||
left: 2700px;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<div class="left">
|
||||
<div>
|
||||
@ -300,7 +303,7 @@
|
||||
|
||||
<!-- 中间图表 -->
|
||||
<div class="Middle3">
|
||||
<img src="../../IMG/monitor.png" style="width:100%;height:100%;" />
|
||||
<img src="../../IMG/monitor.png" style="width: 100%; height: 100%" />
|
||||
</div>
|
||||
|
||||
<div class="Middle4">
|
||||
@ -317,265 +320,298 @@
|
||||
</div>
|
||||
|
||||
<!-- 视频 -->
|
||||
<div class="right">
|
||||
|
||||
</div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
<script>
|
||||
$(function() {
|
||||
var chartDom = document.getElementById('seven-days-chart');
|
||||
$(function () {
|
||||
var chartDom = document.getElementById("seven-days-chart");
|
||||
if (!chartDom) return;
|
||||
var myChart = echarts.init(chartDom);
|
||||
var dataAxis = ['11-10', '11-11', '11-12', '11-13', '11-14', '11-15', '11-16', '11-17'];
|
||||
var dataAxis = [
|
||||
"11-10",
|
||||
"11-11",
|
||||
"11-12",
|
||||
"11-13",
|
||||
"11-14",
|
||||
"11-15",
|
||||
"11-16",
|
||||
"11-17",
|
||||
];
|
||||
var data = [5200, 4300, 4200, 4300, 6800, 5200, 7400, 5600];
|
||||
var option = {
|
||||
backgroundColor: 'transparent',
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ['处理水量'],
|
||||
data: ["处理水量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: '#9BE8FF',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
data: dataAxis,
|
||||
axisLine: {
|
||||
lineStyle: { color: '#2C3E50' }
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
type: "value",
|
||||
max: 10000,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 18
|
||||
color: "#B7C9E2",
|
||||
fontSize: 18,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: 'rgba(255,255,255,0.15)',
|
||||
type: 'dashed'
|
||||
}
|
||||
}
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
dataZoom: [
|
||||
{ type: 'inside' }
|
||||
],
|
||||
},
|
||||
},
|
||||
dataZoom: [{ type: "inside" }],
|
||||
series: [
|
||||
{
|
||||
name: '处理水量',
|
||||
type: 'bar',
|
||||
name: "处理水量",
|
||||
type: "bar",
|
||||
barWidth: 20,
|
||||
data: data,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#46F2FF' },
|
||||
{ offset: 1, color: '#0B4DB5' }
|
||||
{ offset: 0, color: "#46F2FF" },
|
||||
{ offset: 1, color: "#0B4DB5" },
|
||||
]),
|
||||
shadowColor: 'rgba(0, 0, 0, 0.3)',
|
||||
shadowBlur: 10
|
||||
}
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)",
|
||||
shadowBlur: 10,
|
||||
},
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: '#6af8ff' },
|
||||
{ offset: 1, color: '#1560d6' }
|
||||
])
|
||||
}
|
||||
}
|
||||
{ offset: 0, color: "#6af8ff" },
|
||||
{ offset: 1, color: "#1560d6" },
|
||||
]),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'bar',
|
||||
barGap: '-100%',
|
||||
data: (function(){ var yMax = 10000; var shadow=[]; for (var i=0;i<data.length;i++){shadow.push(yMax);} return shadow; })(),
|
||||
itemStyle: { normal: { color: 'rgba(0,0,0,0.05)' } },
|
||||
silent: true
|
||||
type: "bar",
|
||||
barGap: "-100%",
|
||||
data: (function () {
|
||||
var yMax = 10000;
|
||||
var shadow = [];
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
shadow.push(yMax);
|
||||
}
|
||||
]
|
||||
return shadow;
|
||||
})(),
|
||||
itemStyle: { normal: { color: "rgba(0,0,0,0.05)" } },
|
||||
silent: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
var zoomSize = 6;
|
||||
myChart.on('click', function(params) {
|
||||
var startIndex = Math.max(params.dataIndex - Math.floor(zoomSize / 2), 0);
|
||||
var endIndex = Math.min(params.dataIndex + Math.floor(zoomSize / 2), data.length - 1);
|
||||
myChart.on("click", function (params) {
|
||||
var startIndex = Math.max(
|
||||
params.dataIndex - Math.floor(zoomSize / 2),
|
||||
0,
|
||||
);
|
||||
var endIndex = Math.min(
|
||||
params.dataIndex + Math.floor(zoomSize / 2),
|
||||
data.length - 1,
|
||||
);
|
||||
myChart.dispatchAction({
|
||||
type: 'dataZoom',
|
||||
type: "dataZoom",
|
||||
startValue: dataAxis[startIndex],
|
||||
endValue: dataAxis[endIndex]
|
||||
endValue: dataAxis[endIndex],
|
||||
});
|
||||
});
|
||||
var nclDom = document.getElementById('ncl-chart');
|
||||
var nclDom = document.getElementById("ncl-chart");
|
||||
if (nclDom) {
|
||||
var nclChart = echarts.init(nclDom, 'dark');
|
||||
var nclChart = echarts.init(nclDom, "dark");
|
||||
var nclData = [120, 160, 90, 250, 170, 340, 280, 330, 80, 260];
|
||||
var nclOption = {
|
||||
backgroundColor: 'transparent',
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ['实际小时排泥量'],
|
||||
data: ["实际小时排泥量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: '#9BE8FF',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['2:00', '4:00', '6:00', '8:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00'],
|
||||
type: "category",
|
||||
data: [
|
||||
"2:00",
|
||||
"4:00",
|
||||
"6:00",
|
||||
"8:00",
|
||||
"10:00",
|
||||
"12:00",
|
||||
"14:00",
|
||||
"16:00",
|
||||
"18:00",
|
||||
"20:00",
|
||||
],
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
lineStyle: { color: '#2C3E50' }
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
type: "value",
|
||||
max: 500,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 25
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: 'rgba(255,255,255,0.15)',
|
||||
type: 'dashed'
|
||||
}
|
||||
}
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '实际小时排泥量',
|
||||
type: 'line',
|
||||
name: "实际小时排泥量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: 'none',
|
||||
symbol: "none",
|
||||
lineStyle: { normal: { width: 2 } },
|
||||
itemStyle: { normal: { color: '#46F2FF' } },
|
||||
areaStyle: { normal: {
|
||||
itemStyle: { normal: { color: "#46F2FF" } },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: 'rgba(70, 242, 255, 0.45)' },
|
||||
{ offset: 1, color: 'rgba(11, 77, 181, 0.05)' }
|
||||
{ offset: 0, color: "rgba(70, 242, 255, 0.45)" },
|
||||
{ offset: 1, color: "rgba(11, 77, 181, 0.05)" },
|
||||
]),
|
||||
opacity: 1
|
||||
}},
|
||||
data: nclData
|
||||
}
|
||||
]
|
||||
opacity: 1,
|
||||
},
|
||||
},
|
||||
data: nclData,
|
||||
},
|
||||
],
|
||||
};
|
||||
nclChart.setOption(nclOption);
|
||||
window.addEventListener('resize', function() {
|
||||
window.addEventListener("resize", function () {
|
||||
nclChart.resize();
|
||||
});
|
||||
}
|
||||
window.addEventListener('resize', function() {
|
||||
window.addEventListener("resize", function () {
|
||||
myChart.resize();
|
||||
});
|
||||
var qualityDom = document.getElementById('quality-chart');
|
||||
var qualityDom = document.getElementById("quality-chart");
|
||||
if (qualityDom) {
|
||||
var qualityChart = echarts.init(qualityDom);
|
||||
var qualityData = [8, 13, 9, 14, 21, 14, 18];
|
||||
var qualityOption = {
|
||||
backgroundColor: 'transparent',
|
||||
backgroundColor: "transparent",
|
||||
grid: {
|
||||
left: 60,
|
||||
right: 40,
|
||||
top: 40,
|
||||
bottom: 40
|
||||
bottom: 40,
|
||||
},
|
||||
legend: {
|
||||
data: ['水质量'],
|
||||
data: ["水质量"],
|
||||
right: 10,
|
||||
top: 0,
|
||||
textStyle: {
|
||||
color: '#9BE8FF',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#9BE8FF",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['11', '12', '13', '14', '15', '16', '17'],
|
||||
type: "category",
|
||||
data: ["11", "12", "13", "14", "15", "16", "17"],
|
||||
boundaryGap: false,
|
||||
axisLine: {
|
||||
lineStyle: { color: '#2C3E50' }
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
},
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 25
|
||||
}
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
type: "value",
|
||||
max: 25,
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#B7C9E2',
|
||||
fontSize: 25
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
splitLine: {
|
||||
lineStyle: {
|
||||
color: 'rgba(255,255,255,0.15)',
|
||||
type: 'dashed'
|
||||
}
|
||||
}
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '水质量',
|
||||
type: 'line',
|
||||
name: "水质量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: 'none',
|
||||
symbol: "none",
|
||||
lineStyle: { normal: { width: 2 } },
|
||||
itemStyle: { normal: { color: '#46F2FF' } },
|
||||
areaStyle: { normal: {
|
||||
itemStyle: { normal: { color: "#46F2FF" } },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: 'rgba(70, 242, 255, 0.45)' },
|
||||
{ offset: 1, color: 'rgba(11, 77, 181, 0.05)' }
|
||||
{ offset: 0, color: "rgba(70, 242, 255, 0.45)" },
|
||||
{ offset: 1, color: "rgba(11, 77, 181, 0.05)" },
|
||||
]),
|
||||
opacity: 1
|
||||
}},
|
||||
data: qualityData
|
||||
}
|
||||
]
|
||||
opacity: 1,
|
||||
},
|
||||
},
|
||||
data: qualityData,
|
||||
},
|
||||
],
|
||||
};
|
||||
qualityChart.setOption(qualityOption);
|
||||
window.addEventListener('resize', function() {
|
||||
window.addEventListener("resize", function () {
|
||||
qualityChart.resize();
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -1,15 +1,20 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>区域管线大屏展示</title>
|
||||
<!-- <script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/jquery/dist/jquery.min.js"></script> -->
|
||||
<!-- <script type="text/javascript" src="<%=request.getContextPath()%>/JS/echarts3.0.js"></script> -->
|
||||
<script type="text/javascript" src="../../node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script>
|
||||
<script type="text/javascript" src="../../JS/echarts3.0.js"></script>
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -20,7 +25,7 @@
|
||||
.screen-container {
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
background-image: url('../../IMG/screen2.png');
|
||||
background-image: url("../../IMG/screen2.png");
|
||||
/* background-image: url('<%=request.getContextPath()%>/IMG/screen2.png'); */
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
@ -38,9 +43,15 @@
|
||||
font-size: 60px;
|
||||
}
|
||||
|
||||
.card-1 { left: 1910px; }
|
||||
.card-2 { left: 2832px; }
|
||||
.card-3 { left: 3754px; }
|
||||
.card-1 {
|
||||
left: 1910px;
|
||||
}
|
||||
.card-2 {
|
||||
left: 2832px;
|
||||
}
|
||||
.card-3 {
|
||||
left: 3754px;
|
||||
}
|
||||
|
||||
.ring-chart-wrapper {
|
||||
position: absolute;
|
||||
@ -96,7 +107,12 @@
|
||||
box-sizing: border-box;
|
||||
/* background: rgba(27, 126, 242, 0.6); */
|
||||
}
|
||||
#ring-chart-content, #pie-chart-content-2, #gauge-chart-content-3, #gauge-chart-content-4, #bar-chart-content-5, #bar-chart-content-6 {
|
||||
#ring-chart-content,
|
||||
#pie-chart-content-2,
|
||||
#gauge-chart-content-3,
|
||||
#gauge-chart-content-4,
|
||||
#bar-chart-content-5,
|
||||
#bar-chart-content-6 {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
@ -104,8 +120,8 @@
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<div class="stat-card card-1">53829.5</div>
|
||||
<div class="stat-card card-2">2495</div>
|
||||
@ -143,117 +159,153 @@
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$(document).ready(function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
initPieChart();
|
||||
initPieChart2();
|
||||
initGaugeChart('gauge-chart-content-3', 53829.5);
|
||||
initGaugeChart('gauge-chart-content-4', 12345.6);
|
||||
initBarChart('bar-chart-content-5', [3000, 4500, 1500, 5000, 23000, 1500, 15000, 3000, 4000, 5000, 2000, 1000, 500, 2563, 4000]);
|
||||
initBarChart('bar-chart-content-6', [2000, 3000, 1000, 4000, 18000, 1000, 12000, 2000, 3000, 4000, 1500, 800, 400, 2000, 3000]);
|
||||
initGaugeChart("gauge-chart-content-3", 53829.5);
|
||||
initGaugeChart("gauge-chart-content-4", 12345.6);
|
||||
initBarChart(
|
||||
"bar-chart-content-5",
|
||||
[
|
||||
3000, 4500, 1500, 5000, 23000, 1500, 15000, 3000, 4000, 5000, 2000,
|
||||
1000, 500, 2563, 4000,
|
||||
],
|
||||
);
|
||||
initBarChart(
|
||||
"bar-chart-content-6",
|
||||
[
|
||||
2000, 3000, 1000, 4000, 18000, 1000, 12000, 2000, 3000, 4000, 1500,
|
||||
800, 400, 2000, 3000,
|
||||
],
|
||||
);
|
||||
|
||||
// Double click to toggle fullscreen
|
||||
$('body').on('dblclick', function() {
|
||||
$("body").on("dblclick", function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
});
|
||||
});
|
||||
|
||||
function initPieChart() {
|
||||
var chartDom = document.getElementById('ring-chart-content');
|
||||
var chartDom = document.getElementById("ring-chart-content");
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option = {
|
||||
color: [
|
||||
'#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc',
|
||||
'#00d4ff', '#ffb700', '#2bff89', '#915eff', '#ff7f00'
|
||||
"#5470c6",
|
||||
"#91cc75",
|
||||
"#fac858",
|
||||
"#ee6666",
|
||||
"#73c0de",
|
||||
"#3ba272",
|
||||
"#fc8452",
|
||||
"#9a60b4",
|
||||
"#ea7ccc",
|
||||
"#00d4ff",
|
||||
"#ffb700",
|
||||
"#2bff89",
|
||||
"#915eff",
|
||||
"#ff7f00",
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '管线类型统计',
|
||||
type: 'pie',
|
||||
radius: '55%',
|
||||
center: ['50%', '50%'],
|
||||
name: "管线类型统计",
|
||||
type: "pie",
|
||||
radius: "55%",
|
||||
center: ["50%", "50%"],
|
||||
avoidLabelOverlap: true,
|
||||
label: {
|
||||
show: true,
|
||||
position: 'outside',
|
||||
formatter: '{b}',
|
||||
position: "outside",
|
||||
formatter: "{b}",
|
||||
fontSize: 14,
|
||||
lineHeight: 20,
|
||||
align: 'left'
|
||||
align: "left",
|
||||
},
|
||||
labelLine: {
|
||||
show: true,
|
||||
length: 20,
|
||||
length2: 30,
|
||||
lineStyle: {
|
||||
type: 'solid'
|
||||
}
|
||||
type: "solid",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 335, name: 'II级钢筋混凝土管 承插接口' },
|
||||
{ value: 310, name: '焊接钢管 焊接接口' },
|
||||
{ value: 274, name: '高密度聚乙烯双壁波纹管' },
|
||||
{ value: 235, name: '聚乙烯PE管' },
|
||||
{ value: 200, name: 'II级钢筋混凝土管' },
|
||||
{ value: 180, name: '高密度聚乙烯缠绕管' },
|
||||
{ value: 150, name: '焊接钢管 焊接连接' },
|
||||
{ value: 140, name: '高密度聚乙烯中空壁缠绕管' },
|
||||
{ value: 130, name: '钢筋混凝土管' },
|
||||
{ value: 110, name: '球墨铸铁管' },
|
||||
{ value: 100, name: '预应力钢筒混凝土管' }
|
||||
]
|
||||
}
|
||||
]
|
||||
{ value: 335, name: "II级钢筋混凝土管 承插接口" },
|
||||
{ value: 310, name: "焊接钢管 焊接接口" },
|
||||
{ value: 274, name: "高密度聚乙烯双壁波纹管" },
|
||||
{ value: 235, name: "聚乙烯PE管" },
|
||||
{ value: 200, name: "II级钢筋混凝土管" },
|
||||
{ value: 180, name: "高密度聚乙烯缠绕管" },
|
||||
{ value: 150, name: "焊接钢管 焊接连接" },
|
||||
{ value: 140, name: "高密度聚乙烯中空壁缠绕管" },
|
||||
{ value: 130, name: "钢筋混凝土管" },
|
||||
{ value: 110, name: "球墨铸铁管" },
|
||||
{ value: 100, name: "预应力钢筒混凝土管" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
|
||||
function initPieChart2() {
|
||||
var chartDom = document.getElementById('pie-chart-content-2');
|
||||
var chartDom = document.getElementById("pie-chart-content-2");
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option = {
|
||||
color: [
|
||||
'#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc',
|
||||
'#00d4ff', '#ffb700', '#2bff89', '#915eff', '#ff7f00'
|
||||
"#5470c6",
|
||||
"#91cc75",
|
||||
"#fac858",
|
||||
"#ee6666",
|
||||
"#73c0de",
|
||||
"#3ba272",
|
||||
"#fc8452",
|
||||
"#9a60b4",
|
||||
"#ea7ccc",
|
||||
"#00d4ff",
|
||||
"#ffb700",
|
||||
"#2bff89",
|
||||
"#915eff",
|
||||
"#ff7f00",
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: '管线类型统计2',
|
||||
type: 'pie',
|
||||
radius: '55%',
|
||||
center: ['50%', '50%'],
|
||||
name: "管线类型统计2",
|
||||
type: "pie",
|
||||
radius: "55%",
|
||||
center: ["50%", "50%"],
|
||||
avoidLabelOverlap: true,
|
||||
label: {
|
||||
show: true,
|
||||
position: 'outside',
|
||||
formatter: '{b}',
|
||||
position: "outside",
|
||||
formatter: "{b}",
|
||||
fontSize: 14,
|
||||
lineHeight: 20,
|
||||
align: 'left'
|
||||
align: "left",
|
||||
},
|
||||
labelLine: {
|
||||
show: true,
|
||||
length: 20,
|
||||
length2: 30,
|
||||
lineStyle: {
|
||||
type: 'solid'
|
||||
}
|
||||
type: "solid",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 335, name: 'II级钢筋混凝土管 承插接口' },
|
||||
{ value: 310, name: '焊接钢管 焊接接口' },
|
||||
{ value: 274, name: '高密度聚乙烯双壁波纹管' },
|
||||
{ value: 235, name: '聚乙烯PE管' },
|
||||
{ value: 200, name: 'II级钢筋混凝土管' },
|
||||
{ value: 180, name: '高密度聚乙烯缠绕管' },
|
||||
{ value: 150, name: '焊接钢管 焊接连接' },
|
||||
{ value: 140, name: '高密度聚乙烯中空壁缠绕管' },
|
||||
{ value: 130, name: '钢筋混凝土管' },
|
||||
{ value: 110, name: '球墨铸铁管' },
|
||||
{ value: 100, name: '预应力钢筒混凝土管' }
|
||||
]
|
||||
}
|
||||
]
|
||||
{ value: 335, name: "II级钢筋混凝土管 承插接口" },
|
||||
{ value: 310, name: "焊接钢管 焊接接口" },
|
||||
{ value: 274, name: "高密度聚乙烯双壁波纹管" },
|
||||
{ value: 235, name: "聚乙烯PE管" },
|
||||
{ value: 200, name: "II级钢筋混凝土管" },
|
||||
{ value: 180, name: "高密度聚乙烯缠绕管" },
|
||||
{ value: 150, name: "焊接钢管 焊接连接" },
|
||||
{ value: 140, name: "高密度聚乙烯中空壁缠绕管" },
|
||||
{ value: 130, name: "钢筋混凝土管" },
|
||||
{ value: 110, name: "球墨铸铁管" },
|
||||
{ value: 100, name: "预应力钢筒混凝土管" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
@ -264,58 +316,65 @@
|
||||
var option = {
|
||||
series: [
|
||||
{
|
||||
type: 'gauge',
|
||||
type: "gauge",
|
||||
startAngle: 180,
|
||||
endAngle: 0,
|
||||
min: 0,
|
||||
max: 300,
|
||||
splitNumber: 6,
|
||||
radius: '90%',
|
||||
center: ['50%', '70%'],
|
||||
radius: "90%",
|
||||
center: ["50%", "70%"],
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
width: 40,
|
||||
color: [[1, new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: 'rgba(65, 108, 243, 1)' },
|
||||
{ offset: 1, color: 'rgba(0, 68, 160, 1)' }
|
||||
])]]
|
||||
}
|
||||
color: [
|
||||
[
|
||||
1,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "rgba(65, 108, 243, 1)" },
|
||||
{ offset: 1, color: "rgba(0, 68, 160, 1)" },
|
||||
]),
|
||||
],
|
||||
],
|
||||
},
|
||||
},
|
||||
pointer: {
|
||||
show: true,
|
||||
length: '60%',
|
||||
length: "60%",
|
||||
width: 6,
|
||||
itemStyle: {
|
||||
color: '#00d4ff'
|
||||
}
|
||||
color: "#00d4ff",
|
||||
},
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
show: false,
|
||||
},
|
||||
splitLine: {
|
||||
show: false
|
||||
show: false,
|
||||
},
|
||||
axisLabel: {
|
||||
color: '#00d4ff',
|
||||
color: "#00d4ff",
|
||||
fontSize: 14,
|
||||
distance: -60,
|
||||
formatter: function (value) {
|
||||
return value;
|
||||
}
|
||||
},
|
||||
},
|
||||
detail: {
|
||||
show: true,
|
||||
offsetCenter: [0, '40%'],
|
||||
offsetCenter: [0, "40%"],
|
||||
fontSize: 30,
|
||||
color: '#fff',
|
||||
formatter: '{value} m'
|
||||
color: "#fff",
|
||||
formatter: "{value} m",
|
||||
},
|
||||
data: [{
|
||||
data: [
|
||||
{
|
||||
value: value,
|
||||
name: ''
|
||||
}]
|
||||
}
|
||||
]
|
||||
name: "",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// Adjust value if it exceeds max for visual representation (optional)
|
||||
@ -325,7 +384,7 @@
|
||||
// Let's set the gauge pointer to max if value > 300
|
||||
if (value > 300) {
|
||||
option.series[0].data[0].value = 300; // Pointer at max
|
||||
option.series[0].detail.formatter = value + ' m'; // Show real value
|
||||
option.series[0].detail.formatter = value + " m"; // Show real value
|
||||
}
|
||||
|
||||
myChart.setOption(option);
|
||||
@ -341,122 +400,175 @@
|
||||
|
||||
var option = {
|
||||
grid: {
|
||||
top: '20%',
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
containLabel: true
|
||||
top: "20%",
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
containLabel: true,
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis'
|
||||
trigger: "axis",
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15'],
|
||||
type: "category",
|
||||
data: [
|
||||
"01",
|
||||
"02",
|
||||
"03",
|
||||
"04",
|
||||
"05",
|
||||
"06",
|
||||
"07",
|
||||
"08",
|
||||
"09",
|
||||
"10",
|
||||
"11",
|
||||
"12",
|
||||
"13",
|
||||
"14",
|
||||
"15",
|
||||
],
|
||||
axisLine: {
|
||||
lineStyle: { color: "#2C3E50" },
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.3)'
|
||||
}
|
||||
// lineStyle: {
|
||||
// color: 'rgba(255, 255, 255, 0.3)'
|
||||
// }
|
||||
},
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: 14
|
||||
color: "#B7C9E2",
|
||||
fontSize: 25,
|
||||
},
|
||||
axisTick: {
|
||||
show: false
|
||||
}
|
||||
// axisTick: {
|
||||
// show: false
|
||||
// }
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
name: '长度(m)',
|
||||
nameTextStyle: {
|
||||
color: '#fff',
|
||||
padding: [0, 0, 0, 20]
|
||||
},
|
||||
axisLine: {
|
||||
show: false
|
||||
},
|
||||
type: "value",
|
||||
name: "长度(m)",
|
||||
// nameTextStyle: {
|
||||
// color: '#fff',
|
||||
// padding: [0, 0, 0, 20]
|
||||
// },
|
||||
// axisLabel: {
|
||||
// color: '#fff',
|
||||
// fontSize: 14
|
||||
// },
|
||||
// splitLine: {
|
||||
// show: true,
|
||||
// lineStyle: {
|
||||
// color: 'rgba(255, 255, 255, 0.1)'
|
||||
// }
|
||||
// },
|
||||
splitNumber: 5,
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: 14
|
||||
color: "#B7C9E2",
|
||||
fontSize: 18,
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)'
|
||||
}
|
||||
}
|
||||
color: "rgba(255,255,255,0.15)",
|
||||
type: "dashed",
|
||||
},
|
||||
},
|
||||
},
|
||||
dataZoom: [{ type: "inside" }],
|
||||
series: [
|
||||
{
|
||||
data: data,
|
||||
type: 'bar',
|
||||
barWidth: '40%',
|
||||
type: "bar",
|
||||
barWidth: "40%",
|
||||
// itemStyle: {
|
||||
// color: '#FF9900',
|
||||
// borderColor: '#FF9900',
|
||||
// borderWidth: 1
|
||||
// },
|
||||
itemStyle: {
|
||||
color: '#FF9900',
|
||||
borderColor: '#FF9900',
|
||||
borderWidth: 1
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#46F2FF" },
|
||||
{ offset: 1, color: "#0B4DB5" },
|
||||
]),
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)",
|
||||
shadowBlur: 10,
|
||||
},
|
||||
markPoint: {
|
||||
symbol: 'pin',
|
||||
symbolSize: 50,
|
||||
label: {
|
||||
show: true,
|
||||
color: '#fff',
|
||||
fontSize: 12
|
||||
},
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
color: '#FF9900'
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#6af8ff" },
|
||||
{ offset: 1, color: "#1560d6" },
|
||||
]),
|
||||
},
|
||||
data: [
|
||||
{ type: 'max', name: 'Max' },
|
||||
{ type: 'min', name: 'Min' }
|
||||
]
|
||||
},
|
||||
markLine: {
|
||||
symbol: 'none',
|
||||
data: [
|
||||
{ yAxis: 2563.31, name: 'Average' }
|
||||
// markPoint: {
|
||||
// symbol: 'pin',
|
||||
// symbolSize: 50,
|
||||
// label: {
|
||||
// show: true,
|
||||
// color: '#fff',
|
||||
// fontSize: 12
|
||||
// },
|
||||
// itemStyle: {
|
||||
// color: '#FF9900'
|
||||
// },
|
||||
// data: [
|
||||
// { type: 'max', name: 'Max' },
|
||||
// { type: 'min', name: 'Min' }
|
||||
// ]
|
||||
// },
|
||||
// markLine: {
|
||||
// symbol: 'none',
|
||||
// data: [
|
||||
// { yAxis: 2563.31, name: 'Average' }
|
||||
// ],
|
||||
// label: {
|
||||
// show: true,
|
||||
// position: 'end',
|
||||
// formatter: '{c}',
|
||||
// color: '#FF9900'
|
||||
// },
|
||||
// lineStyle: {
|
||||
// type: 'dotted',
|
||||
// color: '#FF9900'
|
||||
// }
|
||||
// }
|
||||
},
|
||||
// {
|
||||
// type: 'bar',
|
||||
// barGap: '-100%',
|
||||
// data: (function(){ var yMax = 10000; var shadow=[]; for (var i=0;i<data.length;i++){shadow.push(yMax);} return shadow; })(),
|
||||
// itemStyle: { normal: { color: 'rgba(0,0,0,0.05)' } },
|
||||
// silent: true
|
||||
// }
|
||||
],
|
||||
label: {
|
||||
show: true,
|
||||
position: 'end',
|
||||
formatter: '{c}',
|
||||
color: '#FF9900'
|
||||
},
|
||||
lineStyle: {
|
||||
type: 'dotted',
|
||||
color: '#FF9900'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
}
|
||||
|
||||
function launchIntoFullscreen(element) {
|
||||
if(element.requestFullscreen) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if(element.mozRequestFullScreen) {
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if(element.webkitRequestFullscreen) {
|
||||
} else if (element.webkitRequestFullscreen) {
|
||||
element.webkitRequestFullscreen();
|
||||
} else if(element.msRequestFullscreen) {
|
||||
} else if (element.msRequestFullscreen) {
|
||||
element.msRequestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
function exitFullscreen() {
|
||||
if(document.exitFullscreen) {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if(document.mozCancelFullScreen) {
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if(document.webkitExitFullscreen) {
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -1,15 +1,20 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE html>
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8"
|
||||
pageEncoding="UTF-8"%>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>排污户大屏展示</title>
|
||||
<script type="text/javascript" src="../../node_modules/jquery/dist/jquery.min.js"></script>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="../../node_modules/jquery/dist/jquery.min.js"
|
||||
></script>
|
||||
<script type="text/javascript" src="../../JS/echarts3.0.js"></script>
|
||||
<!-- <script type="text/javascript" src="<%=request.getContextPath()%>/node_modules/jquery/dist/jquery.min.js"></script> -->
|
||||
<!-- <script type="text/javascript" src="<%=request.getContextPath()%>/JS/echarts3.0.js"></script> -->
|
||||
<style>
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
@ -22,7 +27,7 @@
|
||||
width: 6500px;
|
||||
height: 1800px;
|
||||
/* background-image: url('<%=request.getContextPath()%>/IMG/screen3.png'); */
|
||||
background-image: url('../../IMG/screen3.png');
|
||||
background-image: url("../../IMG/screen3.png");
|
||||
background-size: 100% 100%;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
@ -66,7 +71,7 @@
|
||||
font-size: 48px;
|
||||
font-weight: bold;
|
||||
color: #00eaff;
|
||||
font-family: 'DIN Alternate', sans-serif;
|
||||
font-family: "DIN Alternate", sans-serif;
|
||||
}
|
||||
|
||||
.stat-unit {
|
||||
@ -199,7 +204,7 @@
|
||||
color: #ffaa00;
|
||||
font-weight: bold;
|
||||
margin-left: 15px;
|
||||
font-family: 'DIN Alternate', sans-serif;
|
||||
font-family: "DIN Alternate", sans-serif;
|
||||
}
|
||||
|
||||
.photo-section {
|
||||
@ -265,43 +270,70 @@
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
</head>
|
||||
<body>
|
||||
<div class="screen-container">
|
||||
<div class="rank-module-container">
|
||||
<!-- Statistics -->
|
||||
<div class="stats-header">
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">辖区排污企业总数</div>
|
||||
<div class="stat-value" id="totalCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" id="totalCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">已接入监控</div>
|
||||
<div class="stat-value" style="color: #00ff00;" id="connectedCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" style="color: #00ff00" id="connectedCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="stat-label">正在接入中</div>
|
||||
<div class="stat-value" style="color: #ffaa00;" id="connectingCount">0<span class="stat-unit">家</span></div>
|
||||
<div class="stat-value" style="color: #ffaa00" id="connectingCount">
|
||||
0<span class="stat-unit">家</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Ranking List -->
|
||||
<div class="ranking-list-wrapper" style="flex: 1; display: flex; flex-direction: column; overflow: hidden;">
|
||||
<div id="chartRanking" style="flex: 1; width: 100%;"></div>
|
||||
<div
|
||||
class="ranking-list-wrapper"
|
||||
style="
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
"
|
||||
>
|
||||
<div id="chartRanking" style="flex: 1; width: 100%"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Left Side Detail Module -->
|
||||
<div class="detail-module-container">
|
||||
<div class="enterprise-detail-header" id="detailTitle">企业名称加载中...</div>
|
||||
<div class="enterprise-detail-header" id="detailTitle">
|
||||
企业名称加载中...
|
||||
</div>
|
||||
<div class="detail-content">
|
||||
<div class="info-section">
|
||||
<div class="info-item">污水特性: <span id="sewageType">--</span></div>
|
||||
<div class="info-item">当前排污量: <span id="dischargeVolume">--</span></div>
|
||||
<div class="info-item">接入状态: <span id="connectionStatus">--</span></div>
|
||||
<div class="info-item">
|
||||
污水特性: <span id="sewageType">--</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
当前排污量: <span id="dischargeVolume">--</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
接入状态: <span id="connectionStatus">--</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="photo-section">
|
||||
<img id="sitePhoto" src="<%=request.getContextPath()%>/IMG/login/company.png" alt="现场照片" style="width:100%; height:100%; object-fit: cover;">
|
||||
<img
|
||||
id="sitePhoto"
|
||||
src="<%=request.getContextPath()%>/IMG/login/company.png"
|
||||
alt="现场照片"
|
||||
style="width: 100%; height: 100%; object-fit: cover"
|
||||
/>
|
||||
<div class="photo-label">现场监控画面</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -319,7 +351,7 @@
|
||||
|
||||
<!-- New Bar Chart Area -->
|
||||
<div class="new-bar-chart-container">
|
||||
<div id="newBarChart" style="width: 100%; height: 100%;"></div>
|
||||
<div id="newBarChart" style="width: 100%; height: 100%"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -335,34 +367,34 @@
|
||||
var currentFocusIndex = 0;
|
||||
var rotationTimer = null;
|
||||
|
||||
$(document).ready(function() {
|
||||
$(document).ready(function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
initData();
|
||||
|
||||
// Double click to toggle fullscreen
|
||||
$('body').on('dblclick', function() {
|
||||
$("body").on("dblclick", function () {
|
||||
launchIntoFullscreen(document.documentElement);
|
||||
});
|
||||
});
|
||||
|
||||
function launchIntoFullscreen(element) {
|
||||
if(element.requestFullscreen) {
|
||||
if (element.requestFullscreen) {
|
||||
element.requestFullscreen();
|
||||
} else if(element.mozRequestFullScreen) {
|
||||
} else if (element.mozRequestFullScreen) {
|
||||
element.mozRequestFullScreen();
|
||||
} else if(element.webkitRequestFullscreen) {
|
||||
} else if (element.webkitRequestFullscreen) {
|
||||
element.webkitRequestFullscreen();
|
||||
} else if(element.msRequestFullscreen) {
|
||||
} else if (element.msRequestFullscreen) {
|
||||
element.msRequestFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
function exitFullscreen() {
|
||||
if(document.exitFullscreen) {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if(document.mozCancelFullScreen) {
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if(document.webkitExitFullscreen) {
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
}
|
||||
@ -372,40 +404,50 @@
|
||||
var total = 158;
|
||||
var connected = 124;
|
||||
var connecting = 34;
|
||||
$('#totalCount').html(total + '<span class="stat-unit">家</span>');
|
||||
$('#connectedCount').html(connected + '<span class="stat-unit">家</span>');
|
||||
$('#connectingCount').html(connecting + '<span class="stat-unit">家</span>');
|
||||
$("#totalCount").html(total + '<span class="stat-unit">家</span>');
|
||||
$("#connectedCount").html(
|
||||
connected + '<span class="stat-unit">家</span>',
|
||||
);
|
||||
$("#connectingCount").html(
|
||||
connecting + '<span class="stat-unit">家</span>',
|
||||
);
|
||||
|
||||
// Generate Enterprises with Details
|
||||
var enterprises = [];
|
||||
var sewageTypes = ['化学需氧量', '氨氮', '总磷', '重金属', '酸碱废水'];
|
||||
var connectionStatuses = ['已接入', '接入中'];
|
||||
var sewageTypes = ["化学需氧量", "氨氮", "总磷", "重金属", "酸碱废水"];
|
||||
var connectionStatuses = ["已接入", "接入中"];
|
||||
|
||||
for (var i = 1; i <= 50; i++) {
|
||||
var val = Math.floor(Math.random() * 10000) + 500;
|
||||
enterprises.push({
|
||||
id: i,
|
||||
name: '企业-' + i,
|
||||
name: "企业-" + i,
|
||||
value: val,
|
||||
// Details
|
||||
sewageType: sewageTypes[Math.floor(Math.random() * sewageTypes.length)],
|
||||
connectionStatus: connectionStatuses[Math.floor(Math.random() * connectionStatuses.length)],
|
||||
indicator: val > 8000 ? '超级' : '普通',
|
||||
photo: '<%=request.getContextPath()%>/IMG/login/company.png', // Placeholder
|
||||
sewageType:
|
||||
sewageTypes[Math.floor(Math.random() * sewageTypes.length)],
|
||||
connectionStatus:
|
||||
connectionStatuses[
|
||||
Math.floor(Math.random() * connectionStatuses.length)
|
||||
],
|
||||
indicator: val > 8000 ? "超级" : "普通",
|
||||
photo: "<%=request.getContextPath()%>/IMG/login/company.png", // Placeholder
|
||||
// Map Coordinates (Relative % in map container)
|
||||
x: Math.random() * 90 + 5, // 5% to 95%
|
||||
y: Math.random() * 80 + 10, // 10% to 90%
|
||||
// History Data
|
||||
instantHistory: generateHistoryData(72), // 3 days * 24 hours
|
||||
cumulativeHistory: generateHistoryData(14) // 14 days
|
||||
cumulativeHistory: generateHistoryData(14), // 14 days
|
||||
});
|
||||
}
|
||||
allEnterprises = enterprises;
|
||||
|
||||
// Init Charts
|
||||
myChartInstant = echarts.init(document.getElementById('chartInstant'));
|
||||
myChartCumulative = echarts.init(document.getElementById('chartCumulative'));
|
||||
myChartRanking = echarts.init(document.getElementById('chartRanking'));
|
||||
myChartInstant = echarts.init(document.getElementById("chartInstant"));
|
||||
myChartCumulative = echarts.init(
|
||||
document.getElementById("chartCumulative"),
|
||||
);
|
||||
myChartRanking = echarts.init(document.getElementById("chartRanking"));
|
||||
// myNewBarChart = echarts.init(document.getElementById('newBarChart'));
|
||||
|
||||
// renderNewBarChart();
|
||||
@ -426,7 +468,7 @@
|
||||
|
||||
function generateHistoryData(count) {
|
||||
var data = [];
|
||||
for(var k=0; k<count; k++) {
|
||||
for (var k = 0; k < count; k++) {
|
||||
data.push(Math.floor(Math.random() * 500) + 50);
|
||||
}
|
||||
return data;
|
||||
@ -434,10 +476,14 @@
|
||||
|
||||
function updateSortedData(enterprises) {
|
||||
// Sort Descending for Max
|
||||
currentMaxData = [...enterprises].sort((a, b) => b.value - a.value).slice(0, 10);
|
||||
currentMaxData = [...enterprises]
|
||||
.sort((a, b) => b.value - a.value)
|
||||
.slice(0, 10);
|
||||
|
||||
// Sort Ascending for Min
|
||||
currentMinData = [...enterprises].sort((a, b) => a.value - b.value).slice(0, 10);
|
||||
currentMinData = [...enterprises]
|
||||
.sort((a, b) => a.value - b.value)
|
||||
.slice(0, 10);
|
||||
}
|
||||
|
||||
function renderRankingChart() {
|
||||
@ -454,13 +500,18 @@
|
||||
value: item.value,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
|
||||
offset: 0, color: '#ff5500'
|
||||
}, {
|
||||
offset: 1, color: '#ffb700'
|
||||
}])
|
||||
}
|
||||
}
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#ff5500",
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#ffb700",
|
||||
},
|
||||
]),
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@ -471,194 +522,262 @@
|
||||
value: item.value,
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
|
||||
offset: 0, color: '#00aa00'
|
||||
}, {
|
||||
offset: 1, color: '#00ff00'
|
||||
}])
|
||||
}
|
||||
}
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{
|
||||
offset: 0,
|
||||
color: "#00aa00",
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: "#00ff00",
|
||||
},
|
||||
]),
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
var option = {
|
||||
title: [{
|
||||
text: '近30日排污量 TOP 10 (最大)',
|
||||
left: '25%',
|
||||
top: '2%',
|
||||
textAlign: 'center',
|
||||
textStyle: { color: '#ffffff', fontSize: 30, fontWeight: 'bold' }
|
||||
}, {
|
||||
text: '近30日排污量 TOP 10 (最小)',
|
||||
left: '75%',
|
||||
top: '2%',
|
||||
textAlign: 'center',
|
||||
textStyle: { color: '#ffffff', fontSize: 30, fontWeight: 'bold' }
|
||||
}],
|
||||
grid: [{
|
||||
top: '12%',
|
||||
left: '2%',
|
||||
right: '52%',
|
||||
bottom: '5%',
|
||||
containLabel: true
|
||||
}, {
|
||||
top: '12%',
|
||||
left: '52%',
|
||||
right: '2%',
|
||||
bottom: '5%',
|
||||
containLabel: true
|
||||
}],
|
||||
xAxis: [{
|
||||
type: 'value',
|
||||
title: [
|
||||
{
|
||||
text: "近30日排污量 TOP 10 (最大)",
|
||||
left: "25%",
|
||||
top: "2%",
|
||||
textAlign: "center",
|
||||
textStyle: { color: "#ffffff", fontSize: 30, fontWeight: "bold" },
|
||||
},
|
||||
{
|
||||
text: "近30日排污量 TOP 10 (最小)",
|
||||
left: "75%",
|
||||
top: "2%",
|
||||
textAlign: "center",
|
||||
textStyle: { color: "#ffffff", fontSize: 30, fontWeight: "bold" },
|
||||
},
|
||||
],
|
||||
grid: [
|
||||
{
|
||||
top: "12%",
|
||||
left: "2%",
|
||||
right: "52%",
|
||||
bottom: "5%",
|
||||
containLabel: true,
|
||||
},
|
||||
{
|
||||
top: "12%",
|
||||
left: "52%",
|
||||
right: "2%",
|
||||
bottom: "5%",
|
||||
containLabel: true,
|
||||
},
|
||||
],
|
||||
xAxis: [
|
||||
{
|
||||
type: "value",
|
||||
show: false,
|
||||
gridIndex: 0
|
||||
}, {
|
||||
type: 'value',
|
||||
gridIndex: 0,
|
||||
},
|
||||
{
|
||||
type: "value",
|
||||
show: false,
|
||||
gridIndex: 1
|
||||
}],
|
||||
yAxis: [{
|
||||
type: 'category',
|
||||
gridIndex: 1,
|
||||
},
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
type: "category",
|
||||
data: maxNames,
|
||||
inverse: true,
|
||||
axisLabel: { color: '#fff', fontSize: 20 },
|
||||
axisLabel: { color: "#fff", fontSize: 20 },
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
gridIndex: 0
|
||||
}, {
|
||||
type: 'category',
|
||||
gridIndex: 0,
|
||||
},
|
||||
{
|
||||
type: "category",
|
||||
data: minNames,
|
||||
inverse: true,
|
||||
axisLabel: { color: '#fff', fontSize: 20 },
|
||||
axisLabel: { color: "#fff", fontSize: 20 },
|
||||
axisLine: { show: false },
|
||||
axisTick: { show: false },
|
||||
gridIndex: 1
|
||||
}],
|
||||
series: [{
|
||||
name: 'Max',
|
||||
type: 'bar',
|
||||
gridIndex: 1,
|
||||
},
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: "Max",
|
||||
type: "bar",
|
||||
xAxisIndex: 0,
|
||||
yAxisIndex: 0,
|
||||
data: maxValues,
|
||||
barWidth: 45,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)',
|
||||
barBorderRadius: [0, 22, 22, 0]
|
||||
color: "rgba(255, 255, 255, 0.1)",
|
||||
barBorderRadius: [0, 22, 22, 0],
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'right',
|
||||
textStyle: { color: '#ffffff', fontSize: 20 },
|
||||
formatter: '{c}'
|
||||
}
|
||||
position: "right",
|
||||
textStyle: { color: "#ffffff", fontSize: 20 },
|
||||
formatter: "{c}",
|
||||
},
|
||||
},
|
||||
itemStyle: { normal: { barBorderRadius: [0, 22, 22, 0] } },
|
||||
}, {
|
||||
name: 'Min',
|
||||
type: 'bar',
|
||||
},
|
||||
{
|
||||
name: "Min",
|
||||
type: "bar",
|
||||
xAxisIndex: 1,
|
||||
yAxisIndex: 1,
|
||||
data: minValues,
|
||||
barWidth: 45,
|
||||
showBackground: true,
|
||||
backgroundStyle: {
|
||||
color: 'rgba(255, 255, 255, 0.1)',
|
||||
barBorderRadius: [0, 22, 22, 0]
|
||||
color: "rgba(255, 255, 255, 0.1)",
|
||||
barBorderRadius: [0, 22, 22, 0],
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: 'right',
|
||||
textStyle: { color: '#ffffff', fontSize: 20 },
|
||||
formatter: '{c}'
|
||||
}
|
||||
position: "right",
|
||||
textStyle: { color: "#ffffff", fontSize: 20 },
|
||||
formatter: "{c}",
|
||||
},
|
||||
},
|
||||
itemStyle: { normal: { barBorderRadius: [0, 22, 22, 0] } },
|
||||
}]
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
myChartRanking.setOption(option);
|
||||
}
|
||||
|
||||
function renderMapPoints() {
|
||||
var html = '';
|
||||
var html = "";
|
||||
allEnterprises.forEach((item) => {
|
||||
html += '<div class="map-point ' + (item.value > 8000 ? 'super' : '') + '" id="point-' + item.id + '" style="left:' + item.x + '%; top:' + item.y + '%;" onclick="handleMapClick(' + item.id + ')">';
|
||||
html +=
|
||||
'<div class="map-point ' +
|
||||
(item.value > 8000 ? "super" : "") +
|
||||
'" id="point-' +
|
||||
item.id +
|
||||
'" style="left:' +
|
||||
item.x +
|
||||
"%; top:" +
|
||||
item.y +
|
||||
'%;" onclick="handleMapClick(' +
|
||||
item.id +
|
||||
')">';
|
||||
html += '<div class="map-tooltip" onclick="event.stopPropagation()">'; // Stop prop to prevent point click
|
||||
html += '<div class="map-tooltip-row" style="font-weight:bold; color:#00eaff; font-size:22px; margin-bottom:10px; cursor:pointer;" onclick="handleMapClick(' + item.id + ')">' + item.name + '</div>';
|
||||
html += '<div class="map-tooltip-row"><span class="map-tooltip-label">瞬时流量:</span><span class="clickable-val" onclick="showHistoryModal(\'instant\', ' + item.id + ')">' + item.value + ' m³/h</span></div>';
|
||||
html += '<div class="map-tooltip-row"><span class="map-tooltip-label">累计流量:</span><span class="clickable-val" onclick="showHistoryModal(\'cumulative\', ' + item.id + ')">' + (item.value * 24) + ' m³</span></div>';
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
html +=
|
||||
'<div class="map-tooltip-row" style="font-weight:bold; color:#00eaff; font-size:22px; margin-bottom:10px; cursor:pointer;" onclick="handleMapClick(' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.name +
|
||||
"</div>";
|
||||
html +=
|
||||
'<div class="map-tooltip-row"><span class="map-tooltip-label">瞬时流量:</span><span class="clickable-val" onclick="showHistoryModal(\'instant\', ' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.value +
|
||||
" m³/h</span></div>";
|
||||
html +=
|
||||
'<div class="map-tooltip-row"><span class="map-tooltip-label">累计流量:</span><span class="clickable-val" onclick="showHistoryModal(\'cumulative\', ' +
|
||||
item.id +
|
||||
')">' +
|
||||
item.value * 24 +
|
||||
" m³</span></div>";
|
||||
html += "</div>";
|
||||
html += "</div>";
|
||||
});
|
||||
$('#mapContainer').html(html);
|
||||
$("#mapContainer").html(html);
|
||||
}
|
||||
|
||||
function closeModal() {
|
||||
$('#historyModal').fadeOut();
|
||||
$("#historyModal").fadeOut();
|
||||
}
|
||||
|
||||
var modalChartInstance = null;
|
||||
|
||||
function showHistoryModal(type, id) {
|
||||
var ent = allEnterprises.find(e => e.id === id);
|
||||
if(!ent) return;
|
||||
var ent = allEnterprises.find((e) => e.id === id);
|
||||
if (!ent) return;
|
||||
|
||||
$('#historyModal').css('display', 'flex').hide().fadeIn();
|
||||
$("#historyModal").css("display", "flex").hide().fadeIn();
|
||||
|
||||
if(modalChartInstance) {
|
||||
if (modalChartInstance) {
|
||||
modalChartInstance.dispose();
|
||||
}
|
||||
modalChartInstance = echarts.init(document.getElementById('modalChart'));
|
||||
modalChartInstance = echarts.init(
|
||||
document.getElementById("modalChart"),
|
||||
);
|
||||
|
||||
var title = (type === 'instant' ? '瞬时排污量' : '累计流量') + '历史曲线 - ' + ent.name;
|
||||
$('#modalTitle').text(title);
|
||||
var title =
|
||||
(type === "instant" ? "瞬时排污量" : "累计流量") +
|
||||
"历史曲线 - " +
|
||||
ent.name;
|
||||
$("#modalTitle").text(title);
|
||||
|
||||
var xData, yData, color;
|
||||
if(type === 'instant') {
|
||||
if (type === "instant") {
|
||||
xData = [];
|
||||
for(var i=0; i<72; i++) xData.push(i + 'h');
|
||||
for (var i = 0; i < 72; i++) xData.push(i + "h");
|
||||
yData = ent.instantHistory;
|
||||
color = '#ffaa00';
|
||||
color = "#ffaa00";
|
||||
} else {
|
||||
xData = [];
|
||||
for(var j=0; j<14; j++) xData.push('D' + (j+1));
|
||||
for (var j = 0; j < 14; j++) xData.push("D" + (j + 1));
|
||||
yData = ent.cumulativeHistory;
|
||||
color = '#00eaff';
|
||||
color = "#00eaff";
|
||||
}
|
||||
|
||||
var option = {
|
||||
tooltip: { trigger: 'axis', backgroundColor: 'rgba(0,0,0,0.8)', textStyle: {color: '#fff'} },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '10%', containLabel: true },
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
backgroundColor: "rgba(0,0,0,0.8)",
|
||||
textStyle: { color: "#fff" },
|
||||
},
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "10%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
data: xData,
|
||||
axisLabel: { color: '#fff', fontSize: 16 },
|
||||
axisLine: { lineStyle: { color: '#00eaff' } }
|
||||
axisLabel: { color: "#fff", fontSize: 16 },
|
||||
axisLine: { lineStyle: { color: "#00eaff" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#fff', fontSize: 16 },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#fff", fontSize: 16 },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: type === 'instant' ? '瞬时流量' : '累计流量',
|
||||
type: 'line',
|
||||
series: [
|
||||
{
|
||||
name: type === "instant" ? "瞬时流量" : "累计流量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
data: yData,
|
||||
lineStyle: { width: 3, color: color },
|
||||
areaStyle: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
|
||||
offset: 0, color: color
|
||||
}, {
|
||||
offset: 1, color: 'rgba(0,0,0,0)'
|
||||
}])
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{
|
||||
offset: 0,
|
||||
color: color,
|
||||
},
|
||||
itemStyle: { color: color }
|
||||
}]
|
||||
{
|
||||
offset: 1,
|
||||
color: "rgba(0,0,0,0)",
|
||||
},
|
||||
]),
|
||||
},
|
||||
itemStyle: { color: color },
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
modalChartInstance.setOption(option);
|
||||
@ -666,7 +785,7 @@
|
||||
|
||||
function handleMapClick(id) {
|
||||
// Find if this enterprise is in currentMaxData
|
||||
var index = currentMaxData.findIndex(e => e.id === id);
|
||||
var index = currentMaxData.findIndex((e) => e.id === id);
|
||||
if (index !== -1) {
|
||||
currentFocusIndex = index;
|
||||
updateDetailView();
|
||||
@ -678,32 +797,34 @@
|
||||
// If clicked item is not in Top 10, we can still show it in Detail View
|
||||
// But rotation logic might overwrite it next tick.
|
||||
// Let's just show it temporarily.
|
||||
var enterprise = allEnterprises.find(e => e.id === id);
|
||||
if(enterprise) {
|
||||
var enterprise = allEnterprises.find((e) => e.id === id);
|
||||
if (enterprise) {
|
||||
renderDetailContent(enterprise);
|
||||
highlightMapPoint(enterprise.id);
|
||||
// Clear ranking highlight since it's not in the list (visually)
|
||||
$('.ranking-row').removeClass('active');
|
||||
$(".ranking-row").removeClass("active");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startDataSimulation(enterprises) {
|
||||
setInterval(function() {
|
||||
setInterval(function () {
|
||||
// Randomize values
|
||||
enterprises.forEach(item => {
|
||||
enterprises.forEach((item) => {
|
||||
item.value += Math.floor(Math.random() * 200) - 100;
|
||||
if(item.value < 0) item.value = 0;
|
||||
item.indicator = item.value > 8000 ? '超级' : '普通';
|
||||
if (item.value < 0) item.value = 0;
|
||||
item.indicator = item.value > 8000 ? "超级" : "普通";
|
||||
|
||||
// Update Map Point Style
|
||||
var el = $('#point-' + item.id);
|
||||
if(item.value > 8000) {
|
||||
el.addClass('super');
|
||||
var el = $("#point-" + item.id);
|
||||
if (item.value > 8000) {
|
||||
el.addClass("super");
|
||||
} else {
|
||||
el.removeClass('super');
|
||||
el.removeClass("super");
|
||||
}
|
||||
el.find('.map-tooltip').html(item.name + '<br>排污量: ' + item.value);
|
||||
el.find(".map-tooltip").html(
|
||||
item.name + "<br>排污量: " + item.value,
|
||||
);
|
||||
});
|
||||
|
||||
updateSortedData(enterprises);
|
||||
@ -721,15 +842,15 @@
|
||||
}
|
||||
|
||||
function startRotation() {
|
||||
rotationTimer = setInterval(function() {
|
||||
rotationTimer = setInterval(function () {
|
||||
currentFocusIndex = (currentFocusIndex + 1) % 10;
|
||||
updateDetailView();
|
||||
}, 10000); // Rotate every 5 seconds
|
||||
}
|
||||
|
||||
function updateDetailView() {
|
||||
if(!currentMaxData || currentMaxData.length === 0) return;
|
||||
if(currentFocusIndex >= currentMaxData.length) currentFocusIndex = 0;
|
||||
if (!currentMaxData || currentMaxData.length === 0) return;
|
||||
if (currentFocusIndex >= currentMaxData.length) currentFocusIndex = 0;
|
||||
|
||||
var enterprise = currentMaxData[currentFocusIndex];
|
||||
|
||||
@ -743,16 +864,16 @@
|
||||
}
|
||||
|
||||
function highlightMapPoint(id) {
|
||||
$('.map-point').removeClass('active');
|
||||
$('#point-' + id).addClass('active');
|
||||
$(".map-point").removeClass("active");
|
||||
$("#point-" + id).addClass("active");
|
||||
}
|
||||
|
||||
function renderDetailContent(enterprise) {
|
||||
// Update DOM
|
||||
$('#detailTitle').text(enterprise.name);
|
||||
$('#sewageType').text(enterprise.sewageType);
|
||||
$('#dischargeVolume').text(enterprise.value + ' m³');
|
||||
$('#connectionStatus').text(enterprise.connectionStatus);
|
||||
$("#detailTitle").text(enterprise.name);
|
||||
$("#sewageType").text(enterprise.sewageType);
|
||||
$("#dischargeVolume").text(enterprise.value + " m³");
|
||||
$("#connectionStatus").text(enterprise.connectionStatus);
|
||||
|
||||
renderDetailCharts(enterprise);
|
||||
}
|
||||
@ -760,66 +881,90 @@
|
||||
function renderDetailCharts(enterprise) {
|
||||
// Generate X labels
|
||||
var hours = [];
|
||||
for(var i=0; i<72; i++) hours.push(i+'h');
|
||||
for (var i = 0; i < 72; i++) hours.push(i + "h");
|
||||
|
||||
var days = [];
|
||||
for(var j=0; j<14; j++) days.push('D'+(j+1));
|
||||
for (var j = 0; j < 14; j++) days.push("D" + (j + 1));
|
||||
|
||||
// Instant Chart (Line)
|
||||
var optionInstant = {
|
||||
tooltip: { trigger: 'axis' },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '15%', containLabel: true },
|
||||
tooltip: { trigger: "axis" },
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "15%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
boundaryGap: false,
|
||||
data: hours,
|
||||
axisLabel: { color: '#ccc' },
|
||||
axisLine: { lineStyle: { color: '#00eaff' } }
|
||||
axisLabel: { color: "#ccc" },
|
||||
axisLine: { lineStyle: { color: "#00eaff" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#ccc' },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#ccc" },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: '瞬时量',
|
||||
type: 'line',
|
||||
series: [
|
||||
{
|
||||
name: "瞬时量",
|
||||
type: "line",
|
||||
smooth: true,
|
||||
symbol: 'none',
|
||||
sampling: 'average',
|
||||
itemStyle: { color: '#00eaff' },
|
||||
areaStyle: { normal: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 234, 255, 0.5)' }, { offset: 1, color: 'rgba(0, 234, 255, 0)' }]) } },
|
||||
data: enterprise.instantHistory
|
||||
}]
|
||||
symbol: "none",
|
||||
sampling: "average",
|
||||
itemStyle: { color: "#00eaff" },
|
||||
areaStyle: {
|
||||
normal: {
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "rgba(0, 234, 255, 0.5)" },
|
||||
{ offset: 1, color: "rgba(0, 234, 255, 0)" },
|
||||
]),
|
||||
},
|
||||
},
|
||||
data: enterprise.instantHistory,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// Cumulative Chart (Bar)
|
||||
var optionCumulative = {
|
||||
tooltip: { trigger: 'axis' },
|
||||
grid: { left: '3%', right: '4%', bottom: '3%', top: '15%', containLabel: true },
|
||||
tooltip: { trigger: "axis" },
|
||||
grid: {
|
||||
left: "3%",
|
||||
right: "4%",
|
||||
bottom: "3%",
|
||||
top: "15%",
|
||||
containLabel: true,
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
type: "category",
|
||||
data: days,
|
||||
axisLabel: { color: '#ccc' },
|
||||
axisLine: { lineStyle: { color: '#ffaa00' } }
|
||||
axisLabel: { color: "#ccc" },
|
||||
axisLine: { lineStyle: { color: "#ffaa00" } },
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: { color: '#ccc' },
|
||||
splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } }
|
||||
type: "value",
|
||||
axisLabel: { color: "#ccc" },
|
||||
splitLine: { lineStyle: { color: "rgba(255,255,255,0.1)" } },
|
||||
},
|
||||
series: [{
|
||||
name: '累计流量',
|
||||
type: 'bar',
|
||||
itemStyle: { normal: { color: '#ffaa00', barBorderRadius: [5, 5, 0, 0] } },
|
||||
data: enterprise.cumulativeHistory
|
||||
}]
|
||||
series: [
|
||||
{
|
||||
name: "累计流量",
|
||||
type: "bar",
|
||||
itemStyle: {
|
||||
normal: { color: "#ffaa00", barBorderRadius: [5, 5, 0, 0] },
|
||||
},
|
||||
data: enterprise.cumulativeHistory,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
myChartInstant.setOption(optionInstant);
|
||||
myChartCumulative.setOption(optionCumulative);
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user