Merge remote-tracking branch 'origin/dunhuan_jdk8' into dunhuang

This commit is contained in:
guoshengxiong 2025-10-17 18:48:44 +08:00
commit 6199555729
13 changed files with 285 additions and 18 deletions

View File

@ -1,6 +1,8 @@
package com.zhgd.xmgl.modules.policecamera.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zhgd.annotation.OperLog;
import com.zhgd.jeecg.common.api.vo.Result;
@ -11,6 +13,7 @@ import com.zhgd.xmgl.modules.policecamera.entity.dto.PoliceCameraItemFileDto;
import com.zhgd.xmgl.modules.policecamera.entity.vo.PoliceCameraItemFileVo;
import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemFileService;
import com.zhgd.xmgl.modules.policecamera.service.IProjectPoliceCameraConfigService;
import com.zhgd.xmgl.util.PathUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@ -24,10 +27,8 @@ import org.springframework.web.bind.annotation.*;
import io.swagger.v3.oas.annotations.Parameter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -62,6 +63,7 @@ public class PoliceCameraItemFileController {
@ApiImplicitParams({
@ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "externalIdIsNull", value = "1前端上传的文件", paramType = "query", required = true, dataType = "Integer"),
})
@GetMapping(value = "/page")
public Result<IPage<PoliceCameraItemFileVo>> queryPageList(@Parameter(hidden = true) @RequestParam HashMap<String, Object> param) {
@ -170,4 +172,33 @@ public class PoliceCameraItemFileController {
}
return Result.ok();
}
@OperLog(operModul = "执法记录仪文件管理", operType = "删除", operDesc = "根据条件删除执法记录仪文件信息")
@ApiOperation(value = "根据条件删除执法记录仪文件信息", notes = "根据条件删除执法记录仪文件信息", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name = "deleteFileModel", value = "1删除记录和文件2只删除记录不删除文件3只删除文件不删除记录", paramType = "query", required = true, dataType = "String"),
@ApiImplicitParam(name = "createDate_begin", value = "查询开始日期yyyy-MM-dd HH:mm:ss", paramType = "query", required = false, dataType = "String"),
@ApiImplicitParam(name = "createDate_end", value = "查询结束日期yyyy-MM-dd HH:mm:ss", paramType = "query", required = false, dataType = "String"),
})
@PostMapping(value = "/deleteBy")
public Result<PoliceCameraItemFile> deleteBy(@ApiIgnore @RequestBody HashMap<String, Object> map) {
List<PoliceCameraItemFileVo> vos = policeCameraItemFileService.queryList(map);
if (CollUtil.isNotEmpty(vos)) {
Integer deleteFileModel = MapUtils.getInteger(map, "deleteFileModel");
if (Objects.equals(deleteFileModel, 1) || Objects.equals(deleteFileModel, 2)) {
List<Long> ids = vos.stream().map(PoliceCameraItemFileVo::getId).collect(Collectors.toList());
policeCameraItemFileService.removeByIds(ids);
}
if (Objects.equals(deleteFileModel, 1) || Objects.equals(deleteFileModel, 3)) {
for (PoliceCameraItemFileVo vo : vos) {
try {
FileUtil.del(PathUtil.getBasePath() + "/" + vo.getFileUrl());
} catch (Exception e) {
log.warn("执法记录仪文件删除失败:",e);
}
}
}
}
return Result.ok();
}
}

View File

@ -60,11 +60,15 @@ public class PoliceCameraItemFile implements Serializable {
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private java.util.Date createDate;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private java.util.Date updateDate;
/**
* 0 其它1 图片2 音频3 视频

View File

@ -23,4 +23,6 @@ public class PoliceCameraItemFileVo extends PoliceCameraItemFile {
*/
@ApiModelProperty(value = "工作票编号")
private java.lang.String workTicketNumber;
@ApiModelProperty(value = "项目名称")
private String projectName;
}

View File

@ -7,11 +7,17 @@
,pci.dev_name
,wtt.type_name
,wt.work_ticket_number
,p.project_name
from police_camera_item_file t
left join police_camera_item pci on pci.item_id=t.item_id
left join work_ticket_history wth on wth.id = t.history_id
left join work_ticket wt on wt.id = wth.work_ticket_id
left join work_ticket_type wtt on wtt.id=wt.type_id
join project p on p.project_sn=t.project_sn
where 1=1
<if test="param.externalIdIsNull == '1'.toString() ">
and t.external_id is null
</if>
)t
${ew.customSqlSegment}
</select>

View File

@ -30,6 +30,9 @@
,ifnull(sum(if(t.status=3,1,0)),0) as pause
,ifnull(sum(if(t.status=4,1,0)),0) as done
from work_ticket t
where t.project_sn=#{projectSn}
where 1=1
<if test="projectSn != null and projectSn != ''">
and t.project_sn = #{projectSn}
</if>
</select>
</mapper>

View File

@ -106,8 +106,8 @@ public class ProjectController {
}
@OperLog(operModul = "项目管理", operType = "查询", operDesc = "查询企业所属项目列表")
@ApiOperation(value = "查询企业所属项目列表", notes = "查询企业所属项目列表")
@OperLog(operModul = "项目管理", operType = "查询", operDesc = "查询企业市区所属项目列表")
@ApiOperation(value = "查询企业市区所属项目列表", notes = "查询企业市区所属项目列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "projectName", value = "项目名称", paramType = "body", required = false, dataType = "String"),
@ApiImplicitParam(name = "companySn", value = "企业市区唯一标识", paramType = "body", required = false, dataType = "String"),
@ -482,5 +482,14 @@ public class ProjectController {
return Result.success(projectService.getProjectExtendInfo(map));
}
@OperLog(operModul = "项目管理", operType = "", operDesc = "查询企业的树形项目和监控分组和监控列表")
@ApiOperation(value = "查询企业的树形项目和监控分组和监控列表", notes = "查询企业的树形项目和监控分组和监控列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "sn", value = "企业sn", paramType = "body", required = true, dataType = "String"),
@ApiImplicitParam(name = "name", value = "名称", paramType = "body", required = false, dataType = "String"),
})
@PostMapping("/tree/projectList/video")
public Result<List<TreeProjectVideoListVo>> selectTreeProjectVideoList(@RequestBody HashMap<String, Object> map) {
return Result.success(projectService.selectTreeProjectVideoList(map));
}
}

View File

@ -0,0 +1,108 @@
package com.zhgd.xmgl.modules.project.entity.vo;
import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig;
import com.zhgd.xmgl.modules.video.entity.VideoItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class TreeProjectVideoListVo {
/**
* id
*/
@ApiModelProperty(value = "id")
private java.lang.String id;
/**
* 父Id
*/
@ApiModelProperty(value = "父Id")
private java.lang.String parentId;
/**
* 名称
*/
@ApiModelProperty(value = "名称")
private java.lang.String name;
/**
* project项目group监控分组video监控
*/
@ApiModelProperty(value = "project项目group监控分组video监控")
private java.lang.String type;
// /**
// * 项目唯一标识
// */
// @ApiModelProperty(value = "项目唯一标识")
// private java.lang.String projectSn;
private VideoItem videoItem;
private ProjectVideoConfig projectVideoConfig;
private List<TreeProjectVideoListVo> children;
/**
* 监控类型枚举
*/
public static enum MonitorType {
/**
* 项目监控 (例如统计一个项目下的所有资源)
*/
PROJECT("project", "项目监控"),
/**
* 分组监控 (例如统计一个分组下的设备或用户)
*/
GROUP("group", "分组监控"),
/**
* 视频监控 (例如针对单个视频流或摄像头的监控)
*/
VIDEO("video", "视频监控");
/**
* 内部代码/标识符 (可用于数据库存储或API传输)
*/
private final String code;
/**
* 描述/中文名称
*/
private final String description;
/**
* 构造方法
* @param code 标识代码
* @param description 描述
*/
MonitorType(String code, String description) {
this.code = code;
this.description = description;
}
/**
* 获取代码/标识符
*/
public String getCode() {
return code;
}
/**
* 获取描述/中文名称
*/
public String getDescription() {
return description;
}
/**
* 根据代码获取枚举实例
* @param code 标识代码
* @return 对应的枚举实例如果不存在则返回 null
*/
public static MonitorType fromCode(String code) {
for (MonitorType type : MonitorType.values()) {
if (type.code.equalsIgnoreCase(code)) {
return type;
}
}
return null;
}
}
}

View File

@ -265,5 +265,5 @@ public interface ProjectMapper extends BaseMapper<Project> {
boolean hasProjectSnAccessByNewUser(@Param("userId") Long userId, @Param("sn") String sn);
List<Project> selectProjectListByCompanySn(HashMap<String, Object> map);
List<Project> selectProjectListByCompanySn(@Param("param") Map<String, Object> map);
}

View File

@ -761,17 +761,23 @@
INNER JOIN company b ON cp.parent_id = b.company_id
Left JOIN company f ON b.parent_id = f.company_id
<where>
<if test="companyType == '1'.toString()">
and f.headquarters_sn = #{sn}
<if test="param.projectName != null and param.projectName != ''">
and a.project_name like CONCAT(CONCAT('%', #{param.projectName}), '%')
</if>
<if test="companyType == '2'.toString()">
and f.company_sn = #{sn}
<if test="param.companyType == '1'.toString()">
and b.headquarters_sn = #{param.sn}
</if>
<if test="companyType == '3'.toString()">
and b.company_sn = #{sn}
<if test="param.companyType == '2'.toString()">
and f.company_sn = #{param.sn}
</if>
<if test="companyType == '5'.toString()">
and cp.company_sn = #{sn}
<if test="param.companyType == '3'.toString()">
and b.company_sn = #{param.sn}
</if>
<if test="param.companyType == '4'.toString()">
and a.project_sn = #{param.sn}
</if>
<if test="param.companyType == '5'.toString()">
and cp.company_sn = #{param.sn}
</if>
</where>
</select>

View File

@ -236,4 +236,6 @@ public interface IProjectService extends IService<Project> {
boolean hasProjectSnAccessByNewUser(Long userId, String sn);
List<Project> selectProjectListByCompanySn(HashMap<String, Object> map);
List<TreeProjectVideoListVo> selectTreeProjectVideoList(HashMap<String, Object> map);
}

View File

@ -1,6 +1,7 @@
package com.zhgd.xmgl.modules.project.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
@ -10,6 +11,8 @@ import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -61,6 +64,7 @@ import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItem;
import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemService;
import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.entity.ProjectConfig;
import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig;
import com.zhgd.xmgl.modules.project.entity.WSSsdrAddress;
import com.zhgd.xmgl.modules.project.entity.dto.CompanyProjectStat;
import com.zhgd.xmgl.modules.project.entity.dto.ProjectDevStat;
@ -80,6 +84,8 @@ import com.zhgd.xmgl.modules.video.entity.VideoItem;
import com.zhgd.xmgl.modules.video.mapper.VideoGroupMapper;
import com.zhgd.xmgl.modules.video.mapper.VideoItemMapper;
import com.zhgd.xmgl.modules.video.service.IAiAnalyseHardWareRecordService;
import com.zhgd.xmgl.modules.video.service.IVideoGroupService;
import com.zhgd.xmgl.modules.video.service.impl.VideoItemServiceImpl;
import com.zhgd.xmgl.modules.worker.entity.UfaceDev;
import com.zhgd.xmgl.modules.worker.service.*;
import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityDangerField;
@ -228,6 +234,12 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
@Lazy
@Autowired
private IXzSecurityDangerFieldService xzSecurityDangerFieldService;
@Lazy
@Autowired
private IVideoGroupService videoGroupService;
@Lazy
@Autowired
private VideoItemServiceImpl videoItemService;
@Override
public List<String> getProjectSnList(String sn) {
@ -453,9 +465,76 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
@Override
public List<Project> selectProjectListByCompanySn(HashMap<String, Object> map) {
companyService.getCompanyType(map);
return baseMapper.selectProjectListByCompanySn(map);
}
@Override
public List<TreeProjectVideoListVo> selectTreeProjectVideoList(HashMap<String, Object> map) {
List<Project> projects = this.selectProjectListByCompanySn(map);
if (CollUtil.isEmpty(projects)) {
return null;
}
List<TreeProjectVideoListVo> voList = projects.stream().map(p->{
TreeProjectVideoListVo vo = new TreeProjectVideoListVo();
vo.setId(p.getProjectSn());
vo.setParentId("0");
vo.setName(p.getProjectName());
vo.setType(TreeProjectVideoListVo.MonitorType.PROJECT.getCode());
return vo;
}).collect(Collectors.toList());
List<String> projectSns = projects.stream().map(Project::getProjectSn).collect(Collectors.toList());
List<VideoGroup> groups = videoGroupService.list(new LambdaQueryWrapper<VideoGroup>()
.in(VideoGroup::getProjectSn, projectSns));
List<TreeProjectVideoListVo> groupsVoList = groups.stream().map(g -> {
TreeProjectVideoListVo vo = new TreeProjectVideoListVo();
vo.setId(TreeProjectVideoListVo.MonitorType.GROUP.getCode() + "_" + g.getId());
String parentId = "";
if (Objects.equals(g.getParentId(), 0L)) {
parentId = g.getProjectSn();
} else {
parentId = TreeProjectVideoListVo.MonitorType.GROUP.getCode() + "_" + g.getParentId();
}
vo.setParentId(parentId);
vo.setName(g.getGroupName());
vo.setType(TreeProjectVideoListVo.MonitorType.GROUP.getCode());
return vo;
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(groupsVoList)) {
voList.addAll(groupsVoList);
}
List<ProjectVideoConfig> configs = projectVideoConfigService.list(new LambdaQueryWrapper<ProjectVideoConfig>()
.in(ProjectVideoConfig::getProjectSn, projectSns)
.eq(ProjectVideoConfig::getIsEnable, 1)
);
List<Long> groupIds = groups.stream().map(VideoGroup::getId).collect(Collectors.toList());
List<Long> configIds = configs.stream().map(ProjectVideoConfig::getId).collect(Collectors.toList());
if (CollUtil.isNotEmpty(groupIds)&&CollUtil.isNotEmpty(configIds)) {
List<VideoItem> items = videoItemService.list(new LambdaQueryWrapper<VideoItem>()
.in(VideoItem::getGroupId, groupIds)
.in(VideoItem::getVideoId, configIds)
);
Map<Long, ProjectVideoConfig> configMap = configs.stream().collect(Collectors.toMap(ProjectVideoConfig::getId, Function.identity(), (o1, o2) -> o1));
List<TreeProjectVideoListVo> itemVoList = items.stream().map(i -> {
TreeProjectVideoListVo vo = new TreeProjectVideoListVo();
vo.setId(TreeProjectVideoListVo.MonitorType.VIDEO.getCode() + "_" + i.getItemId());
vo.setParentId(TreeProjectVideoListVo.MonitorType.GROUP.getCode()+"_"+i.getGroupId());
vo.setName(i.getVideoName());
vo.setType(TreeProjectVideoListVo.MonitorType.VIDEO.getCode());
vo.setVideoItem(i);
vo.setProjectVideoConfig(configMap.get(i.getVideoId()));
return vo;
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(itemVoList)) {
voList.addAll(itemVoList);
}
}
String name = MapUtils.getString(map, "name");
List<TreeProjectVideoListVo> rtVoList = BeanUtil.copyToList(TreeUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(voList)), "id", "parentId", "children", "name", name), TreeProjectVideoListVo.class);
rtVoList = rtVoList.stream().filter(v -> Objects.equals(v.getType(), TreeProjectVideoListVo.MonitorType.PROJECT.getCode())).collect(Collectors.toList());
return rtVoList;
}
@Override
public void saveZwProject(ZwProjectDataVo zwProjectDataVo) {
Project project = new Project();

View File

@ -14,6 +14,7 @@ import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.jeecg.common.util.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import java.util.*;
@ -25,6 +26,18 @@ import java.util.*;
**/
@Slf4j
public class HikVideoUtil {
private static String replaceWssFrom;
private static String replaceWssTo;
@Value("${replaceWssFrom:wss://hrdl.zhgdyun.com}")
public void setReplaceWssFrom(String replaceWssFrom) {
HikVideoUtil.replaceWssFrom = replaceWssFrom;
}
@Value("${replaceWssTo:wss://sp.szjxj.com}")
public void setReplaceWssTo(String replaceWssTo) {
HikVideoUtil.replaceWssTo = replaceWssTo;
}
private static final String ARTEMIS_PATH = "/artemis";
@ -81,6 +94,10 @@ public class HikVideoUtil {
if ("0".equals((String) json.get("code"))) {
JSONObject object2 = (JSONObject) json.get("data");
url = (String) object2.get("url");
//替换wss域名
if (url.startsWith(HikVideoUtil.replaceWssFrom)) {
url = StrUtil.replace(url, HikVideoUtil.replaceWssFrom, HikVideoUtil.replaceWssTo);
}
}
} else {
throw new OpenAlertException(MessageUtil.get("failErr"));

View File

@ -222,7 +222,7 @@ spring.main.allow-circular-references=true
#上传文件限制
# 文件上传允许的扩展名
file.upload.allowed-extensions=jpg,jpeg,png,gif,bmp,webp,svg,tiff,ico,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,rtf,csv,mp4,avi,mov,wmv,flv,mkv,webm,m4v,3gp,mp3,wav,ogg,flac,aac,wma,m4a,zip,rar,7z,tar,gz,apk,html,htm
file.upload.allowed-mime-types=image/jpeg,image/png,image/gif,image/bmp,image/webp,image/svg+xml,image/tiff,image/x-icon,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,text/plain,application/rtf,text/csv,video/mp4,video/x-msvideo,video/quicktime,video/x-ms-wmv,video/x-flv,video/x-matroska,video/webm,video/3gpp,audio/mpeg,audio/wav,audio/ogg,audio/flac,audio/aac,audio/x-ms-wma,audio/mp4,application/zip,application/x-rar-compressed,application/x-7z-compressed,application/x-tar,application/gzip,application/vnd.android.package-archive,text/html#mcs8下载选择的是http内网、外网
file.upload.allowed-mime-types=image/jpeg,image/png,image/gif,image/bmp,image/webp,image/svg+xml,image/tiff,image/x-icon,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation,text/plain,application/rtf,text/csv,video/mp4,video/x-msvideo,video/quicktime,video/x-ms-wmv,video/x-flv,video/x-matroska,video/webm,video/3gpp,audio/mpeg,audio/wav,audio/ogg,audio/flac,audio/aac,audio/x-ms-wma,audio/mp4,application/zip,application/x-rar-compressed,application/x-7z-compressed,application/x-tar,application/gzip,application/vnd.android.package-archive,text/html
#mcs8下载选择的是http内网、外网
mcs8.download.http.type=httpPrivateUrl
publicServerUrl=http://gszhdz.crpower.com.cn