feat(project): 添加可视化大屏承包项目和移动监控功能

dev_visual_page
zhaokai 2026-08-06 10:41:55 +08:00
parent 0be73298d2
commit 786969f2ee
16 changed files with 344 additions and 1 deletions

View File

@ -174,5 +174,17 @@ public class KeyProjectController {
return MultiResponse.of(keyProjectService.largeScreenInfo(qry));
}
@ApiOperation("可视化大屏-承包项目情况")
@PostMapping("/largeScreenContractorStatistics")
public PageResponse<KeyProjectLargeScreenContractorStatisticsCO> largeScreenContractorStatistics(@RequestBody KeyProjectLargeScreenContractorStatisticsQry qry) {
return keyProjectService.largeScreenContractorStatistics(qry);
}
@ApiOperation("可视化大屏-移动监控情况")
@PostMapping("/largeScreenMobileMonitoring")
public PageResponse<KeyProjectLargeScreenMobileMonitoringCO> largeScreenMobileMonitoring(@RequestBody KeyProjectLargeScreenMobileMonitoringQry qry) {
return keyProjectService.largeScreenMobileMonitoring(qry);
}
}

View File

@ -298,6 +298,7 @@ public class KeyProjectQueryExe {
return result;
}
result.setTotalProjectCount(data.getTotalProjectCount());
result.setWaitStartCount(data.getWaitStartCount());
result.setStartCount(data.getStartCount());
return result;
}
@ -366,5 +367,39 @@ public class KeyProjectQueryExe {
return result;
}).collect(Collectors.toList());
}
public PageResponse<KeyProjectLargeScreenContractorStatisticsCO> largeScreenContractorStatistics(KeyProjectLargeScreenContractorStatisticsQry qry) {
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
PageResponse<KeyProjectLargeScreenContractorStatisticsDO> pageResponse = keyProjectRepository.largeScreenContractorStatistics(params);
List<KeyProjectLargeScreenContractorStatisticsCO> result = pageResponse.getData().stream().map(data -> {
KeyProjectLargeScreenContractorStatisticsCO item = new KeyProjectLargeScreenContractorStatisticsCO();
item.setContractorCorpinfoId(data.getContractorCorpinfoId());
item.setContractorName(data.getContractorName());
item.setWaitStartCount(data.getWaitStartCount());
item.setDoingCount(data.getDoingCount());
return item;
}).collect(Collectors.toList());
return PageResponse.of(result, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
public PageResponse<KeyProjectLargeScreenMobileMonitoringCO> largeScreenMobileMonitoring(KeyProjectLargeScreenMobileMonitoringQry qry) {
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
PageResponse<KeyProjectLargeScreenMobileMonitoringDO> pageResponse = keyProjectRepository.largeScreenMobileMonitoring(params);
List<KeyProjectLargeScreenMobileMonitoringCO> result = pageResponse.getData().stream().map(data -> {
KeyProjectLargeScreenMobileMonitoringCO item = new KeyProjectLargeScreenMobileMonitoringCO();
item.setKeyProjectId(data.getKeyProjectId());
item.setProjectName(data.getProjectName());
item.setCameraId(data.getCameraId());
item.setCameraName(data.getCameraName());
item.setCameraType(data.getCameraType());
item.setVideoAddress(data.getVideoAddress());
item.setCameraNumber(data.getCameraNumber());
item.setDeviceGbNumber(data.getDeviceGbNumber());
item.setDeviceModel(data.getDeviceModel());
item.setIsOnline(data.getIsOnline());
return item;
}).collect(Collectors.toList());
return PageResponse.of(result, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
}

View File

@ -143,5 +143,15 @@ public class KeyProjectServiceImpl implements KeyProjectServiceI {
public List<KeyProjectLargeScreenInfoCO> largeScreenInfo(KeyProjectLargeScreenInfoQry qry) {
return keyProjectQueryExe.largeScreenInfo(qry);
}
@Override
public PageResponse<KeyProjectLargeScreenContractorStatisticsCO> largeScreenContractorStatistics(KeyProjectLargeScreenContractorStatisticsQry qry) {
return keyProjectQueryExe.largeScreenContractorStatistics(qry);
}
@Override
public PageResponse<KeyProjectLargeScreenMobileMonitoringCO> largeScreenMobileMonitoring(KeyProjectLargeScreenMobileMonitoringQry qry) {
return keyProjectQueryExe.largeScreenMobileMonitoring(qry);
}
}

View File

@ -59,5 +59,9 @@ public interface KeyProjectServiceI {
List<KeyProjectLargeScreenXgfStatisticsCO> largeScreenXgfStatistics(KeyProjectLargeScreenXgfStatisticsQry qry);
List<KeyProjectLargeScreenInfoCO> largeScreenInfo(KeyProjectLargeScreenInfoQry qry);
PageResponse<KeyProjectLargeScreenContractorStatisticsCO> largeScreenContractorStatistics(KeyProjectLargeScreenContractorStatisticsQry qry);
PageResponse<KeyProjectLargeScreenMobileMonitoringCO> largeScreenMobileMonitoring(KeyProjectLargeScreenMobileMonitoringQry qry);
}

View File

@ -0,0 +1,28 @@
package com.zcloud.key.project.dto.clientobject.project;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenContractorStatisticsCO implements Serializable {
@ApiModelProperty(value = "承包商企业id")
private Long contractorCorpinfoId;
@ApiModelProperty(value = "承包商名称")
private String contractorName;
@ApiModelProperty(value = "待开工项目数")
private Integer waitStartCount;
@ApiModelProperty(value = "进行中项目数")
private Integer doingCount;
}

View File

@ -0,0 +1,46 @@
package com.zcloud.key.project.dto.clientobject.project;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenMobileMonitoringCO implements Serializable {
@ApiModelProperty(value = "重点作业id")
private String keyProjectId;
@ApiModelProperty(value = "项目名称")
private String projectName;
@ApiModelProperty(value = "摄像头id")
private String cameraId;
@ApiModelProperty(value = "摄像头名称")
private String cameraName;
@ApiModelProperty(value = "摄像头类型1:固定摄像头2:移动摄像头")
private Integer cameraType;
@ApiModelProperty(value = "RTSP视频地址")
private String videoAddress;
@ApiModelProperty(value = "摄像头编号用于获取HLS播放地址")
private String cameraNumber;
@ApiModelProperty(value = "设备国标编号")
private String deviceGbNumber;
@ApiModelProperty(value = "规格型号")
private String deviceModel;
@ApiModelProperty(value = "在线状态0:离线1:在线")
private Integer isOnline;
}

View File

@ -17,6 +17,9 @@ public class KeyProjectLargeScreenProjectStatisticsCO implements Serializable {
@ApiModelProperty(value = "重点工程总数")
private Integer totalProjectCount;
@ApiModelProperty(value = "重点工程待开工数")
private Integer waitStartCount;
@ApiModelProperty(value = "重点工程开工数")
private Integer startCount;
}

View File

@ -0,0 +1,21 @@
package com.zcloud.key.project.dto.project;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenContractorStatisticsQry extends PageQuery {
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId;
@ApiModelProperty(value = "港区1:秦皇岛港区,2:秦皇岛东,3:秦皇岛西", name = "portArea")
private Integer portArea;
}

View File

@ -0,0 +1,21 @@
package com.zcloud.key.project.dto.project;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenMobileMonitoringQry extends PageQuery {
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId;
@ApiModelProperty(value = "港区1:秦皇岛港区,2:秦皇岛东,3:秦皇岛西", name = "portArea")
private Integer portArea;
}

View File

@ -0,0 +1,23 @@
package com.zcloud.key.project.persistence.dataobject.project;
import lombok.Data;
import java.io.Serializable;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenContractorStatisticsDO implements Serializable {
private Long contractorCorpinfoId;
private String contractorName;
private Integer waitStartCount;
private Integer doingCount;
}

View File

@ -0,0 +1,35 @@
package com.zcloud.key.project.persistence.dataobject.project;
import lombok.Data;
import java.io.Serializable;
/**
*
*
* @Author zhaokai
* @Date 2026-08-06
*/
@Data
public class KeyProjectLargeScreenMobileMonitoringDO implements Serializable {
private String keyProjectId;
private String projectName;
private String cameraId;
private String cameraName;
private Integer cameraType;
private String videoAddress;
private String cameraNumber;
private String deviceGbNumber;
private String deviceModel;
private Integer isOnline;
}

View File

@ -15,5 +15,7 @@ public class KeyProjectLargeScreenProjectStatisticsDO implements Serializable {
private Integer totalProjectCount;
private Integer waitStartCount;
private Integer startCount;
}

View File

@ -54,5 +54,9 @@ public interface KeyProjectMapper extends BaseMapper<KeyProjectDO> {
List<KeyProjectLargeScreenXgfStatisticsDO> largeScreenXgfStatistics(Map<String, Object> params);
List<KeyProjectLargeScreenInfoDO> largeScreenInfo(Map<String, Object> params);
IPage<KeyProjectLargeScreenContractorStatisticsDO> largeScreenContractorStatistics(IPage<KeyProjectLargeScreenContractorStatisticsDO> iPage, Map<String, Object> params);
IPage<KeyProjectLargeScreenMobileMonitoringDO> largeScreenMobileMonitoring(IPage<KeyProjectLargeScreenMobileMonitoringDO> iPage, Map<String, Object> params);
}

View File

@ -129,5 +129,19 @@ public class KeyProjectRepositoryImpl extends BaseRepositoryImpl<KeyProjectMappe
public List<KeyProjectLargeScreenInfoDO> largeScreenInfo(Map<String, Object> params) {
return keyProjectMapper.largeScreenInfo(params);
}
@Override
public PageResponse<KeyProjectLargeScreenContractorStatisticsDO> largeScreenContractorStatistics(Map<String, Object> params) {
IPage<KeyProjectLargeScreenContractorStatisticsDO> iPage = new Query<KeyProjectLargeScreenContractorStatisticsDO>().getPage(params);
IPage<KeyProjectLargeScreenContractorStatisticsDO> result = keyProjectMapper.largeScreenContractorStatistics(iPage, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<KeyProjectLargeScreenMobileMonitoringDO> largeScreenMobileMonitoring(Map<String, Object> params) {
IPage<KeyProjectLargeScreenMobileMonitoringDO> iPage = new Query<KeyProjectLargeScreenMobileMonitoringDO>().getPage(params);
IPage<KeyProjectLargeScreenMobileMonitoringDO> result = keyProjectMapper.largeScreenMobileMonitoring(iPage, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
}

View File

@ -45,5 +45,9 @@ public interface KeyProjectRepository extends BaseRepository<KeyProjectDO> {
List<KeyProjectLargeScreenXgfStatisticsDO> largeScreenXgfStatistics(Map<String, Object> params);
List<KeyProjectLargeScreenInfoDO> largeScreenInfo(Map<String, Object> params);
PageResponse<KeyProjectLargeScreenContractorStatisticsDO> largeScreenContractorStatistics(Map<String, Object> params);
PageResponse<KeyProjectLargeScreenMobileMonitoringDO> largeScreenMobileMonitoring(Map<String, Object> params);
}

View File

@ -591,7 +591,10 @@
<select id="largeScreenProjectStatistics" resultType="com.zcloud.key.project.persistence.dataobject.project.KeyProjectLargeScreenProjectStatisticsDO">
SELECT
COUNT(DISTINCT CASE WHEN kp.apply_status IN (1, 2, 3, 4, 5, 6, 7) THEN kp.id END) AS totalProjectCount,
COUNT(DISTINCT CASE WHEN kp.apply_status IN (2, 4, 5) THEN kp.id END) AS startCount
COUNT(DISTINCT CASE WHEN kp.apply_status IN (1, 2)
AND CURDATE() <![CDATA[ < ]]> kp.plan_work_start_date THEN kp.id END) AS waitStartCount,
COUNT(DISTINCT CASE WHEN kp.apply_status IN (4, 5)
AND CURDATE() BETWEEN kp.plan_work_start_date AND kp.plan_work_end_date THEN kp.id END) AS startCount
FROM key_project kp
LEFT JOIN corp_info cp ON kp.jurisdiction_corpinfo_id = cp.id
WHERE kp.delete_enum = 'FALSE'
@ -725,5 +728,83 @@
</if>
ORDER BY kp.apply_status ASC, kp.create_time DESC
</select>
<select id="largeScreenContractorStatistics" resultType="com.zcloud.key.project.persistence.dataobject.project.KeyProjectLargeScreenContractorStatisticsDO">
SELECT
kp.xgf_corpinfo_id AS contractorCorpinfoId,
xgfci.corp_name AS contractorName,
COUNT(DISTINCT CASE WHEN kp.apply_status IN (1, 2)
AND CURDATE() <![CDATA[ < ]]> kp.plan_work_start_date THEN kp.id END) AS waitStartCount,
COUNT(DISTINCT CASE WHEN kp.apply_status IN (4, 5)
AND CURDATE() BETWEEN kp.plan_work_start_date AND kp.plan_work_end_date THEN kp.id END) AS doingCount
FROM key_project kp
LEFT JOIN corp_info cp ON kp.jurisdiction_corpinfo_id = cp.id
LEFT JOIN corp_info xgfci ON kp.xgf_corpinfo_id = xgfci.id
WHERE kp.delete_enum = 'FALSE'
AND kp.xgf_corpinfo_id IS NOT NULL
<if test="params.corpinfoId != null">
AND kp.jurisdiction_corpinfo_id = #{params.corpinfoId}
</if>
<if test="params.portArea != null">
AND cp.port_area = #{params.portArea}
</if>
GROUP BY kp.xgf_corpinfo_id, xgfci.corp_name
ORDER BY xgfci.corp_order ASC, xgfci.create_time DESC
</select>
<select id="largeScreenMobileMonitoring" resultType="com.zcloud.key.project.persistence.dataobject.project.KeyProjectLargeScreenMobileMonitoringDO">
SELECT
kp.key_project_id AS keyProjectId,
kp.project_name AS projectName,
kpc.camera_id AS cameraId,
CASE
WHEN kpc.camera_type = 1 THEN fc.video_name
WHEN kpc.camera_type = 2 THEN mc.video_name
END AS cameraName,
kpc.camera_type AS cameraType,
CASE
WHEN kpc.camera_type = 1 THEN fc.video_address
WHEN kpc.camera_type = 2 THEN mc.video_address
END AS videoAddress,
CASE
WHEN kpc.camera_type = 1 THEN fc.camera_number
WHEN kpc.camera_type = 2 THEN mc.camera_number
END AS cameraNumber,
CASE
WHEN kpc.camera_type = 1 THEN fc.device_gb_number
WHEN kpc.camera_type = 2 THEN mc.device_gb_number
END AS deviceGbNumber,
CASE
WHEN kpc.camera_type = 1 THEN fc.device_model
WHEN kpc.camera_type = 2 THEN mc.device_model
END AS deviceModel,
CASE
WHEN kpc.camera_type = 1 THEN fc.is_online
WHEN kpc.camera_type = 2 THEN mc.is_online
END AS isOnline
FROM key_project kp
INNER JOIN key_project_camera kpc ON kp.key_project_id = kpc.key_project_id
AND kpc.delete_enum = 'FALSE'
LEFT JOIN fixed_camera fc ON kpc.camera_id = fc.fixed_camera_id
AND kpc.camera_type = 1
AND fc.delete_enum = 'FALSE'
LEFT JOIN mobile_camera mc ON kpc.camera_id = mc.mobile_camera_id
AND kpc.camera_type = 2
AND mc.delete_enum = 'FALSE'
LEFT JOIN corp_info cp ON kp.jurisdiction_corpinfo_id = cp.id
WHERE kp.delete_enum = 'FALSE'
AND kp.apply_status = 4
AND (
(kpc.camera_type = 1 AND fc.fixed_camera_id IS NOT NULL)
OR (kpc.camera_type = 2 AND mc.mobile_camera_id IS NOT NULL)
)
<if test="params.corpinfoId != null">
AND kp.jurisdiction_corpinfo_id = #{params.corpinfoId}
</if>
<if test="params.portArea != null">
AND cp.port_area = #{params.portArea}
</if>
ORDER BY kp.create_time DESC, kpc.camera_type ASC, kpc.create_time DESC
</select>
</mapper>