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;
import cn.hutool.core.util.ObjectUtil;
import com.zcloud.primeport.api.MkmjAreaServiceI;
import com.zcloud.primeport.domain.model.MkmjStatisticsE;
import com.zcloud.primeport.dto.MkmjAreaAddCmd;
@ -40,6 +41,10 @@ public class MkmjAreaController {
@PostMapping("/save")
public SingleResponse<MkmjAreaCO> add(@Validated @RequestBody MkmjAreaAddCmd cmd) {
SSOUser ssoUser = AuthContext.getCurrentUser();
if(ObjectUtil.isEmpty(cmd.getCorpinfoId())){
cmd.setCorpinfoId(ssoUser.getTenantId());
cmd.setCorpinfoName(ssoUser.getTenantName());
}
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.primeport.command.convertor.MkmjAreaCoConvertor;
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.dto.MkmjAreaPageQry;
import com.zcloud.primeport.dto.clientobject.MkmjAreaCO;
import com.zcloud.primeport.dto.clientobject.MkmjStatisticsCO;
import com.zcloud.primeport.persistence.dataobject.MkmjAreaDO;
import com.zcloud.primeport.persistence.repository.MkmjAreaRepository;
import com.zcloud.primeport.persistence.repository.MkmjCarRecordRepository;
import com.zcloud.primeport.persistence.repository.MkmjGateVideoRepository;
import com.zcloud.primeport.persistence.repository.MkmjSwipeCardRecordRepository;
import com.zcloud.primeport.persistence.repository.*;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
@ -37,6 +35,7 @@ public class MkmjAreaQueryExe {
private final MkmjGateVideoRepository mkmjGateVideoRepository;
private final MkmjCarRecordRepository mkmjCarRecordRepository;
private final MkmjSwipeCardRecordRepository mkmjSwipeCardRecordRepository;
private final MkmjPassageRepository mkmjPassageRepository;
/**
* id
@ -58,15 +57,23 @@ public class MkmjAreaQueryExe {
Map<String, Object> params = PageQueryHelper.toHashMap(mkmjAreaPageQry);
PageResponse<MkmjAreaDO> pageResponse = mkmjAreaRepository.listPage(params);
List<MkmjAreaCO> examCenterCOS = mkmjAreaCoConvertor.converDOsToCOs(pageResponse.getData());
List<String> ids = examCenterCOS.stream().map(MkmjAreaCO::getAreaId).collect(Collectors.toList());
List<VideoCountE> videoCounts = mkmjGateVideoRepository.listVideoCountByAreaId(ids);
examCenterCOS.forEach(examCenterCO -> {
videoCounts.forEach(videoCount -> {
if (examCenterCO.getAreaId().equals(videoCount.getAreaGateId())) {
examCenterCO.setVideoNum(videoCount.getCount());
}
if(examCenterCOS.size() > 0) {
List<String> ids = examCenterCOS.stream().map(MkmjAreaCO::getAreaId).collect(Collectors.toList());
List<VideoCountE> videoCounts = mkmjGateVideoRepository.listVideoCountByAreaId(ids);
List<PassageCountE> passageCounts = mkmjPassageRepository.listPassageCountByAreaId(ids);
examCenterCOS.forEach(examCenterCO -> {
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());
}

View File

@ -57,5 +57,11 @@ public class MkmjAreaAddCmd extends Command {
@NotEmpty(message = "纬度不能为空")
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)
@NotEmpty(message = "纬度不能为空")
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;
//企业id
@ApiModelProperty(value = "企业id")
private String corpinfoId;
private Long corpinfoId;
@ApiModelProperty(value = "企业名称")
private String corpinfoName;
//经度
@ApiModelProperty(value = "经度")
private String longitude;
@ -52,5 +54,8 @@ public class MkmjAreaCO extends ClientObject {
// 视频个数
@ApiModelProperty(value = "视频个数")
private Long videoNum;
// 通道个数
@ApiModelProperty(value = "通道个数")
private Long passageNum;
}

View File

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

View File

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

View File

@ -1,9 +1,11 @@
package com.zcloud.primeport.persistence.repository;
import com.zcloud.primeport.domain.model.PassageCountE;
import com.zcloud.primeport.persistence.dataobject.MkmjPassageDO;
import com.alibaba.cola.dto.PageResponse;
import com.jjb.saas.framework.repository.repo.BaseRepository;
import java.util.List;
import java.util.Map;
/**
@ -14,5 +16,7 @@ import java.util.Map;
*/
public interface MkmjPassageRepository extends BaseRepository<MkmjPassageDO> {
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);
QueryWrapper<MkmjAreaDO> queryWrapper = new QueryWrapper<>();
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);
return PageHelper.pageToResponse(result, result.getRecords());
}

View File

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

View File

@ -1,6 +1,8 @@
package com.zcloud.primeport.persistence.repository.impl;
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.mapper.MkmjPassageMapper;
import com.zcloud.primeport.persistence.repository.MkmjPassageRepository;
@ -13,6 +15,7 @@ import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
@ -35,5 +38,10 @@ public class MkmjPassageRepositoryImpl extends BaseRepositoryImpl<MkmjPassageMap
IPage<MkmjPassageDO> result = mkmjPassageMapper.selectPage(iPage, queryWrapper);
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
from mkmj_gate_video
<where>
and delete_enum = 'FALSE'
<if test="ids != null and ids.size() > 0">
and area_gate_id in
<foreach item="item" index="index" collection="ids" open="(" separator="," close=")">

View File

@ -4,5 +4,20 @@
<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>