| | |
| | | import java.util.Map; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.http.HttpRequest; |
| | | import cn.hutool.http.HttpResponse; |
| | | import cn.hutool.json.JSONObject; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.javaweb.cms.util.CmsConstants; |
| | | import com.javaweb.common.core.domain.AjaxResult; |
| | | import com.javaweb.common.utils.Arith; |
| | | import com.javaweb.geo.domain.Hole; |
| | | import com.javaweb.geo.domain.HoleMedia; |
| | | import com.javaweb.geo.domain.Project; |
| | | import com.javaweb.geo.domain.TubLog; |
| | | import com.javaweb.geo.domain.*; |
| | | import com.javaweb.geo.enums.RecordType; |
| | | import com.javaweb.geo.mapper.ProjectCameraMapper; |
| | | import com.javaweb.geo.mapper.TubLogMapper; |
| | | import com.javaweb.geo.service.IHoleMediaService; |
| | | import com.javaweb.geo.service.IHoleService; |
| | | import com.javaweb.geo.service.IProjectCameraService; |
| | | import com.javaweb.geo.service.IProjectService; |
| | | import com.javaweb.geo.vo.IndexVo; |
| | | import com.javaweb.geo.vo.ProjectProcessVO; |
| | |
| | | import org.springframework.stereotype.Controller; |
| | | import org.springframework.ui.ModelMap; |
| | | import org.springframework.util.ObjectUtils; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import com.javaweb.common.config.Global; |
| | | import com.javaweb.common.core.controller.BaseController; |
| | | import com.javaweb.framework.util.ShiroUtils; |
| | |
| | | import com.javaweb.system.domain.SysUser; |
| | | import com.javaweb.system.service.ISysMenuService; |
| | | |
| | | |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.ResponseBody; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | |
| | | */ |
| | | @Controller |
| | | public class SysIndexController extends BaseController { |
| | | |
| | | private String prefix = "system/camera_tub"; |
| | | |
| | | |
| | | private String appkey = "af786eacc71d43ef9393c028cf4face7"; |
| | | private String secret = "9ad87671f63d2258af6fd9b2e5fa6005"; |
| | | private String postUrl ="https://open.ys7.com/api/lapp/token/get"; |
| | | |
| | | @Autowired |
| | | private ISysMenuService menuService; |
| | | |
| | |
| | | @Autowired |
| | | private ProjectCameraMapper projectCameraMapper; |
| | | |
| | | @Autowired |
| | | private IProjectCameraService cameraService; |
| | | |
| | | |
| | | private String getAdminIndex() { |
| | | return configService.selectConfigByKey(CmsConstants.KEY_ADMIN_INDEX); |
| | |
| | | @RequestMapping("/admin") |
| | | public String admin() { |
| | | return "forward:/index"; |
| | | } |
| | | |
| | | @RequestMapping("/system/camera") |
| | | public String cameraList() { |
| | | return prefix + "/camera_list"; |
| | | } |
| | | |
| | | @RequestMapping("/system/tub") |
| | | public String tubList() { |
| | | return prefix + "/tub_list"; |
| | | } |
| | | |
| | | // 系统首页 |
| | |
| | | return ajaxResult; |
| | | } |
| | | |
| | | /** |
| | | * 获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | @ResponseBody |
| | | @GetMapping("/system/stat/cameraData") |
| | | public AjaxResult cameraData() { |
| | | AjaxResult ajaxResult = new AjaxResult(); |
| | | List<ProjectCamera> cameraDataList = cameraService.selectCameraDataOnLine(); |
| | | ajaxResult.put("cameraData",cameraDataList); |
| | | return ajaxResult; |
| | | } |
| | | |
| | | /** |
| | | * 根据projectId获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | @ResponseBody |
| | | @GetMapping("/system/stat/cameraData/{projectId}") |
| | | public AjaxResult cameraData2(@PathVariable("projectId") String projectId) { |
| | | AjaxResult ajaxResult = new AjaxResult(); |
| | | |
| | | ProjectCamera param = new ProjectCamera(); |
| | | param.setProjectId(projectId); |
| | | List<ProjectCamera> cameraDataList = cameraService.selectProjectCameraList(param); |
| | | if (!ObjectUtils.isEmpty(cameraDataList)){ |
| | | for (ProjectCamera item : cameraDataList) { |
| | | String url = item.getIp(); |
| | | Map<String, Object> paramMap = new HashMap<>(); |
| | | paramMap.put("appKey", appkey); |
| | | paramMap.put("appSecret", secret); |
| | | |
| | | HttpResponse response = HttpRequest.post(postUrl) .form(paramMap).execute(); |
| | | String body = response.body(); |
| | | JSONObject jsonObject = JSONUtil.parseObj(body); |
| | | String code = jsonObject.getStr("code"); |
| | | StringBuffer buffer = new StringBuffer(); |
| | | if(code.equals("200")){ |
| | | JSONObject data = (JSONObject) jsonObject.get("data"); |
| | | String token = data.getStr("accessToken"); |
| | | buffer.append("https://open.ys7.com/console/jssdk/pc.html?accessToken="); |
| | | buffer.append(token); |
| | | buffer.append("&url="); |
| | | buffer.append(url); |
| | | } |
| | | logger.debug(buffer.toString()); |
| | | item.setUrl(buffer.toString()); |
| | | } |
| | | } |
| | | ajaxResult.put("cameraDataList",cameraDataList); |
| | | return ajaxResult; |
| | | } |
| | | |
| | | /** |
| | | * 根据projectId获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | @GetMapping("/player") |
| | | public String player(String projectId,ModelMap mmap) { |
| | | ProjectCamera param = new ProjectCamera(); |
| | | param.setProjectId(projectId); |
| | | List<ProjectCamera> cameraDataList = cameraService.selectProjectCameraList(param); |
| | | if (!ObjectUtils.isEmpty(cameraDataList)){ |
| | | for (ProjectCamera item : cameraDataList) { |
| | | String url = item.getIp(); |
| | | Map<String, Object> paramMap = new HashMap<>(); |
| | | paramMap.put("appKey", appkey); |
| | | paramMap.put("appSecret", secret); |
| | | |
| | | HttpResponse response = HttpRequest.post(postUrl) .form(paramMap).execute(); |
| | | String body = response.body(); |
| | | JSONObject jsonObject = JSONUtil.parseObj(body); |
| | | String code = jsonObject.getStr("code"); |
| | | StringBuffer buffer = new StringBuffer(); |
| | | if(code.equals("200")){ |
| | | JSONObject data = (JSONObject) jsonObject.get("data"); |
| | | String token = data.getStr("accessToken"); |
| | | buffer.append("https://open.ys7.com/console/jssdk/pc.html?accessToken="); |
| | | buffer.append(token); |
| | | buffer.append("&url="); |
| | | buffer.append(url); |
| | | } |
| | | item.setUrl(buffer.toString()); |
| | | } |
| | | } |
| | | |
| | | mmap.put("cameraDataList",cameraDataList); |
| | | return prefix + "/player2"; |
| | | } |
| | | |
| | | } |
| | |
| | | [v-cloak]{ |
| | | display: none; |
| | | } |
| | | .el-card__header{ |
| | | height: 40px; |
| | | padding: 8px 20px; |
| | | } |
| | | .active-red{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #F56C6C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-yellow{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #E6A23C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-blue{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #67C23A; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | .cdcode{ |
| | | width: 15%; |
| | | float: left; |
| | | margin-left: 10px; |
| | | font-size: 16px; |
| | | line-height: 20px; |
| | | } |
| | | .cdstatus{ |
| | | width: 15%; |
| | | float: left; |
| | | margin-left: 0px; |
| | | font-size: 16px; |
| | | line-height: 20px; |
| | | } |
| | | .cdprocess{ |
| | | width: 60%; |
| | | float: left; |
| | | margin-left: 10px; |
| | | } |
| | | .rankrow{ |
| | | margin-top: 12px; |
| | | cursor: pointer; |
| | | } |
| | | .ilblock{ |
| | | border-left: 1px solid #e3e5e7; |
| | | padding: 0 40px; |
| | | align-content: center; |
| | | } |
| | | .ilblock>span{ |
| | | display: block; |
| | | line-height: 30px; |
| | | } |
| | | |
| | | |
| | | <!-- 表格样式 --> |
| | | .el-table, .el-table__expanded-cell { |
| | | background-color: transparent; |
| | | color: #4D4D4D; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .el-table th, |
| | | .el-table tr, |
| | | .el-table td { |
| | |
| | | font-family: Source Han Sans CN Normal, Source Han Sans CN Normal-Normal; |
| | | font-weight: Normal; |
| | | } |
| | | .el-table::before { |
| | | height: 0px; |
| | | } |
| | | .el-table__body tr, |
| | | .el-table__body td { |
| | | padding: 0; |
| | | height: 22px; |
| | | } |
| | | .el-table__row.warning-row { |
| | | background:rgb(252,212,165); |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar-track { |
| | | background-color: rgb(252,212,165); |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar { |
| | | width: 10px; |
| | | opacity: 0.5; |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar-thumb { |
| | | border-radius: 15px; |
| | | background-color:rgb(252,212,165); |
| | | .custom-icon:hover { |
| | | color: #0981ea; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body class="gray-bg"> |
| | | <div class="content" id="app" v-cloak> |
| | | <el-row style="height: 127px;"> |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;" > |
| | | <div> |
| | | <li class="el-icon-s-promotion" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #409eff;"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">场地数量</span> |
| | | </div> |
| | | <div style="text-align: center;"> |
| | | <span style="color:#ED1C24;font-size: 30px;word-break: break-all;line-height: 70px">34 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 协调中 |
| | | <span style="float: right">{{indexDataCount.projectStatus0}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 待开工 |
| | | <span style="float: right">{{indexDataCount.projectStatus1}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #e6a23c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 进行中 |
| | | <span style="float: right">{{indexDataCount.projectStatus2}}</span> |
| | | <!-- <li class="el-icon-caret-top" style="color: #409eff">--> |
| | | </span> |
| | | |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-coin" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #085abe"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">钻孔进尺</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#1894F6;font-size: 30px;word-break: break-all;line-height: 70px;">647 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 总进尺 <span style="float: right">{{indexDataCount.footageCount}}m</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 已完成 <span style="float: right">{{indexDataCount.footageCplCount}}m</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-video-camera" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #11d713"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">实时监控</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#F7931E;font-size: 30px;word-break: break-all;line-height: 70px">68 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <div> |
| | | |
| | | </div> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 已安装 <span style="float: right">{{indexDataCount.cameraCount}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 未安装 <span style="float: right">{{indexDataCount.cameraCountNaN}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-s-order" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #917ed0"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">资料文件</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#F7931E;font-size: 30px;word-break: break-all;line-height: 70px;"> |
| | | {{indexDataCount.fileCount}} |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 施工资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 安全资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 质量资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="16"> |
| | | <el-card class="box-card"> |
| | | <div style="height: 200px;width: 100%;"> |
| | | <h3>材料统计</h3> |
| | | <el-col :span="10" style="height: 200px;"> |
| | | <div style="margin-top: 15px"> |
| | | <template> |
| | | <el-table :data="tubLogs" border size="small" style="width: 100%" |
| | | :header-cell-style="{color: '#4D4D4D',background: '#F7931E',fontWeight: '400'}" |
| | | :row-class-name="tableRowClassName"> |
| | | <!-- <el-table-column prop="code" label="序号"></el-table-column>--> |
| | | <el-table-column prop="tubName" label="名称"></el-table-column> |
| | | <el-table-column prop="inboundNumber" label="入库数量"></el-table-column> |
| | | <el-table-column prop="outboundNumber" label="出库数量"></el-table-column> |
| | | <el-table-column prop="unit" label="单位"></el-table-column> |
| | | |
| | | </el-table> |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="14" style="height: 200px;"> |
| | | <div id="column-chart" style="height: 180px; width: 100%;"></div> |
| | | </el-col> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div id="map_div" style="width: 100%;height: 550px;margin-top: -5px"></div> |
| | | </el-card> |
| | | |
| | | </el-col> |
| | | |
| | | <el-col :span="8"> |
| | | <el-card class="box-card"> |
| | | <div style="height: 200px;width: 100%"> |
| | | <div style="width: 100%;height: 20px;"> |
| | | <h3>项目总体进度(%)</h3> |
| | | </div> |
| | | <div id="Chart1" style="width: 80%;height: 180px;margin-left: 10%;"></div> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div style="width: 100%"> |
| | | <div style="width: 100%;height: 20px;margin-bottom: 10px;text-align: center;"> |
| | | <h3>场地详细进度(%)</h3> |
| | | </div> |
| | | <div style="width: 100%;height: 500px;overflow: auto"> |
| | | |
| | | <el-row class="rankrow" v-for='entity in stationProcessData' @click.native='viewStation(entity)'> |
| | | <el-col :span="2" > |
| | | <div v-if="entity.status=='协调中'" class="active-red">{{entity.ranking}}</div> |
| | | <div v-if="entity.status=='待开工'" class="active-yellow">{{entity.ranking}}</div> |
| | | <div v-if="entity.status=='进行中'" class="active-blue">{{entity.ranking}}</div> |
| | | |
| | | </el-col> |
| | | |
| | | <el-col :span="7"> |
| | | <div style="font-size: 16px">{{entity.station}}</div> |
| | | </el-col > |
| | | |
| | | <el-col :span="5"> |
| | | <div style="font-size: 16px">{{entity.status}}</div> |
| | | </el-col> |
| | | |
| | | <el-col :span="8"> |
| | | <div> |
| | | <el-progress :stroke-width="10" :percentage="entity.value"></el-progress> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | |
| | | </el-card> |
| | | |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | <div id="map_div" style="position:fixed;width: 100%;height: 100vh;margin-top: -5px"></div> |
| | | <div style="position:fixed;top: 5px"> |
| | | <li onclick="careraFunction()" class="el-icon-video-camera custom-icon" style="font-size: 100px;margin-right: 5px;margin-left: -5px;"></li> |
| | | <li onclick="tubFunction()" class="el-icon-user custom-icon" style="font-size: 100px;margin-right: 5px;margin-left: -5px;"></li> |
| | | </div> |
| | | <div id="Chart1" style="position:fixed;width: 300px;height: 300px;bottom: -60px;right: -40px"></div> |
| | | |
| | | </div> |
| | | |
| | |
| | | loadMap(); |
| | | getReallyData(); |
| | | totalProcess(); |
| | | stationProcess(); |
| | | indexCount(); |
| | | tubLogs(); |
| | | //stationProcess(); |
| | | //indexCount(); |
| | | //tubLogs(); |
| | | }) |
| | | //场地和地图点击联动 |
| | | function viewStation(station) { |
| | |
| | | $.ajaxSettings.async = false; |
| | | |
| | | } |
| | | |
| | | //摄像头列表 |
| | | function careraFunction() { |
| | | let url = ctx + "/system/camera"; |
| | | $.modal.openTab("摄像头列表",url); |
| | | } |
| | | |
| | | //管材统计 |
| | | function tubFunction() { |
| | | let url = ctx + "/system/tub"; |
| | | $.modal.openTab("管材统计",url); |
| | | } |
| | | |
| | | //场地进度 |
| | | function stationProcess() { |
| | | let url = ctx + "/system/stat/projectProcess"; |
| | |
| | | map.addOverLay(countriesOverlay1) |
| | | countriesOverlay.bringToBack(); |
| | | }); |
| | | |
| | | //map.setStyle("indigo"); |
| | | } |
| | | |
| | | function init(sel, transform) { |
| | |
| | | } |
| | | //地图上展示项目点 |
| | | function showProjectPoint(data){ |
| | | var projectIcon = new T.Icon({ |
| | | iconUrl: '/bjfw/images/icon/6.png', |
| | | iconSize: new T.Point(30, 30), |
| | | iconAnchor: new T.Point(6, 40), |
| | | }); |
| | | var projectIcon; |
| | | for(let i =0;i<data.length;i++){ |
| | | |
| | | if (data[i].status === '1'){ |
| | | projectIcon = new T.Icon({ |
| | | iconUrl: '/bjfw/images/icon/yellow.png', |
| | | iconSize: new T.Point(30, 30), |
| | | iconAnchor: new T.Point(6, 40), |
| | | }); |
| | | }else if (data[i].status === '2'){ |
| | | projectIcon = new T.Icon({ |
| | | iconUrl: '/bjfw/images/icon/blue.png', |
| | | iconSize: new T.Point(30, 30), |
| | | iconAnchor: new T.Point(6, 40), |
| | | }); |
| | | }else { |
| | | projectIcon = new T.Icon({ |
| | | iconUrl: '/bjfw/images/icon/red.png', |
| | | iconSize: new T.Point(30, 30), |
| | | iconAnchor: new T.Point(6, 40), |
| | | }); |
| | | } |
| | | |
| | | let lng = data[i].lng; |
| | | let lat = data[i].lat; |
| | | let marker = new T.Marker(new T.LngLat(lng, lat), { title: "场地位置",icon:projectIcon}); |
| | | let proj = infoWindowProject(data[i]); |
| | | addClickHandler(proj, marker); |
| | | |
| | | map.addOverLay(marker); |
| | | } |
| | | |
| | |
| | | "<font style='font-weight: bolder;'>场地编号 :</font>" + e.code + "<br>" + |
| | | "<font style='font-weight: bolder;'>场地名字 :</font>" + e.fullName + "<br>" + |
| | | "<font style='font-weight: bolder;'>负责人 :</font>" + e.leader + "<br>" + |
| | | "<a class='btn' onclick=viewdata(" +"'" + ids+ "'" + ")>场地数据</a>" + |
| | | "<a class='btn' onclick=viewdata(" +"'" + ids+ "'" + ")>场地数据</a>" + "<br>" + |
| | | "</div>" + |
| | | "</div>" + |
| | | "</div>"; |
| | |
| | | |
| | | function addClickHandler(content, marker) { |
| | | marker.addEventListener("click", function (e) { |
| | | console.log("你点击了",content); |
| | | openInfo(content, e) |
| | | }); |
| | | } |
| | |
| | | |
| | | $.ajaxSettings.async = false; |
| | | var option = { |
| | | backgroundColor: "#fff", |
| | | backgroundColor: "transparent", |
| | | series: [ |
| | | { |
| | | type: "gauge", |
| | |
| | | Chart1.setOption(option); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh" xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <th:block th:include="include :: header('弹层组件')" /> |
| | | <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/animate.min.css" th:href="@{/css/main/animate.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/style.min862f.css" th:href="@{/css/main/style.min862f.css}" rel="stylesheet" /> |
| | | <link rel="stylesheet" th:href="@{/css/custom/main.css}" /> |
| | | <link href="../static/js/elementUI/index.css" th:href="@{/js/elementUI/index.css}" rel="stylesheet" /> |
| | | |
| | | <style type="text/css"> |
| | | .content { |
| | | width: 100%; |
| | | background-color: rgba(0,0,0,0.01) !important; |
| | | padding:10px; |
| | | } |
| | | [v-cloak]{ |
| | | display: none; |
| | | } |
| | | .el-card__header{ |
| | | height: 40px; |
| | | padding: 8px 20px; |
| | | } |
| | | .active-red{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #F56C6C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-yellow{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #E6A23C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-blue{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #67C23A; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | .cdcode{ |
| | | width: 15%; |
| | | float: left; |
| | | margin-left: 10px; |
| | | font-size: 16px; |
| | | line-height: 20px; |
| | | } |
| | | .cdstatus{ |
| | | width: 15%; |
| | | float: left; |
| | | margin-left: 0px; |
| | | font-size: 16px; |
| | | line-height: 20px; |
| | | } |
| | | .cdprocess{ |
| | | width: 60%; |
| | | float: left; |
| | | margin-left: 10px; |
| | | } |
| | | .rankrow{ |
| | | margin-top: 12px; |
| | | cursor: pointer; |
| | | } |
| | | .ilblock{ |
| | | border-left: 1px solid #e3e5e7; |
| | | padding: 0 40px; |
| | | align-content: center; |
| | | } |
| | | .ilblock>span{ |
| | | display: block; |
| | | line-height: 30px; |
| | | } |
| | | |
| | | |
| | | <!-- 表格样式 --> |
| | | .el-table, .el-table__expanded-cell { |
| | | background-color: transparent; |
| | | color: #4D4D4D; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .el-table th, |
| | | .el-table tr, |
| | | .el-table td { |
| | | background-color: transparent; |
| | | border: 0px; |
| | | color: #4D4D4D; |
| | | font-size: 13px; |
| | | font-family: Source Han Sans CN Normal, Source Han Sans CN Normal-Normal; |
| | | font-weight: Normal; |
| | | } |
| | | .el-table::before { |
| | | height: 0px; |
| | | } |
| | | .el-table__body tr, |
| | | .el-table__body td { |
| | | padding: 0; |
| | | height: 22px; |
| | | } |
| | | .el-table__row.warning-row { |
| | | background:rgb(252,212,165); |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar-track { |
| | | background-color: rgb(252,212,165); |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar { |
| | | width: 10px; |
| | | opacity: 0.5; |
| | | } |
| | | .el-table__body-wrapper::-webkit-scrollbar-thumb { |
| | | border-radius: 15px; |
| | | background-color:rgb(252,212,165); |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body class="gray-bg"> |
| | | <div class="content" id="app" v-cloak> |
| | | <el-row style="height: 127px;"> |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;" > |
| | | <div> |
| | | <li class="el-icon-s-promotion" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #409eff;"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">场地数量</span> |
| | | </div> |
| | | <div style="text-align: center;"> |
| | | <span style="color:#ED1C24;font-size: 30px;word-break: break-all;line-height: 70px">34 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 协调中 |
| | | <span style="float: right">{{indexDataCount.projectStatus0}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 待开工 |
| | | <span style="float: right">{{indexDataCount.projectStatus1}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #e6a23c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 进行中 |
| | | <span style="float: right">{{indexDataCount.projectStatus2}}</span> |
| | | <!-- <li class="el-icon-caret-top" style="color: #409eff">--> |
| | | </span> |
| | | |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-coin" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #085abe"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">钻孔进尺</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#1894F6;font-size: 30px;word-break: break-all;line-height: 70px;">647 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 总进尺 <span style="float: right">{{indexDataCount.footageCount}}m</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 已完成 <span style="float: right">{{indexDataCount.footageCplCount}}m</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-video-camera" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #11d713"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">实时监控</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#F7931E;font-size: 30px;word-break: break-all;line-height: 70px">68 |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <div> |
| | | |
| | | </div> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 已安装 <span style="float: right">{{indexDataCount.cameraCount}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 未安装 <span style="float: right">{{indexDataCount.cameraCountNaN}}</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-s-order" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #917ed0"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">资料文件</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#F7931E;font-size: 30px;word-break: break-all;line-height: 70px;"> |
| | | {{indexDataCount.fileCount}} |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 施工资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 安全资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 质量资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="16"> |
| | | <el-card class="box-card"> |
| | | <div style="height: 200px;width: 100%;"> |
| | | <h3>材料统计</h3> |
| | | <el-col :span="10" style="height: 200px;"> |
| | | <div style="margin-top: 15px"> |
| | | <template> |
| | | <el-table :data="tubLogs" border size="small" style="width: 100%" |
| | | :header-cell-style="{color: '#4D4D4D',background: '#F7931E',fontWeight: '400'}" |
| | | :row-class-name="tableRowClassName"> |
| | | <!-- <el-table-column prop="code" label="序号"></el-table-column>--> |
| | | <el-table-column prop="tubName" label="名称"></el-table-column> |
| | | <el-table-column prop="inboundNumber" label="入库数量"></el-table-column> |
| | | <el-table-column prop="outboundNumber" label="出库数量"></el-table-column> |
| | | <el-table-column prop="unit" label="单位"></el-table-column> |
| | | |
| | | </el-table> |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="14" style="height: 200px;"> |
| | | <div id="column-chart" style="height: 180px; width: 100%;"></div> |
| | | </el-col> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div id="map_div" style="width: 100%;height: 550px;margin-top: -5px"></div> |
| | | </el-card> |
| | | |
| | | </el-col> |
| | | |
| | | <el-col :span="8"> |
| | | <el-card class="box-card"> |
| | | <div style="height: 200px;width: 100%"> |
| | | <div style="width: 100%;height: 20px;"> |
| | | <h3>项目总体进度(%)</h3> |
| | | </div> |
| | | <div id="Chart1" style="width: 80%;height: 180px;margin-left: 10%;"></div> |
| | | </div> |
| | | </el-card> |
| | | |
| | | <el-card class="box-card" style="margin-top: 20px;"> |
| | | <div style="width: 100%"> |
| | | <div style="width: 100%;height: 20px;margin-bottom: 10px;text-align: center;"> |
| | | <h3>场地详细进度(%)</h3> |
| | | </div> |
| | | <div style="width: 100%;height: 500px;overflow: auto"> |
| | | |
| | | <el-row class="rankrow" v-for='entity in stationProcessData' @click.native='viewStation(entity)'> |
| | | <el-col :span="2" > |
| | | <div v-if="entity.status=='协调中'" class="active-red">{{entity.ranking}}</div> |
| | | <div v-if="entity.status=='待开工'" class="active-yellow">{{entity.ranking}}</div> |
| | | <div v-if="entity.status=='进行中'" class="active-blue">{{entity.ranking}}</div> |
| | | |
| | | </el-col> |
| | | |
| | | <el-col :span="7"> |
| | | <div style="font-size: 16px">{{entity.station}}</div> |
| | | </el-col > |
| | | |
| | | <el-col :span="5"> |
| | | <div style="font-size: 16px">{{entity.status}}</div> |
| | | </el-col> |
| | | |
| | | <el-col :span="8"> |
| | | <div> |
| | | <el-progress :stroke-width="10" :percentage="entity.value"></el-progress> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | |
| | | </el-card> |
| | | |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | |
| | | </div> |
| | | |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | | <script th:src="@{/js/bootstrap.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/flot/jquery.flot.js}"></script> |
| | | <script th:src="@{/ajax/libs/report/echarts/echarts-all.js}"></script> |
| | | <script th:src="@{/js/tdt.js}" type="text/javascript"></script> |
| | | <script src="http://lbs.tianditu.gov.cn/js/lib/d3/d3.min.js" type="text/javascript"></script> |
| | | <script src="http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/D3SvgOverlay.js" type="text/javascript"></script> |
| | | <script th:src="@{/js/custom/main.js}"></script> |
| | | |
| | | <script th:src="@{/js/vue.min.js}"></script> |
| | | <script th:src="@{/js/elementUI/index.js}"></script> |
| | | |
| | | <th:block th:include="include :: sparkline-js" /> |
| | | <th:block th:include="include :: footer" /> |
| | | |
| | | <script th:inline="javascript"> |
| | | |
| | | $(function() { |
| | | loadMap(); |
| | | getReallyData(); |
| | | totalProcess(); |
| | | stationProcess(); |
| | | indexCount(); |
| | | tubLogs(); |
| | | }) |
| | | //场地和地图点击联动 |
| | | function viewStation(station) { |
| | | var lng = station.lng; |
| | | var lat = station.lat; |
| | | map.centerAndZoom(new T.LngLat(lng, lat), 13); |
| | | } |
| | | |
| | | function tubLogs() { |
| | | |
| | | const chart = echarts.init(document.getElementById("column-chart")); |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow' |
| | | } |
| | | }, |
| | | legend: {}, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: [ |
| | | { |
| | | type: 'category', |
| | | data: [] |
| | | } |
| | | ], |
| | | yAxis: [ |
| | | { |
| | | type: 'value' |
| | | } |
| | | ], |
| | | series: [ |
| | | { |
| | | name: '出库', |
| | | type: 'bar', |
| | | emphasis: { |
| | | focus: 'series' |
| | | }, |
| | | data: [], |
| | | itemStyle: { |
| | | // 修改柱子的颜色 |
| | | color: '#e2b507' |
| | | } |
| | | }, |
| | | { |
| | | name: '入库', |
| | | type: 'bar', |
| | | stack: 'Ad', |
| | | emphasis: { |
| | | focus: 'series' |
| | | }, |
| | | data: [], |
| | | itemStyle: { |
| | | // 修改柱子的颜色 |
| | | color: '#2992c6' |
| | | } |
| | | }, |
| | | |
| | | ] |
| | | }; |
| | | |
| | | let url = ctx + "/system/stat/tubLogData"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.tubLogs = res.tubLogs; |
| | | |
| | | res.tubLogs.forEach(function(value, index, array) { |
| | | const tubName = value.tubName; |
| | | const inboundNumber = value.inboundNumber; |
| | | const outboundNumber = value.outboundNumber; |
| | | const unit = value.unit; |
| | | option.xAxis[0].data[index] = tubName; |
| | | option.series[0].data[index] = outboundNumber; |
| | | option.series[1].data[index] = inboundNumber; |
| | | }); |
| | | chart.setOption(option, true); |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | } |
| | | |
| | | //首页第一行个数统计 |
| | | function indexCount() { |
| | | let url = ctx + "/system/stat/indexDataCount"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.indexDataCount = res.data; |
| | | vm.indexDataCount.cameraCountNaN = 68 -vm.indexDataCount.cameraCount; |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | |
| | | } |
| | | //场地进度 |
| | | function stationProcess() { |
| | | let url = ctx + "/system/stat/projectProcess"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.stationProcessData = res.projectData; |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | } |
| | | var vm = new Vue({ |
| | | el: "#app", |
| | | data() { |
| | | return { |
| | | stationProcessData: [], |
| | | indexDataCount :"", |
| | | tubLogs:[], |
| | | }; |
| | | }, |
| | | methods: { |
| | | tableRowClassName({ row, rowIndex }) { |
| | | if (rowIndex % 2 == 0) { |
| | | return ""; |
| | | } else { |
| | | return "warning-row"; |
| | | } |
| | | }, |
| | | } |
| | | }); |
| | | // 加载地图 |
| | | let map=null; |
| | | var countries = []; |
| | | var countriesOverlay = new T.D3Overlay(init,redraw); |
| | | var countriesOverlay1 = new T.D3Overlay(init1,redraw1); |
| | | function loadMap() { |
| | | map = new T.Map('map_div'); |
| | | map.centerAndZoom(new T.LngLat(116.38, 40.2), 9); |
| | | |
| | | var control = new T.Control.Zoom(); |
| | | control.setPosition(T_ANCHOR_TOP_RIGHT); |
| | | map.addControl(control);// 添加缩放平移控件 |
| | | var scale = new T.Control.Scale();// 创建比例尺控件对象 |
| | | d3.json("/bjfw/js/custom/beijing.json", function (data) { |
| | | countries = data.features; |
| | | map.addOverLay(countriesOverlay) |
| | | countriesOverlay.bringToBack(); |
| | | map.addOverLay(countriesOverlay1) |
| | | countriesOverlay.bringToBack(); |
| | | }); |
| | | |
| | | //map.setStyle("indigo"); |
| | | } |
| | | |
| | | function init(sel, transform) { |
| | | var upd = sel.selectAll('path.geojson').data(countries); |
| | | upd.enter() |
| | | .append('path') |
| | | .attr("class", "geojson") |
| | | .attr('stroke', 'grey') |
| | | .attr('fill', function (d, i) { |
| | | //return d3.hsl(Math.random() * 360, 0.9, 0.5) |
| | | return "transparent" |
| | | }) |
| | | .attr('fill-opacity', '0') |
| | | } |
| | | function redraw(sel, transform) { |
| | | sel.selectAll('path.geojson').each( |
| | | function (d, i) { |
| | | d3.select(this).attr('d', transform.pathFromGeojson) |
| | | } |
| | | ) |
| | | } |
| | | function init1(sel, transform) { |
| | | var upd = sel.selectAll('path.geojson1').data(countries); |
| | | upd.enter() |
| | | .append('path') |
| | | .attr("class", "geojson1") |
| | | .attr('stroke', 'grey') |
| | | .attr('fill', function (d, i) { |
| | | return d3.hsl(Math.random() * 360, 0.9, 0.5) |
| | | }) |
| | | .attr('fill-opacity', '0.1') |
| | | } |
| | | |
| | | function redraw1(sel, transform) { |
| | | sel.selectAll('path.geojson1').each( |
| | | function (d, i) { |
| | | d3.select(this).attr('d', transform.pathFromGeojson) |
| | | } |
| | | ) |
| | | } |
| | | |
| | | // 获取数据库真实数据 |
| | | function getReallyData() { |
| | | let url = window.location.protocol + "//" + window.location.host + "/bjfw/system/stat/project"; |
| | | $.get(url,function(res){ |
| | | var data = res.projects; |
| | | showProjectPoint(data); |
| | | }) |
| | | } |
| | | //地图上展示项目点 |
| | | function showProjectPoint(data){ |
| | | var projectIcon = new T.Icon({ |
| | | iconUrl: '/bjfw/images/icon/6.png', |
| | | iconSize: new T.Point(30, 30), |
| | | iconAnchor: new T.Point(6, 40), |
| | | }); |
| | | for(let i =0;i<data.length;i++){ |
| | | let lng = data[i].lng; |
| | | let lat = data[i].lat; |
| | | let marker = new T.Marker(new T.LngLat(lng, lat), { title: "场地位置",icon:projectIcon}); |
| | | let proj = infoWindowProject(data[i]); |
| | | addClickHandler(proj, marker); |
| | | map.addOverLay(marker); |
| | | } |
| | | |
| | | } |
| | | |
| | | function infoWindowProject(e){ |
| | | |
| | | let ids = e.ids + ""; |
| | | var sContent = |
| | | "<div style='margin:0px;'>" + |
| | | "<div>" + |
| | | "<div style='margin:1px 0px 1px 2px;width: 200px;'>" + |
| | | "<font style='font-weight: bolder;'>场地编号 :</font>" + e.code + "<br>" + |
| | | "<font style='font-weight: bolder;'>场地名字 :</font>" + e.fullName + "<br>" + |
| | | "<font style='font-weight: bolder;'>负责人 :</font>" + e.leader + "<br>" + |
| | | "<a class='btn' onclick=viewdata(" +"'" + ids+ "'" + ")>场地数据</a>" + |
| | | "</div>" + |
| | | "</div>" + |
| | | "</div>"; |
| | | return sContent; |
| | | } |
| | | function viewdata (id) { |
| | | $.modal.openTab("场地导航",ctx+ "/geo/project/navigate?ids="+id); |
| | | } |
| | | |
| | | function addClickHandler(content, marker) { |
| | | marker.addEventListener("click", function (e) { |
| | | openInfo(content, e) |
| | | }); |
| | | } |
| | | |
| | | function openInfo(content, e) { |
| | | var point = e.lnglat; |
| | | var markerInfoWin = new T.InfoWindow(content, { offset: new T.Point(0, -30) }); // 创建信息窗口对象 |
| | | map.openInfoWindow(markerInfoWin, point); //开启信息窗口 |
| | | } |
| | | |
| | | |
| | | //总进度仪表盘 |
| | | function totalProcess() { |
| | | var Chart1 = echarts.init(document.getElementById('Chart1')); |
| | | var pointerData = 0; // 仪表指针数据 |
| | | let url = ctx + "/system/stat/totalProcess"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | pointerData = res.pointerData; |
| | | pointerData = (pointerData*100).toFixed(0); |
| | | }); |
| | | |
| | | $.ajaxSettings.async = false; |
| | | var option = { |
| | | backgroundColor: "#fff", |
| | | series: [ |
| | | { |
| | | type: "gauge", |
| | | radius: 80, |
| | | z: 1, |
| | | startAngle: 225, |
| | | endAngle: -45, |
| | | splitNumber: 50, |
| | | title: { |
| | | color: "red", |
| | | }, |
| | | splitLine: { |
| | | show: true, |
| | | length: 15, |
| | | distance: -10, |
| | | lineStyle: { |
| | | color: "#fff", |
| | | width: 1, |
| | | }, |
| | | }, |
| | | detail: { |
| | | show: true, |
| | | offsetCenter: [0, 60], |
| | | fontSize: 22, |
| | | formatter: (val) => [`{a|${val}}`, `{b|%}`].join(""), |
| | | rich: { |
| | | a: { |
| | | fontSize: 20, |
| | | color: "rgba(84, 108, 198, 0.65)", |
| | | }, |
| | | b: { |
| | | fontSize: 24, |
| | | color: "rgba(84, 108, 198, 0.65)", |
| | | }, |
| | | }, |
| | | }, |
| | | // 仪表盘的线,颜色值为一个数组 |
| | | axisLine: { |
| | | show: true, |
| | | // 两端是否设置为圆角;在5.0之后的版本有效 |
| | | roundCap: false, |
| | | lineStyle: { |
| | | width: 15, |
| | | shadowColor: "#0093ee", //默认透明 |
| | | shadowOffsetX: 0, |
| | | shadowOffsetY: 0, |
| | | shadowBlur: 20, |
| | | opacity: 1, |
| | | color: [ |
| | | [ |
| | | pointerData / 100, |
| | | { |
| | | x: 0, |
| | | y: 0, |
| | | x1: 1, |
| | | y1: 0, |
| | | colorStops: [ |
| | | { |
| | | offset: 0, |
| | | color: "rgba(0, 255, 255, 0.6)", |
| | | }, |
| | | { |
| | | offset: 1, |
| | | color: "rgba(0, 0, 255, .6)", |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | [1, "rgba(0,0,0,0.15)"], |
| | | ], |
| | | }, |
| | | }, |
| | | // 仪表盘刻度标签 |
| | | axisLabel: { |
| | | show: true, |
| | | color: "rgba(84, 108, 198, 0.65)", |
| | | fontSize: 14, |
| | | distance: 20, |
| | | formatter: (val) => { |
| | | const num = Math.floor(val); |
| | | return num % 20 === 0 ? num : ""; |
| | | }, |
| | | }, |
| | | // 刻度 |
| | | axisTick: { |
| | | show: false, |
| | | }, |
| | | // 指针,此设置仅对5.0以上的版本生效 |
| | | anchor: { |
| | | show: true, |
| | | icon: "circle", |
| | | showAbove: true, |
| | | size: 20, |
| | | itemStyle: { |
| | | borderWidth: 6, |
| | | borderColor: "rgba(84, 108, 198, 0.85)", |
| | | }, |
| | | }, |
| | | data: [pointerData], |
| | | }, |
| | | { |
| | | // 背景渐变色 |
| | | type: "pie", |
| | | radius: "80%", |
| | | // 不响应及触发鼠标事件 |
| | | silent: true, |
| | | // 关闭背景动画 |
| | | animation: false, |
| | | z: 0, |
| | | itemStyle: { |
| | | color: { |
| | | type: "radial", // 径向渐变 |
| | | x: 0.5, |
| | | y: 0.5, |
| | | r: 0.25, |
| | | colorStops: [ |
| | | { |
| | | offset: 0, |
| | | color: "rgba(84, 103, 198, 0.6)", |
| | | }, |
| | | { |
| | | offset: 0.1, |
| | | color: "rgba(84, 103, 198, 0.35)", |
| | | }, |
| | | { |
| | | offset: 1, |
| | | color: "rgba(84, 103, 198, 0)", |
| | | }, |
| | | ], |
| | | }, |
| | | }, |
| | | data: [pointerData], |
| | | }, |
| | | ], |
| | | }; |
| | | Chart1.setOption(option); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh" xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <th:block th:include="include :: header('弹层组件')" /> |
| | | <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/animate.min.css" th:href="@{/css/main/animate.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/style.min862f.css" th:href="@{/css/main/style.min862f.css}" rel="stylesheet" /> |
| | | <link rel="stylesheet" th:href="@{/css/custom/main.css}" /> |
| | | <link href="../static/js/elementUI/index.css" th:href="@{/js/elementUI/index.css}" rel="stylesheet" /> |
| | | |
| | | <style type="text/css"> |
| | | .custom-icon { |
| | | font-size: 120px; |
| | | margin-right: 5px; |
| | | margin-left: -5px; |
| | | } |
| | | .icon-container:hover .custom-icon, |
| | | .icon-container:hover .custom-font{ |
| | | color: #0981ea; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
| | | </head> |
| | | |
| | | <body class="gray-bg"> |
| | | <div class="content" id="app" v-cloak> |
| | | <el-row> |
| | | <el-col :span="4" v-for="(item, index) in cameraData" :key="item.projectId"> |
| | | <div class="icon-container" style="margin-left: 40px;"> |
| | | <li @click="handleClick(item.projectId)" class="el-icon-video-camera-solid custom-icon"></li> |
| | | <h2 @click="handleClick(item.projectId)" class="custom-font" style="margin-top: 0px;margin-left: 0px;margin-bottom: 0px">{{item.projectName}}({{item.projectCode}})</h2> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | | <script th:src="@{/js/bootstrap.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/flot/jquery.flot.js}"></script> |
| | | <script th:src="@{/js/custom/main.js}"></script> |
| | | <script th:src="@{/js/vue.min.js}"></script> |
| | | <script th:src="@{/js/elementUI/index.js}"></script> |
| | | <th:block th:include="include :: sparkline-js" /> |
| | | <th:block th:include="include :: footer" /> |
| | | |
| | | <script th:inline="javascript"> |
| | | $(function() { |
| | | // 获取摄像头列表 |
| | | getCareraList(); |
| | | }) |
| | | |
| | | var vm = new Vue({ |
| | | el: "#app", |
| | | data() { |
| | | return { |
| | | cameraData: [], |
| | | }; |
| | | }, |
| | | methods: { |
| | | // 摄像头点击事件 |
| | | handleClick(projectId) { |
| | | $.modal.open('视频播放', ctx + "/player?projectId="+projectId , 1300,580); |
| | | }, |
| | | handleClose(done) { |
| | | this.$confirm('确认关闭?') |
| | | .then(_ => { |
| | | done(); |
| | | }) |
| | | .catch(_ => { |
| | | $("#palyerIframe0").attr("src",'about:blank'); |
| | | $("#palyerIframe1").attr("src",'about:blank'); |
| | | }); |
| | | }, |
| | | } |
| | | }); |
| | | |
| | | function getCareraList() { |
| | | let url = ctx + "/system/stat/cameraData"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.cameraData = res.cameraData; |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | } |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh" xmlns:th="http://www.thymeleaf.org" > |
| | | <head> |
| | | <th:block th:include="include :: header('视频播放')" /> |
| | | </head> |
| | | <body class="white-bg"> |
| | | <div class="wrapper wrapper-content animated fadeInRight ibox-content"> |
| | | <div> |
| | | <iframe style="margin-left: 20px" id ="palyerIframe0" |
| | | src="" |
| | | width="600px" |
| | | height="400px;" |
| | | allowfullscreen> |
| | | </iframe> |
| | | <iframe style="margin-left: 20px" id ="palyerIframe1" |
| | | src="" |
| | | width="600px" |
| | | height="400px;" |
| | | allowfullscreen> |
| | | </iframe> |
| | | </div> |
| | | </div> |
| | | <th:block th:include="include :: footer" /> |
| | | <script th:src="@{/ajax/libs/EZUIKit/ezuikit.js}"></script> |
| | | <script th:inline="javascript"> |
| | | var prefix = ctx + "geo/projectCamera"; |
| | | var cameraDataList = [[${cameraDataList}]]; |
| | | cameraDataList.forEach(function(value, index, array) { |
| | | const playerUrl = value.url; |
| | | $("#palyerIframe" + index).attr("src",playerUrl); |
| | | }); |
| | | </script> |
| | | </body> |
| | | |
| | | </html> |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh" xmlns:th="http://www.thymeleaf.org"> |
| | | <head> |
| | | <th:block th:include="include :: header('弹层组件')" /> |
| | | <link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/animate.min.css" th:href="@{/css/main/animate.min.css}" rel="stylesheet" /> |
| | | <link href="../static/css/main/style.min862f.css" th:href="@{/css/main/style.min862f.css}" rel="stylesheet" /> |
| | | <link rel="stylesheet" th:href="@{/css/custom/main.css}" /> |
| | | <link href="../static/js/elementUI/index.css" th:href="@{/js/elementUI/index.css}" rel="stylesheet" /> |
| | | |
| | | <style type="text/css"> |
| | | .content { |
| | | width: 100%; |
| | | background-color: rgba(0,0,0,0.01) !important; |
| | | padding:10px; |
| | | } |
| | | [v-cloak]{ |
| | | display: none; |
| | | } |
| | | |
| | | .active-red{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #F56C6C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-yellow{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #E6A23C; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .active-blue{ |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | color: white; |
| | | background: #67C23A; |
| | | text-align: center; |
| | | line-height: 20px; |
| | | float: left; |
| | | } |
| | | |
| | | .rankrow{ |
| | | margin-top: 12px; |
| | | cursor: pointer; |
| | | } |
| | | .ilblock{ |
| | | border-left: 1px solid #e3e5e7; |
| | | padding: 0 40px; |
| | | align-content: center; |
| | | } |
| | | .ilblock>span{ |
| | | display: block; |
| | | line-height: 30px; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | .el-table th, |
| | | .el-table tr, |
| | | .el-table td { |
| | | background-color: transparent; |
| | | border: 0px; |
| | | color: #4D4D4D; |
| | | font-size: 13px; |
| | | font-family: Source Han Sans CN Normal, Source Han Sans CN Normal-Normal; |
| | | font-weight: Normal; |
| | | } |
| | | .el-table::before { |
| | | height: 0px; |
| | | } |
| | | .el-table__body tr, |
| | | .el-table__body td { |
| | | padding: 0; |
| | | height: 22px; |
| | | } |
| | | |
| | | </style> |
| | | </head> |
| | | |
| | | <body class="gray-bg"> |
| | | <div class="content" id="app" v-cloak> |
| | | |
| | | <el-row style="height: 127px;"> |
| | | <el-col :span="24"> |
| | | <el-card class="box-card"> |
| | | <div style="flex:4;padding-right: 20px;"> |
| | | <div> |
| | | <li class="el-icon-s-order" style="font-size: 18px;margin-right: 5px;margin-left: -5px;color: #917ed0"></li> |
| | | <span style="color:rgba(0,0,0,.65);font-size: 15px;font-weight: bold;">资料文件</span> |
| | | </div> |
| | | <div style="text-align: center"> |
| | | <span style="color:#F7931E;font-size: 30px;word-break: break-all;line-height: 70px;"> |
| | | {{indexDataCount.fileCount}} |
| | | </span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div style="flex:6;" class="ilblock"> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 施工资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #f56c6c">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 安全资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | <span style="color:rgba(0,0,0,.87);font-size: 15px;"> |
| | | 质量资料 <span style="float: right">0</span> |
| | | <!-- <li class="el-icon-caret-bottom" style="color: #409eff">--> |
| | | </span> |
| | | </div> |
| | | |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-card class="box-card"> |
| | | <div style="height: 70vh;width: 100%;"> |
| | | <h3>材料统计</h3> |
| | | <el-col :span="10" style="height: 200px;"> |
| | | <div style="margin-top: 15px"> |
| | | <template> |
| | | <el-table :data="tubLogs" border size="small" style="width: 100%" |
| | | :header-cell-style="{color: '#4D4D4D',background: '#F7931E',fontWeight: '400'}" |
| | | :row-class-name="tableRowClassName"> |
| | | <!-- <el-table-column prop="code" label="序号"></el-table-column>--> |
| | | <el-table-column prop="tubName" label="名称"></el-table-column> |
| | | <el-table-column prop="inboundNumber" label="入库数量"></el-table-column> |
| | | <el-table-column prop="outboundNumber" label="出库数量"></el-table-column> |
| | | <el-table-column prop="unit" label="单位"></el-table-column> |
| | | |
| | | </el-table> |
| | | </template> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="14" style="height: 200px;"> |
| | | <div id="column-chart" style="height: 380px; width: 100%;"></div> |
| | | </el-col> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | |
| | | </el-row> |
| | | |
| | | </div> |
| | | |
| | | <script th:src="@{/js/jquery.min.js}"></script> |
| | | <script th:src="@{/js/bootstrap.min.js}"></script> |
| | | <script th:src="@{/ajax/libs/flot/jquery.flot.js}"></script> |
| | | <script th:src="@{/ajax/libs/report/echarts/echarts-all.js}"></script> |
| | | <script th:src="@{/js/custom/main.js}"></script> |
| | | |
| | | <script th:src="@{/js/vue.min.js}"></script> |
| | | <script th:src="@{/js/elementUI/index.js}"></script> |
| | | |
| | | <th:block th:include="include :: sparkline-js" /> |
| | | <th:block th:include="include :: footer" /> |
| | | |
| | | <script th:inline="javascript"> |
| | | |
| | | $(function() { |
| | | indexCount(); |
| | | tubLogs(); |
| | | }) |
| | | |
| | | function tubLogs() { |
| | | |
| | | const chart = echarts.init(document.getElementById("column-chart")); |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow' |
| | | } |
| | | }, |
| | | legend: {}, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: [ |
| | | { |
| | | type: 'category', |
| | | data: [] |
| | | } |
| | | ], |
| | | yAxis: [ |
| | | { |
| | | type: 'value' |
| | | } |
| | | ], |
| | | series: [ |
| | | { |
| | | name: '出库', |
| | | type: 'bar', |
| | | emphasis: { |
| | | focus: 'series' |
| | | }, |
| | | data: [], |
| | | itemStyle: { |
| | | // 修改柱子的颜色 |
| | | color: '#e2b507' |
| | | } |
| | | }, |
| | | { |
| | | name: '入库', |
| | | type: 'bar', |
| | | stack: 'Ad', |
| | | emphasis: { |
| | | focus: 'series' |
| | | }, |
| | | data: [], |
| | | itemStyle: { |
| | | // 修改柱子的颜色 |
| | | color: '#2992c6' |
| | | } |
| | | }, |
| | | |
| | | ] |
| | | }; |
| | | |
| | | let url = ctx + "/system/stat/tubLogData"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.tubLogs = res.tubLogs; |
| | | |
| | | res.tubLogs.forEach(function(value, index, array) { |
| | | const tubName = value.tubName; |
| | | const inboundNumber = value.inboundNumber; |
| | | const outboundNumber = value.outboundNumber; |
| | | const unit = value.unit; |
| | | option.xAxis[0].data[index] = tubName; |
| | | option.series[0].data[index] = outboundNumber; |
| | | option.series[1].data[index] = inboundNumber; |
| | | }); |
| | | chart.setOption(option, true); |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | } |
| | | |
| | | //首页第一行个数统计 |
| | | function indexCount() { |
| | | let url = ctx + "/system/stat/indexDataCount"; |
| | | $.ajaxSettings.async = false; |
| | | $.get(url,{},function(res){ |
| | | vm.indexDataCount = res.data; |
| | | vm.indexDataCount.cameraCountNaN = 68 -vm.indexDataCount.cameraCount; |
| | | }) |
| | | $.ajaxSettings.async = false; |
| | | } |
| | | |
| | | var vm = new Vue({ |
| | | el: "#app", |
| | | data() { |
| | | return { |
| | | stationProcessData: [], |
| | | indexDataCount :"", |
| | | tubLogs:[], |
| | | }; |
| | | }, |
| | | methods: { |
| | | tableRowClassName({ row, rowIndex }) { |
| | | if (rowIndex % 2 == 0) { |
| | | return ""; |
| | | } else { |
| | | return "warning-row"; |
| | | } |
| | | }, |
| | | } |
| | | }); |
| | | |
| | | </script> |
| | | |
| | | </body> |
| | | </html> |
| | |
| | | return prefix + "/projectCamera"; |
| | | } |
| | | |
| | | @RequiresPermissions("geo:projectCamera:view2") |
| | | @GetMapping("/view2") |
| | | public String projectCamera2() { |
| | | return prefix + "/projectCamera2"; |
| | | } |
| | | |
| | | /** |
| | | * 查询监控设备列表 |
| | | */ |
| | |
| | | List<ProjectCamera> list = projectCameraService.selectProjectCameraList(projectCamera); |
| | | return AjaxResult.success(list); |
| | | } |
| | | |
| | | |
| | | |
| | | @GetMapping("/cameraPlayerUrl") |
| | | @ResponseBody |
| | |
| | | * 新增监控设备 |
| | | */ |
| | | @GetMapping("/add") |
| | | public String add() { |
| | | public String add(String projectId, ModelMap mmap) { |
| | | mmap.put("projectId", projectId); |
| | | return prefix + "/add"; |
| | | } |
| | | |
| | |
| | | return url; |
| | | } |
| | | |
| | | public void settianUrl(String url) { |
| | | public void setUrl(String url) { |
| | | this.url = url; |
| | | } |
| | | |
| | |
| | | /** 项目id */ |
| | | private String projectId; |
| | | |
| | | /** 项目名称 */ |
| | | private String projectName; |
| | | |
| | | /** 项目编号 */ |
| | | private String projectCode; |
| | | |
| | | /** 名称 */ |
| | | @Excel(name = "名称") |
| | | private String name; |
| | |
| | | /** Ip地址 */ |
| | | @Excel(name = "Ip地址") |
| | | private String ip; |
| | | |
| | | /** 视频播放路径 */ |
| | | private String url; |
| | | |
| | | public void setId(String id) |
| | | { |
| | |
| | | this.name = name; |
| | | } |
| | | |
| | | public String getName() |
| | | public String getProjectName() { |
| | | return projectName; |
| | | } |
| | | |
| | | public void setProjectName(String projectName) { |
| | | this.projectName = projectName; |
| | | } |
| | | |
| | | public String getProjectCode() { |
| | | return projectCode; |
| | | } |
| | | |
| | | public void setProjectCode(String projectCode) { |
| | | this.projectCode = projectCode; |
| | | } |
| | | |
| | | public String getName() |
| | | { |
| | | return name; |
| | | } |
| | |
| | | return ip; |
| | | } |
| | | |
| | | public String getUrl() { |
| | | return url; |
| | | } |
| | | |
| | | public void setUrl(String url) { |
| | | this.url = url; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) |
| | |
| | | public int deleteProjectCameraByIds(String[] ids); |
| | | |
| | | public Integer count(); |
| | | |
| | | /** |
| | | * 获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | List<ProjectCamera> selectCameraDataOnLine(); |
| | | } |
| | |
| | | * @return 结果 |
| | | */ |
| | | public int deleteProjectCameraById(String id); |
| | | |
| | | /** |
| | | * 获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | List<ProjectCamera> selectCameraDataOnLine(); |
| | | } |
| | |
| | | public int deleteProjectCameraById(String id) { |
| | | return projectCameraMapper.deleteProjectCameraById(id); |
| | | } |
| | | |
| | | /** |
| | | * 获取在线摄像头的信息 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<ProjectCamera> selectCameraDataOnLine() { |
| | | return projectCameraMapper.selectCameraDataOnLine(); |
| | | } |
| | | } |
| | |
| | | <resultMap type="ProjectCamera" id="ProjectCameraResult"> |
| | | <result property="id" column="id" /> |
| | | <result property="projectId" column="project_id" /> |
| | | <result property="projectName" column="project_name" /> |
| | | <result property="projectCode" column="project_code" /> |
| | | <result property="name" column="name" /> |
| | | <result property="code" column="code" /> |
| | | <result property="lng" column="lng" /> |
| | |
| | | <select id ="count" resultType="Integer"> |
| | | select count(*) from js_project_camera |
| | | </select> |
| | | |
| | | |
| | | <select id="selectCameraDataOnLine" resultMap="ProjectCameraResult"> |
| | | SELECT |
| | | a.id, |
| | | a.project_id, |
| | | b.full_name AS project_name, |
| | | b.`code` AS project_code, |
| | | a.NAME, |
| | | a.CODE, |
| | | a.lng, |
| | | a.lat, |
| | | a.ip, |
| | | a.create_by, |
| | | a.create_time |
| | | FROM |
| | | js_project_camera a |
| | | LEFT JOIN js_project b ON a.project_id = b.ids GROUP BY a.project_id; |
| | | </select> |
| | | |
| | | <insert id="insertProjectCamera" parameterType="ProjectCamera"> |
| | | insert into js_project_camera |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | |
| | | </el-col> |
| | | |
| | | <el-col :span="10" > |
| | | <el-card class="box-card card-yellow" style="height: 320px;margin-right: 20px;"> |
| | | <el-card class="box-card card-blue" style="height: 320px;margin-right: 20px;"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>钻孔分布图</span> |
| | | </div> |
| | |
| | | |
| | | <el-row style="height: 200px;"> |
| | | <el-col :span="24"> |
| | | <el-card class="box-card card-yellow" style="height: 320px;margin-top: 20px"> |
| | | <el-card class="box-card card-blue" style="height: 320px;margin-top: 20px"> |
| | | <div slot="header" class="clearfix"> |
| | | <span>材料统计</span> |
| | | </div> |
| | |
| | | <th:block th:include="include :: footer" /> |
| | | <script th:inline="javascript"> |
| | | var prefix = ctx + "geo/projectCamera" |
| | | var projectId = [[${projectId}]]; |
| | | |
| | | $("#form-projectCamera-add").validate({ |
| | | focusCleanup: true |
| | | }); |
| | | |
| | | function submitHandler() { |
| | | if ($.validate.form()) { |
| | | $.operate.save(prefix + "/add", $('#form-projectCamera-add').serialize()); |
| | | let formData = $('#form-projectCamera-add').serialize(); |
| | | let data = formData + "&projectId=" + projectId; |
| | | $.operate.save(prefix + "/add", data); |
| | | } |
| | | } |
| | | </script> |
| | |
| | | var editFlag = [[${@permission.hasPermi('geo:projectCamera:edit')}]]; |
| | | var removeFlag = [[${@permission.hasPermi('geo:projectCamera:remove')}]]; |
| | | var prefix = ctx + "geo/projectCamera"; |
| | | var projectId=[[${projectId}]]; |
| | | |
| | | $(function() { |
| | | var options = { |
| | | url: prefix + "/list", |
| | | createUrl: prefix + "/add", |
| | | url: prefix + "/list?projectId="+projectId, |
| | | createUrl: prefix + "/add?projectId="+projectId, |
| | | updateUrl: prefix + "/edit/{id}", |
| | | removeUrl: prefix + "/remove", |
| | | exportUrl: prefix + "/export", |
| | |
| | | formatter: function(value, row, index) { |
| | | var actions = []; |
| | | actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> '); |
| | | actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>'); |
| | | actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a> '); |
| | | actions.push('<a class="btn btn-info btn-xs ' + '" href="javascript:void(0)" onclick="player(\'' + row.id + '\')"><i class="fa fa-video-camera"></i>播放</a>'); |
| | | return actions.join(''); |
| | | } |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> |
| | | <head> |
| | | <th:block th:include="include :: header('监控设备列表')" /> |
| | | </head> |
| | | <body class="gray-bg"> |
| | | <div class="container-div"> |
| | | <div class="row"> |
| | | <div class="col-sm-12 search-collapse"> |
| | | <form id="formId"> |
| | | <div class="select-list"> |
| | | <ul> |
| | | <li> |
| | | <p>名称:</p> |
| | | <input type="text" name="name"/> |
| | | </li> |
| | | <li> |
| | | <p>视频编号:</p> |
| | | <input type="text" name="code"/> |
| | | </li> |
| | | <li> |
| | | <p>Ip地址:</p> |
| | | <input type="text" name="ip"/> |
| | | </li> |
| | | <li> |
| | | <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a> |
| | | <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> 重置</a> |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | </form> |
| | | </div> |
| | | |
| | | <div class="btn-group-sm" id="toolbar" role="group"> |
| | | <!-- <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="geo:projectCamera:add">--> |
| | | <!-- <i class="fa fa-plus"></i> 添加--> |
| | | <!-- </a>--> |
| | | <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="geo:projectCamera:edit"> |
| | | <i class="fa fa-edit"></i> 修改 |
| | | </a> |
| | | <!-- <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="geo:projectCamera:remove">--> |
| | | <!-- <i class="fa fa-remove"></i> 删除--> |
| | | <!-- </a>--> |
| | | <!-- <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="geo:projectCamera:export">--> |
| | | <!-- <i class="fa fa-download"></i> 导出--> |
| | | <!-- </a>--> |
| | | </div> |
| | | <div class="col-sm-12 select-table table-striped"> |
| | | <table id="bootstrap-table"></table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <th:block th:include="include :: footer" /> |
| | | <script th:inline="javascript"> |
| | | var editFlag = [[${@permission.hasPermi('geo:projectCamera:edit')}]]; |
| | | var removeFlag = [[${@permission.hasPermi('geo:projectCamera:remove')}]]; |
| | | var prefix = ctx + "geo/projectCamera"; |
| | | var projectId=[[${projectId}]]; |
| | | |
| | | $(function() { |
| | | var options = { |
| | | url: prefix + "/list", |
| | | createUrl: prefix + "/add", |
| | | updateUrl: prefix + "/edit/{id}", |
| | | removeUrl: prefix + "/remove", |
| | | exportUrl: prefix + "/export", |
| | | modalName: "监控设备", |
| | | columns: [{ |
| | | checkbox: true |
| | | }, |
| | | { |
| | | field : 'id', |
| | | title : '主键', |
| | | visible: false |
| | | }, |
| | | { |
| | | field : 'name', |
| | | title : '名称' |
| | | }, |
| | | { |
| | | field : 'code', |
| | | title : '视频编号' |
| | | }, |
| | | { |
| | | field : 'lng', |
| | | title : '经度' |
| | | }, |
| | | { |
| | | field : 'lat', |
| | | title : '纬度' |
| | | }, |
| | | { |
| | | field : 'ip', |
| | | title : 'Ip地址', |
| | | visible: false |
| | | }, |
| | | { |
| | | title: '操作', |
| | | align: 'center', |
| | | formatter: function(value, row, index) { |
| | | var actions = []; |
| | | actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> '); |
| | | //actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a> '); |
| | | actions.push('<a class="btn btn-info btn-xs ' + '" href="javascript:void(0)" onclick="player(\'' + row.id + '\')"><i class="fa fa-video-camera"></i>播放</a>'); |
| | | return actions.join(''); |
| | | } |
| | | }] |
| | | }; |
| | | $.table.init(options); |
| | | }); |
| | | |
| | | function player(id) { |
| | | $.modal.open('视频播放', prefix + "/player?id="+id); |
| | | } |
| | | </script> |
| | | </body> |
| | | </html> |