feat(area): 新增区域通道数量统计功能

- 在MkmjAreaController中新增企业ID和名称的自动填充逻辑
- 修改MkmjAreaQueryExe以支持查询区域下的通道数量
- 新增PassageCountE实体类用于通道数量统计
- 更新MkmjAreaCO和相关DTO以支持corpinfoId和corpinfoName字段
- 在MkmjPassageMapper中增加listPassageCountByAreaId方法及XML配置
- 优化区域列表查询逻辑,按area_status排序并统计视频和通道数量
- 修复GateVideo统计查询中的格式问题并增加删除枚举过滤条件
master
fangjiakai 2025-12-11 15:11:58 +08:00
parent 39a820d568
commit 36d0e38a26
15 changed files with 96 additions and 18 deletions

View File

@ -1,6 +1,7 @@
package com.zcloud.primeport.web; package com.zcloud.primeport.web;
import cn.hutool.core.util.ObjectUtil;
import com.zcloud.primeport.api.MkmjAreaServiceI; import com.zcloud.primeport.api.MkmjAreaServiceI;
import com.zcloud.primeport.domain.model.MkmjStatisticsE; import com.zcloud.primeport.domain.model.MkmjStatisticsE;
import com.zcloud.primeport.dto.MkmjAreaAddCmd; import com.zcloud.primeport.dto.MkmjAreaAddCmd;
@ -40,6 +41,10 @@ public class MkmjAreaController {
@PostMapping("/save") @PostMapping("/save")
public SingleResponse<MkmjAreaCO> add(@Validated @RequestBody MkmjAreaAddCmd cmd) { public SingleResponse<MkmjAreaCO> add(@Validated @RequestBody MkmjAreaAddCmd cmd) {
SSOUser ssoUser = AuthContext.getCurrentUser(); SSOUser ssoUser = AuthContext.getCurrentUser();
if(ObjectUtil.isEmpty(cmd.getCorpinfoId())){
cmd.setCorpinfoId(ssoUser.getTenantId());
cmd.setCorpinfoName(ssoUser.getTenantName());
}
return mkmjAreaService.add(cmd); return mkmjAreaService.add(cmd);
} }

View File

@ -4,15 +4,13 @@ import com.alibaba.cola.dto.PageResponse;
import com.zcloud.gbscommon.utils.PageQueryHelper; import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.primeport.command.convertor.MkmjAreaCoConvertor; import com.zcloud.primeport.command.convertor.MkmjAreaCoConvertor;
import com.zcloud.primeport.domain.model.MkmjStatisticsE; import com.zcloud.primeport.domain.model.MkmjStatisticsE;
import com.zcloud.primeport.domain.model.PassageCountE;
import com.zcloud.primeport.domain.model.VideoCountE; import com.zcloud.primeport.domain.model.VideoCountE;
import com.zcloud.primeport.dto.MkmjAreaPageQry; import com.zcloud.primeport.dto.MkmjAreaPageQry;
import com.zcloud.primeport.dto.clientobject.MkmjAreaCO; import com.zcloud.primeport.dto.clientobject.MkmjAreaCO;
import com.zcloud.primeport.dto.clientobject.MkmjStatisticsCO; import com.zcloud.primeport.dto.clientobject.MkmjStatisticsCO;
import com.zcloud.primeport.persistence.dataobject.MkmjAreaDO; import com.zcloud.primeport.persistence.dataobject.MkmjAreaDO;
import com.zcloud.primeport.persistence.repository.MkmjAreaRepository; import com.zcloud.primeport.persistence.repository.*;
import com.zcloud.primeport.persistence.repository.MkmjCarRecordRepository;
import com.zcloud.primeport.persistence.repository.MkmjGateVideoRepository;
import com.zcloud.primeport.persistence.repository.MkmjSwipeCardRecordRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -37,6 +35,7 @@ public class MkmjAreaQueryExe {
private final MkmjGateVideoRepository mkmjGateVideoRepository; private final MkmjGateVideoRepository mkmjGateVideoRepository;
private final MkmjCarRecordRepository mkmjCarRecordRepository; private final MkmjCarRecordRepository mkmjCarRecordRepository;
private final MkmjSwipeCardRecordRepository mkmjSwipeCardRecordRepository; private final MkmjSwipeCardRecordRepository mkmjSwipeCardRecordRepository;
private final MkmjPassageRepository mkmjPassageRepository;
/** /**
* id * id
@ -58,15 +57,23 @@ public class MkmjAreaQueryExe {
Map<String, Object> params = PageQueryHelper.toHashMap(mkmjAreaPageQry); Map<String, Object> params = PageQueryHelper.toHashMap(mkmjAreaPageQry);
PageResponse<MkmjAreaDO> pageResponse = mkmjAreaRepository.listPage(params); PageResponse<MkmjAreaDO> pageResponse = mkmjAreaRepository.listPage(params);
List<MkmjAreaCO> examCenterCOS = mkmjAreaCoConvertor.converDOsToCOs(pageResponse.getData()); List<MkmjAreaCO> examCenterCOS = mkmjAreaCoConvertor.converDOsToCOs(pageResponse.getData());
List<String> ids = examCenterCOS.stream().map(MkmjAreaCO::getAreaId).collect(Collectors.toList()); if(examCenterCOS.size() > 0) {
List<VideoCountE> videoCounts = mkmjGateVideoRepository.listVideoCountByAreaId(ids); List<String> ids = examCenterCOS.stream().map(MkmjAreaCO::getAreaId).collect(Collectors.toList());
examCenterCOS.forEach(examCenterCO -> { List<VideoCountE> videoCounts = mkmjGateVideoRepository.listVideoCountByAreaId(ids);
videoCounts.forEach(videoCount -> { List<PassageCountE> passageCounts = mkmjPassageRepository.listPassageCountByAreaId(ids);
if (examCenterCO.getAreaId().equals(videoCount.getAreaGateId())) { examCenterCOS.forEach(examCenterCO -> {
examCenterCO.setVideoNum(videoCount.getCount()); videoCounts.forEach(videoCount -> {
} if (examCenterCO.getAreaId().equals(videoCount.getAreaGateId())) {
examCenterCO.setVideoNum(videoCount.getCount());
}
});
passageCounts.forEach(passageCount -> {
if (examCenterCO.getAreaId().equals(passageCount.getAreaId())) {
examCenterCO.setPassageNum(passageCount.getCount());
}
});
}); });
}); }
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex()); return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
} }

View File

@ -57,5 +57,11 @@ public class MkmjAreaAddCmd extends Command {
@NotEmpty(message = "纬度不能为空") @NotEmpty(message = "纬度不能为空")
private String latitude; private String latitude;
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId;
@ApiModelProperty(value = "企业名称", name = "corpinfoName")
private String corpinfoName;
} }

View File

@ -54,5 +54,10 @@ public class MkmjAreaUpdateCmd extends Command {
@ApiModelProperty(value = "纬度", name = "latitude", required = true) @ApiModelProperty(value = "纬度", name = "latitude", required = true)
@NotEmpty(message = "纬度不能为空") @NotEmpty(message = "纬度不能为空")
private String latitude; private String latitude;
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId;
@ApiModelProperty(value = "企业名称", name = "corpinfoName")
private String corpinfoName;
} }

View File

@ -42,7 +42,9 @@ public class MkmjAreaCO extends ClientObject {
private Integer areaStatus; private Integer areaStatus;
//企业id //企业id
@ApiModelProperty(value = "企业id") @ApiModelProperty(value = "企业id")
private String corpinfoId; private Long corpinfoId;
@ApiModelProperty(value = "企业名称")
private String corpinfoName;
//经度 //经度
@ApiModelProperty(value = "经度") @ApiModelProperty(value = "经度")
private String longitude; private String longitude;
@ -52,5 +54,8 @@ public class MkmjAreaCO extends ClientObject {
// 视频个数 // 视频个数
@ApiModelProperty(value = "视频个数") @ApiModelProperty(value = "视频个数")
private Long videoNum; private Long videoNum;
// 通道个数
@ApiModelProperty(value = "通道个数")
private Long passageNum;
} }

View File

@ -1,6 +1,7 @@
package com.zcloud.primeport.domain.model; package com.zcloud.primeport.domain.model;
import com.jjb.saas.framework.domain.model.BaseE; import com.jjb.saas.framework.domain.model.BaseE;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
@ -27,11 +28,12 @@ public class MkmjAreaE extends BaseE {
private Integer areaType; private Integer areaType;
//区域状态 0-停用 1-正常 2-暂时关闭 //区域状态 0-停用 1-正常 2-暂时关闭
private Integer areaStatus; private Integer areaStatus;
//企业id
private String corpinfoId;
//经度 //经度
private String longitude; private String longitude;
//纬度 //纬度
private String latitude; private String latitude;
private Long corpinfoId;
private String corpinfoName;
} }

View File

@ -0,0 +1,14 @@
package com.zcloud.primeport.domain.model;
import com.jjb.saas.framework.domain.model.BaseE;
import lombok.Data;
/**
* @author fangjiakai
* @date 2025/11/14 10:24
*/
@Data
public class PassageCountE extends BaseE {
private String areaId;
private Long count;
}

View File

@ -44,7 +44,9 @@ public class MkmjAreaDO extends BaseDO {
private Integer areaStatus; private Integer areaStatus;
//企业id //企业id
@ApiModelProperty(value = "企业id") @ApiModelProperty(value = "企业id")
private String corpinfoId; private Long corpinfoId;
@ApiModelProperty(value = "企业名称")
private String corpinfoName;
//经度 //经度
@ApiModelProperty(value = "经度") @ApiModelProperty(value = "经度")
private String longitude; private String longitude;

View File

@ -1,9 +1,12 @@
package com.zcloud.primeport.persistence.mapper; package com.zcloud.primeport.persistence.mapper;
import com.zcloud.primeport.domain.model.PassageCountE;
import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO; import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* web-infrastructure * web-infrastructure
* *
@ -13,5 +16,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface MkmjPassageMapper extends BaseMapper<MkmjPassageDO> { public interface MkmjPassageMapper extends BaseMapper<MkmjPassageDO> {
List<PassageCountE> listPassageCountByAreaId(List<String> ids);
} }

View File

@ -1,9 +1,11 @@
package com.zcloud.primeport.persistence.repository; package com.zcloud.primeport.persistence.repository;
import com.zcloud.primeport.domain.model.PassageCountE;
import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO; import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO;
import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository; import com.jjb.saas.framework.repository.repo.BaseRepository;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -14,5 +16,7 @@ import java.util.Map;
*/ */
public interface MkmjPassageRepository extends BaseRepository<MkmjPassageDO> { public interface MkmjPassageRepository extends BaseRepository<MkmjPassageDO> {
PageResponse<MkmjPassageDO> listPage(Map<String, Object> params); PageResponse<MkmjPassageDO> listPage(Map<String, Object> params);
List<PassageCountE> listPassageCountByAreaId(List<String> ids);
} }

View File

@ -31,7 +31,8 @@ public class MkmjAreaRepositoryImpl extends BaseRepositoryImpl<MkmjAreaMapper, M
IPage<MkmjAreaDO> iPage = new Query<MkmjAreaDO>().getPage(params); IPage<MkmjAreaDO> iPage = new Query<MkmjAreaDO>().getPage(params);
QueryWrapper<MkmjAreaDO> queryWrapper = new QueryWrapper<>(); QueryWrapper<MkmjAreaDO> queryWrapper = new QueryWrapper<>();
queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params); queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params);
queryWrapper.orderByDesc("create_time"); queryWrapper.apply("FIELD(area_status, 1, 0, 2)")
.orderByDesc("create_time");
IPage<MkmjAreaDO> result = mkmjAreaMapper.selectPage(iPage, queryWrapper); IPage<MkmjAreaDO> result = mkmjAreaMapper.selectPage(iPage, queryWrapper);
return PageHelper.pageToResponse(result, result.getRecords()); return PageHelper.pageToResponse(result, result.getRecords());
} }

View File

@ -42,7 +42,6 @@ public class MkmjGateVideoRepositoryImpl extends BaseRepositoryImpl<MkmjGateVide
@Override @Override
public List<VideoCountE> listVideoCountByAreaId(List<String> ids){ public List<VideoCountE> listVideoCountByAreaId(List<String> ids){
return mkmjGateVideoMapper.listVideoCountByAreaId(ids); return mkmjGateVideoMapper.listVideoCountByAreaId(ids);
} }
} }

View File

@ -1,6 +1,8 @@
package com.zcloud.primeport.persistence.repository.impl; package com.zcloud.primeport.persistence.repository.impl;
import com.jjb.saas.framework.repository.common.PageHelper; import com.jjb.saas.framework.repository.common.PageHelper;
import com.zcloud.primeport.domain.model.PassageCountE;
import com.zcloud.primeport.domain.model.VideoCountE;
import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO; import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO;
import com.zcloud.primeport.persistence.mapper.MkmjPassageMapper; import com.zcloud.primeport.persistence.mapper.MkmjPassageMapper;
import com.zcloud.primeport.persistence.repository.MkmjPassageRepository; import com.zcloud.primeport.persistence.repository.MkmjPassageRepository;
@ -13,6 +15,7 @@ import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -35,5 +38,10 @@ public class MkmjPassageRepositoryImpl extends BaseRepositoryImpl<MkmjPassageMap
IPage<MkmjPassageDO> result = mkmjPassageMapper.selectPage(iPage, queryWrapper); IPage<MkmjPassageDO> result = mkmjPassageMapper.selectPage(iPage, queryWrapper);
return PageHelper.pageToResponse(result, result.getRecords()); return PageHelper.pageToResponse(result, result.getRecords());
} }
@Override
public List<PassageCountE> listPassageCountByAreaId(List<String> ids){
return mkmjPassageMapper.listPassageCountByAreaId(ids);
}
} }

View File

@ -8,6 +8,7 @@
select area_gate_id,count(1) as count select area_gate_id,count(1) as count
from mkmj_gate_video from mkmj_gate_video
<where> <where>
and delete_enum = 'FALSE'
<if test="ids != null and ids.size() > 0"> <if test="ids != null and ids.size() > 0">
and area_gate_id in and area_gate_id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")"> <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">

View File

@ -4,5 +4,20 @@
<mapper namespace="com.zcloud.primeport.persistence.mapper.MkmjPassageMapper"> <mapper namespace="com.zcloud.primeport.persistence.mapper.MkmjPassageMapper">
<select id="listPassageCountByAreaId" resultType="com.zcloud.primeport.domain.model.PassageCountE">
select area_id,count(1) as count
from mkmj_passage
<where>
and delete_enum = 'FALSE'
<if test="ids != null and ids.size() > 0">
and area_id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
group by area_id
</select>
</mapper> </mapper>