Merge remote-tracking branch 'origin/deng' into deng

This commit is contained in:
Timer
2026-03-05 02:59:30 +08:00
21 changed files with 5019 additions and 3070 deletions

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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";

View File

@ -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);
}

View File

@ -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>

View File

@ -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);

View File

@ -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

View File

@ -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

View 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;
}

View File

@ -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);

View 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();
});

Binary file not shown.

View 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>

View File

@ -1,70 +1,619 @@
<%@ 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 {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: auto; /* Allow scrolling if window is smaller */
background-color: #030829;
}
.screen-container {
width: 6500px;
height: 1800px;
background-image: url('<%=request.getContextPath()%>/IMG/screen1-1.png');
/* background-image: url('../../IMG/screen1-1.png'); */
background-size: 100% 100%;
background-repeat: no-repeat;
position: relative;
}
/* Specific Position for Data 6040 */
.val-6040 {
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-weight: 900;
font-size: 50px;
z-index: 10;
text-align: center;
line-height: 62px;
}
.val-4197 {
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 {
top: 335px;
left: 975px;
width: fit-content;
height: fit-content;
display: inline-flex;
place-content: flex-start;
place-items: flex-end;
gap: 8px;
}
body,
html {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: auto; /* Allow scrolling if window is smaller */
background-color: #030829;
}
.screen-container {
width: 6500px;
height: 1800px;
background-image: url('<%=request.getContextPath()%>/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 */
.slqs {
position: absolute;
width: 121px;
height: 62px;
color: rgba(255, 255, 255, 1);
font-family: "Gilroy", "DIN Alternate", "Arial Narrow", sans-serif;
font-weight: 900;
font-size: 50px;
z-index: 10;
text-align: center;
line-height: 62px;
}
.slqs-jinri {
top: 335px;
left: 209px;
}
.slqs-zuori {
top: 335px;
left: 592px;
}
.slqs-benyue {
top: 335px;
left: 975px;
}
.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>
<!-- 七日水量 -->
<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.00020.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.00020.000</td>
</tr>
<tr>
<td>NH3N (mg/L)</td>
<td>13.186</td>
<td>12.996</td>
<td>14.666</td>
<td>11.92</td>
<td>0.00020.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.00020.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.00020.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.00020.000</td>
</tr>
<tr>
<td>温度(℃)</td>
<td>13.186</td>
<td>12.996</td>
<td>14.666</td>
<td>11.92</td>
<td>0.00020.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>
</body>
<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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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">&times;</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>

View File

@ -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%;">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff