diff --git a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AlarmRecordController.java b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AlarmRecordController.java index 59e68c8..2ea2e77 100644 --- a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AlarmRecordController.java +++ b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AlarmRecordController.java @@ -8,9 +8,12 @@ import com.jjb.saas.framework.auth.model.SSOUser; import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.personnel.positioning.api.AlarmRecordServiceI; import com.zcloud.personnel.positioning.dto.AlarmRecordAddCmd; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiAlarmTypeQry; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiQry; import com.zcloud.personnel.positioning.dto.AlarmRecordPageQry; import com.zcloud.personnel.positioning.dto.AlarmRecordUpdateCmd; import com.zcloud.personnel.positioning.dto.clientobject.AlarmRecordCO; +import com.zcloud.personnel.positioning.dto.clientobject.AlarmTypeStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -58,6 +61,7 @@ public class AlarmRecordController { return MultiResponse.of(alarmRecordService.listAll()); } + @ApiOperation("公司选项") @GetMapping("/companyOptions") public MultiResponse companyOptions() { @@ -111,4 +115,17 @@ public class AlarmRecordController { cmd.setCorpinfoId(String.valueOf(ssoUser.getCompanyId())); } } + + @ApiOperation("可视化大屏-报警列表") + @PostMapping("/bi/list") + public MultiResponse listBiAlarm(@RequestBody AlarmRecordBiQry qry) { + return MultiResponse.of(alarmRecordService.listBiAlarm(qry)); + } + + @ApiOperation("可视化大屏-报警类型") + @PostMapping("/bi/alarmType") + public MultiResponse listBiAlarmType(@RequestBody AlarmRecordBiAlarmTypeQry qry) { + return MultiResponse.of(alarmRecordService.listBiAlarmType(qry)); + } + } diff --git a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AreaController.java b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AreaController.java index 67a6401..e0e2880 100644 --- a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AreaController.java +++ b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/AreaController.java @@ -4,7 +4,9 @@ import com.zcloud.personnel.positioning.api.AreaServiceI; import com.zcloud.personnel.positioning.dto.AreaAddCmd; import com.zcloud.personnel.positioning.dto.AreaPageQry; import com.zcloud.personnel.positioning.dto.AreaUpdateCmd; +import com.zcloud.personnel.positioning.dto.BiPersonPositionQry; import com.zcloud.personnel.positioning.dto.clientobject.AreaCO; +import com.zcloud.personnel.positioning.dto.clientobject.AreaPersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.alibaba.cola.dto.MultiResponse; import com.alibaba.cola.dto.PageResponse; @@ -65,6 +67,7 @@ public class AreaController { return MultiResponse.of(areaService.listOptions(corpinfoId, keyword)); } + @ApiOperation("详情") @GetMapping("/{id}") public SingleResponse getInfoById(@PathVariable("id") Long id) { @@ -106,4 +109,11 @@ public class AreaController { cmd.setCorpinfoId(String.valueOf(ssoUser.getCompanyId())); } } + + + @ApiOperation("可视化大屏-封闭区域人员统计情况") + @PostMapping("/personStat") + public MultiResponse listPersonStat(@RequestBody BiPersonPositionQry qry) { + return MultiResponse.of(areaService.listPersonStat(qry.getCorpinfoId())); + } } diff --git a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/PersonnelPositioningBiController.java b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/PersonnelPositioningBiController.java index 9c99f4d..9b0aa48 100644 --- a/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/PersonnelPositioningBiController.java +++ b/web-adapter/src/main/java/com/zcloud/personnel/positioning/web/PersonnelPositioningBiController.java @@ -6,12 +6,16 @@ import com.alibaba.cola.dto.SingleResponse; import com.zcloud.personnel.positioning.api.PersonnelPositioningBiServiceI; import com.zcloud.personnel.positioning.dto.BiAreaFenceQry; import com.zcloud.personnel.positioning.dto.BiCompanyFenceQry; +import com.zcloud.personnel.positioning.dto.BiCompanyOnlinePersonQry; import com.zcloud.personnel.positioning.dto.BiPersonLocationQry; +import com.zcloud.personnel.positioning.dto.BiPersonPositionQry; import com.zcloud.personnel.positioning.dto.BiPersonTraceQry; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonTraceCO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,7 +29,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** - * 人员定位BI接口。 + * 人员定位BI接口 * * @Author fangjiakai * @Date 2026-07-07 @@ -62,6 +66,9 @@ public class PersonnelPositioningBiController { return personnelPositioningBiService.listPersonLocation(qry); } + + + @ApiOperation("人员轨迹") @PostMapping("/personTrace") public SingleResponse queryPersonTrace(@RequestBody BiPersonTraceQry qry) { @@ -85,4 +92,16 @@ public class PersonnelPositioningBiController { public SingleResponse queryAreaFenceById(@PathVariable("id") Long id) { return SingleResponse.of(personnelPositioningBiService.queryAreaFenceById(id)); } + + @ApiOperation("可视化大屏-企业在线人员统计") + @PostMapping("/personLocation/companyOnlineStat") + public SingleResponse queryCompanyOnlinePersonStat( + @RequestBody BiCompanyOnlinePersonQry qry) { + return SingleResponse.of(personnelPositioningBiService.queryCompanyOnlinePersonStat(qry)); + } + @ApiOperation("可视化大屏-人员定位列表") + @PostMapping("/personLocation/positioning") + public MultiResponse listPersonPosition(@RequestBody BiPersonPositionQry qry) { + return MultiResponse.of(personnelPositioningBiService.listPersonPosition(qry)); + } } diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AlarmRecordQueryExe.java b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AlarmRecordQueryExe.java index cc2b4fd..7ba9728 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AlarmRecordQueryExe.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AlarmRecordQueryExe.java @@ -1,15 +1,20 @@ package com.zcloud.personnel.positioning.command.query; import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.exception.BizException; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.jjb.saas.framework.auth.model.SSOUser; import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.personnel.positioning.command.convertor.AlarmRecordCoConvertor; import com.zcloud.personnel.positioning.command.convertor.AlarmRecordTargetCoConvertor; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiAlarmTypeQry; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiQry; import com.zcloud.personnel.positioning.dto.AlarmRecordPageQry; import com.zcloud.personnel.positioning.dto.clientobject.AlarmRecordCO; +import com.zcloud.personnel.positioning.dto.clientobject.AlarmTypeStatCO; import com.zcloud.personnel.positioning.dto.clientobject.AlarmRecordTargetCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; +import com.zcloud.personnel.positioning.persistence.dataobject.AlarmTypeStatDO; import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO; import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordTargetDO; import com.zcloud.personnel.positioning.persistence.dataobject.CompanyOptionDO; @@ -55,6 +60,35 @@ public class AlarmRecordQueryExe { return PageResponse.of(data, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex()); } + public List listBiAlarm(AlarmRecordBiQry qry) { + AlarmRecordBiQry query = qry == null ? new AlarmRecordBiQry() : qry; + String corpinfoId = query.getCorpinfoId() == null ? null : String.valueOf(query.getCorpinfoId()); + List rows = alarmRecordCoConvertor.converDOsToCOs( + alarmRecordRepository.listBiAlarm(corpinfoId, query.getPortArea())); + return rows; + } + + public List listBiAlarmType(AlarmRecordBiAlarmTypeQry qry) { + AlarmRecordBiAlarmTypeQry query = qry == null ? new AlarmRecordBiAlarmTypeQry() : qry; + String corpinfoId = query.getCorpinfoId() == null ? null : String.valueOf(query.getCorpinfoId()); + List rows = alarmRecordRepository.listBiAlarmType(corpinfoId); + if (rows == null || rows.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (AlarmTypeStatDO row : rows) { + if (row == null) { + continue; + } + AlarmTypeStatCO co = new AlarmTypeStatCO(); + co.setAlarmCode(row.getAlarmCode()); + co.setAlarmName(alarmTypeNameOf(row.getAlarmCode(), row.getAlarmName())); + co.setAlarmCount(row.getAlarmCount()); + result.add(co); + } + return result; + } + public List listAll() { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("delete_enum", "FALSE"); @@ -190,6 +224,7 @@ public class AlarmRecordQueryExe { } } + private String normalizeAlarmCode(String value) { if (!StringUtils.hasText(value)) { return null; @@ -274,7 +309,16 @@ public class AlarmRecordQueryExe { return alarmCode; } + private String alarmTypeNameOf(String alarmCode, String alarmName) { + String name = defaultIfBlank(alarmName, alarmNameOf(alarmCode)); + if (name != null && name.contains("-")) { + return name.substring(name.lastIndexOf('-') + 1); + } + return name; + } + private String defaultIfBlank(String value, String defaultValue) { return StringUtils.hasText(value) ? value : defaultValue; } + } diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AreaQueryExe.java b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AreaQueryExe.java index 7bdb960..1a00bed 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AreaQueryExe.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/AreaQueryExe.java @@ -4,17 +4,24 @@ import com.zcloud.gbscommon.utils.PageQueryHelper; import com.zcloud.personnel.positioning.command.convertor.AreaCoConvertor; import com.zcloud.personnel.positioning.dto.AreaPageQry; import com.zcloud.personnel.positioning.dto.clientobject.AreaCO; +import com.zcloud.personnel.positioning.dto.clientobject.AreaPersonStatCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.zcloud.personnel.positioning.persistence.dataobject.AreaDO; import com.zcloud.personnel.positioning.persistence.repository.AreaRepository; import com.alibaba.cola.dto.PageResponse; +import com.alibaba.cola.exception.BizException; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.jjb.saas.framework.auth.model.SSOUser; import com.jjb.saas.framework.auth.utils.AuthContext; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import java.io.IOException; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -30,6 +37,8 @@ import java.util.Map; public class AreaQueryExe { private final AreaRepository areaRepository; private final AreaCoConvertor areaCoConvertor; + private final BiPersonLocationProvider biPersonLocationProvider; + private final ObjectMapper objectMapper; public PageResponse execute(AreaPageQry qry) { AreaPageQry query = qry == null ? new AreaPageQry() : qry; @@ -66,6 +75,24 @@ public class AreaQueryExe { return options; } + public List listPersonStat(Long corpinfoId) { + if (corpinfoId == null) { + throw new BizException("企业id不能为空"); + } + String companyId = String.valueOf(corpinfoId); + List areas = listCompanyAreas(companyId); + List personList = + biPersonLocationProvider.listCompanyOnlinePersons(companyId, null, null); + for (BiCompanyOnlinePersonCO person : personList) { + countPerson(areas, person); + } + List result = new ArrayList<>(areas.size()); + for (AreaStatAccumulator area : areas) { + result.add(area.toCO()); + } + return result; + } + public AreaCO queryById(Long id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); @@ -74,6 +101,85 @@ public class AreaQueryExe { return areaCoConvertor.converDOToCO(dataObject); } + private List listCompanyAreas(String corpinfoId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.isNull("delete_enum").or().eq("delete_enum", "FALSE")); + queryWrapper.and(wrapper -> wrapper.isNull("status").or().eq("status", "ENABLED")); + queryWrapper.eq("corpinfo_id", corpinfoId); + queryWrapper.orderByAsc("sort_no").orderByAsc("area_name").orderByDesc("create_time"); + List rows = areaRepository.list(queryWrapper); + List result = new ArrayList<>(rows.size()); + for (AreaDO row : rows) { + result.add(new AreaStatAccumulator(row, parsePolygon(row.getPolygonJson()))); + } + return result; + } + + private void countPerson(List areas, BiCompanyOnlinePersonCO person) { + if (person == null || person.getLon() == null || person.getLat() == null) { + return; + } + for (AreaStatAccumulator area : areas) { + if (pointInPolygon(person.getLon(), person.getLat(), area.points)) { + area.add(person); + return; + } + } + } + + private List parsePolygon(String polygonJson) { + List points = new ArrayList<>(); + if (!StringUtils.hasText(polygonJson)) { + return points; + } + try { + collectPoints(objectMapper.readTree(polygonJson), points); + } catch (IOException e) { + throw new BizException("区域边界坐标JSON格式错误"); + } + return points; + } + + private void collectPoints(JsonNode node, List points) { + if (node == null || node.isNull() || node.isMissingNode()) { + return; + } + if (node.isObject()) { + node.elements().forEachRemaining(child -> collectPoints(child, points)); + return; + } + if (!node.isArray()) { + return; + } + if (node.size() >= 2 && node.get(0).isNumber() && node.get(1).isNumber()) { + points.add(new BigDecimal[]{node.get(0).decimalValue(), node.get(1).decimalValue()}); + return; + } + for (JsonNode child : node) { + collectPoints(child, points); + } + } + + private boolean pointInPolygon(BigDecimal lon, BigDecimal lat, List points) { + if (lon == null || lat == null || points == null || points.size() < 3) { + return false; + } + boolean inside = false; + double x = lon.doubleValue(); + double y = lat.doubleValue(); + for (int i = 0, j = points.size() - 1; i < points.size(); j = i++) { + double xi = points.get(i)[0].doubleValue(); + double yi = points.get(i)[1].doubleValue(); + double xj = points.get(j)[0].doubleValue(); + double yj = points.get(j)[1].doubleValue(); + if ((yi > y) != (yj > y) + && x < (xj - xi) * (y - yi) / (yj - yi) + xi) { + inside = !inside; + } + } + return inside; + } + private void fillCorpinfo(Map params) { if (params.get("eqCorpinfoId") != null || StringUtils.hasText((String) params.get("likeCorpinfoName"))) { return; @@ -94,4 +200,41 @@ public class AreaQueryExe { queryWrapper.eq("corpinfo_id", String.valueOf(ssoUser.getCompanyId())); } } + + private static class AreaStatAccumulator { + private final AreaDO area; + private final List points; + private int unitCount; + private int relatedCount; + + private AreaStatAccumulator(AreaDO area, List points) { + this.area = area; + this.points = points; + } + + private void add(BiCompanyOnlinePersonCO person) { + if (Boolean.TRUE.equals(person.getInternalEmployee())) { + unitCount++; + } else { + relatedCount++; + } + } + + private AreaPersonStatCO toCO() { + AreaPersonStatCO co = new AreaPersonStatCO(); + co.setAreaId(area.getId()); + co.setAreaCode(area.getAreaCode()); + co.setAreaName(area.getAreaName()); + co.setAreaType(area.getAreaType()); + co.setCorpinfoId(area.getCorpinfoId()); + co.setCorpinfoName(area.getCorpinfoName()); + co.setCenterLon(area.getCenterLon()); + co.setCenterLat(area.getCenterLat()); + co.setPolygonJson(area.getPolygonJson()); + co.setUnitCount(unitCount); + co.setRelatedCount(relatedCount); + co.setTotalCount(unitCount + relatedCount); + return co; + } + } } diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/BiPersonLocationProvider.java b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/BiPersonLocationProvider.java new file mode 100644 index 0000000..b4db936 --- /dev/null +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/BiPersonLocationProvider.java @@ -0,0 +1,151 @@ +package com.zcloud.personnel.positioning.command.query; + +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO; +import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; +import com.zcloud.personnel.positioning.persistence.repository.UserRepository; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 可视化大屏第三方人员定位统一入口。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Component +@RequiredArgsConstructor +public class BiPersonLocationProvider { + private static final Logger LOGGER = LoggerFactory.getLogger(BiPersonLocationProvider.class); + + private final UserRepository userRepository; + + public List listCompanyOnlinePersons(String corpinfoId, + String corpinfoName, + String corpCode) { + if (!StringUtils.hasText(corpinfoId)) { + return Collections.emptyList(); + } + LOGGER.info("开始查询可视化大屏第三方人员定位,corpinfoId={}", corpinfoId); + List locations = loadThirdPartyPersonLocations(corpinfoId, corpinfoName, corpCode); + if (locations.isEmpty()) { + LOGGER.info("可视化大屏第三方人员定位为空,corpinfoId={}", corpinfoId); + return Collections.emptyList(); + } + Map userMap = buildUserMap(corpinfoId); + List result = new ArrayList<>(locations.size()); + for (ThirdPartyPersonLocation location : locations) { + result.add(toOnlinePerson(corpinfoId, corpinfoName, location, userMap)); + } + LOGGER.info("可视化大屏第三方人员定位转换完成,corpinfoId={},定位人数={}", corpinfoId, result.size()); + return result; + } + + private List loadThirdPartyPersonLocations(String corpinfoId, + String corpinfoName, + String corpCode) { + LOGGER.info("TODO 待接入第三方人员定位接口,corpinfoId={},corpinfoName={},corpCode={}", + corpinfoId, corpinfoName, corpCode); + // TODO 后续只在这里接入第三方接口:根据企业id获取在线人员、经纬度、定位时间、人员唯一标识。 + return Collections.emptyList(); + } + + private Map buildUserMap(String corpinfoId) { + List users = userRepository.listBiPersonPositionUsers(corpinfoId); + Map result = new LinkedHashMap<>(); + for (BiPersonPositionUserDO user : users) { + putUser(result, user.getUserId() == null ? null : String.valueOf(user.getUserId()), user); + putUser(result, user.getUsername(), user); + putUser(result, user.getMobileNo(), user); + putUser(result, user.getIdCardNo(), user); + } + return result; + } + + private void putUser(Map userMap, + String key, + BiPersonPositionUserDO user) { + if (StringUtils.hasText(key)) { + userMap.putIfAbsent(key.trim(), user); + } + } + + private BiCompanyOnlinePersonCO toOnlinePerson(String corpinfoId, + String corpinfoName, + ThirdPartyPersonLocation location, + Map userMap) { + BiPersonPositionUserDO user = findUser(location, userMap); + BiCompanyOnlinePersonCO co = new BiCompanyOnlinePersonCO(); + co.setUserId(user == null ? null : user.getUserId()); + co.setStaffName(firstText(user == null ? null : user.getPersonName(), location.getPersonName())); + co.setStaffNo(firstText(location.getStaffNo(), location.getUsername())); + co.setMobileNo(firstText(user == null ? null : user.getMobileNo(), location.getMobileNo())); + co.setCorpinfoId(corpinfoId); + co.setCorpinfoName(firstText(corpinfoName, user == null ? null : user.getCorpinfoName())); + co.setInternalEmployee(user != null); + co.setPersonType(user == null ? "TEMP" : "INTERNAL"); + co.setTerminalNo(location.getTerminalNo()); + co.setCurrentLocation(location.getLocationName()); + co.setLastLocationTime(location.getLastLocationTime()); + co.setLon(location.getLon()); + co.setLat(location.getLat()); + co.setStaffRawJson(location.getPersonRawJson()); + co.setLocationRawJson(location.getLocationRawJson()); + return co; + } + + private BiPersonPositionUserDO findUser(ThirdPartyPersonLocation location, + Map userMap) { + BiPersonPositionUserDO user = userMap.get(location.getUserId() == null + ? null : String.valueOf(location.getUserId())); + if (user == null) { + user = userMap.get(location.getUsername()); + } + if (user == null) { + user = userMap.get(location.getMobileNo()); + } + if (user == null) { + user = userMap.get(location.getIdCardNo()); + } + return user; + } + + private String firstText(String... values) { + if (values == null) { + return null; + } + for (String value : values) { + if (StringUtils.hasText(value)) { + return value; + } + } + return null; + } + + @Data + private static class ThirdPartyPersonLocation { + private Long userId; + private String username; + private String personName; + private String staffNo; + private String mobileNo; + private String idCardNo; + private String terminalNo; + private String locationName; + private Long lastLocationTime; + private BigDecimal lon; + private BigDecimal lat; + private String personRawJson; + private String locationRawJson; + } +} diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/PersonnelPositioningBiQueryExe.java b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/PersonnelPositioningBiQueryExe.java index 328a971..ac8e7e6 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/PersonnelPositioningBiQueryExe.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/command/query/PersonnelPositioningBiQueryExe.java @@ -9,21 +9,26 @@ import com.jjb.saas.framework.auth.model.SSOUser; import com.jjb.saas.framework.auth.utils.AuthContext; import com.zcloud.personnel.positioning.dto.BiAreaFenceQry; import com.zcloud.personnel.positioning.dto.BiCompanyFenceQry; +import com.zcloud.personnel.positioning.dto.BiCompanyOnlinePersonQry; import com.zcloud.personnel.positioning.dto.BiPersonLocationQry; +import com.zcloud.personnel.positioning.dto.BiPersonPositionQry; import com.zcloud.personnel.positioning.dto.BiPersonTraceQry; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonTraceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPortStatCO; import com.zcloud.personnel.positioning.integration.finds.FindsOpenApiClient; +import com.zcloud.personnel.positioning.persistence.dataobject.AreaDO; +import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; import com.zcloud.personnel.positioning.persistence.dataobject.FenceDO; -import com.zcloud.personnel.positioning.persistence.dataobject.BiAreaSnapshotDO; -import com.zcloud.personnel.positioning.persistence.dataobject.BiCompanyAlarmCountDO; -import com.zcloud.personnel.positioning.persistence.dataobject.BiCorpInfoDO; +import com.zcloud.personnel.positioning.persistence.repository.AreaRepository; import com.zcloud.personnel.positioning.persistence.repository.FenceRepository; -import com.zcloud.personnel.positioning.persistence.repository.PersonnelPositioningBiRepository; +import com.zcloud.personnel.positioning.persistence.repository.UserRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -64,8 +69,11 @@ public class PersonnelPositioningBiQueryExe { private final FindsOpenApiClient findsOpenApiClient; private final ObjectMapper objectMapper; - private final PersonnelPositioningBiRepository biRepository; + private final JdbcTemplate jdbcTemplate; + private final AreaRepository areaRepository; private final FenceRepository fenceRepository; + private final UserRepository userRepository; + private final BiPersonLocationProvider biPersonLocationProvider; private final BiOverviewCache biOverviewCache; private final PositionPersonLocalLookupService localLookupService; @@ -230,6 +238,200 @@ public class PersonnelPositioningBiQueryExe { return PageResponse.of(rows.subList(fromIndex, toIndex), rows.size(), pageSize, pageNo); } + public List listPersonPosition(BiPersonPositionQry qry) { + if (qry == null || qry.getCorpinfoId() == null) { + throw new BizException("企业id不能为空"); + } + String corpinfoId = String.valueOf(qry.getCorpinfoId()); + List areas = loadBiPersonPositionAreas(corpinfoId); + Map locationMap = loadBiPersonPositionLocationMap(corpinfoId); + List result = new ArrayList<>(); + for (BiPersonPositionUserDO user : userRepository.listBiPersonPositionUsers(corpinfoId)) { + BiCompanyOnlinePersonCO location = findBiPersonPositionLocation(user, locationMap); + result.add(buildBiPersonPositionRow(user, location, areas)); + } + return result; + } + + private List loadBiPersonPositionAreas(String corpinfoId) { + List rows = areaRepository.listBiPersonPositionAreas(corpinfoId); + List result = new ArrayList<>(); + for (AreaDO row : rows) { + result.add(new BiPersonPositionArea(row, parseBiPersonPositionPolygon(row.getPolygonJson()))); + } + return result; + } + + private Map loadBiPersonPositionLocationMap(String corpinfoId) { + List locations = + biPersonLocationProvider.listCompanyOnlinePersons(corpinfoId, null, null); + Map result = new LinkedHashMap<>(); + for (BiCompanyOnlinePersonCO location : locations) { + putBiPersonPositionLocation(result, location.getUserId() == null ? null : String.valueOf(location.getUserId()), location); + putBiPersonPositionLocation(result, location.getStaffNo(), location); + putBiPersonPositionLocation(result, location.getMobileNo(), location); + } + return result; + } + + private void putBiPersonPositionLocation(Map locationMap, + String key, + BiCompanyOnlinePersonCO location) { + if (StringUtils.hasText(key)) { + locationMap.putIfAbsent(key.trim(), location); + } + } + + private BiCompanyOnlinePersonCO findBiPersonPositionLocation(BiPersonPositionUserDO user, + Map locationMap) { + if (user == null || locationMap == null || locationMap.isEmpty()) { + return null; + } + BiCompanyOnlinePersonCO location = locationMap.get(String.valueOf(user.getUserId())); + if (location == null) { + location = locationMap.get(user.getUsername()); + } + if (location == null) { + location = locationMap.get(user.getMobileNo()); + } + if (location == null) { + location = locationMap.get(user.getIdCardNo()); + } + return location; + } + + private BiPersonPositionCO buildBiPersonPositionRow(BiPersonPositionUserDO user, + BiCompanyOnlinePersonCO location, + List areas) { + BiPersonPositionCO co = new BiPersonPositionCO(); + co.setUserId(user.getUserId()); + co.setPersonName(user.getPersonName()); + co.setCorpinfoId(user.getCorpinfoId()); + co.setCorpinfoName(user.getCorpinfoName()); + if (location == null) { + co.setOnlineStatus("OFFLINE"); + co.setOnlineStatusName("离线"); + return co; + } + co.setOnlineStatus("ONLINE"); + co.setOnlineStatusName("在线"); + co.setLon(location.getLon()); + co.setLat(location.getLat()); + co.setLastLocationTime(location.getLastLocationTime()); + fillBiPersonPositionArea(co, location, areas); + return co; + } + + private void fillBiPersonPositionArea(BiPersonPositionCO co, + BiCompanyOnlinePersonCO location, + List areas) { + if (location == null || location.getLon() == null || location.getLat() == null) { + return; + } + for (BiPersonPositionArea area : areas) { + if (isBiPersonPositionInArea(location.getLon(), location.getLat(), area.points)) { + co.setAreaId(area.area.getId()); + co.setAreaName(area.area.getAreaName()); + return; + } + } + } + + private List parseBiPersonPositionPolygon(String polygonJson) { + List points = new ArrayList<>(); + if (!StringUtils.hasText(polygonJson)) { + return points; + } + try { + collectBiPersonPositionPoints(objectMapper.readTree(polygonJson), points); + } catch (IOException e) { + throw new BizException("区域边界坐标JSON格式错误"); + } + return points; + } + + private void collectBiPersonPositionPoints(JsonNode node, List points) { + if (node == null || node.isNull() || node.isMissingNode()) { + return; + } + if (node.isObject()) { + node.elements().forEachRemaining(child -> collectBiPersonPositionPoints(child, points)); + return; + } + if (!node.isArray()) { + return; + } + if (node.size() >= 2 && node.get(0).isNumber() && node.get(1).isNumber()) { + points.add(new BigDecimal[]{node.get(0).decimalValue(), node.get(1).decimalValue()}); + return; + } + for (JsonNode child : node) { + collectBiPersonPositionPoints(child, points); + } + } + + private boolean isBiPersonPositionInArea(BigDecimal lon, BigDecimal lat, List points) { + if (lon == null || lat == null || points == null || points.size() < 3) { + return false; + } + boolean inside = false; + double x = lon.doubleValue(); + double y = lat.doubleValue(); + for (int i = 0, j = points.size() - 1; i < points.size(); j = i++) { + double xi = points.get(i)[0].doubleValue(); + double yi = points.get(i)[1].doubleValue(); + double xj = points.get(j)[0].doubleValue(); + double yj = points.get(j)[1].doubleValue(); + if ((yi > y) != (yj > y) + && x < (xj - xi) * (y - yi) / (yj - yi) + xi) { + inside = !inside; + } + } + return inside; + } + + public BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry) { + BiCompanyOnlinePersonQry query = qry == null ? new BiCompanyOnlinePersonQry() : qry; + validatePortArea(query.getPortArea()); + List corpInfos = queryCompanyOnlineCorpInfos(query); + List personList = new ArrayList<>(); + for (CorpInfoView corpInfo : corpInfos) { + personList.addAll(biPersonLocationProvider.listCompanyOnlinePersons( + corpInfo.corpinfoId, corpInfo.corpName, corpInfo.code)); + } + personList.sort((left, right) -> { + long leftTime = left.getLastLocationTime() == null ? 0L : left.getLastLocationTime(); + long rightTime = right.getLastLocationTime() == null ? 0L : right.getLastLocationTime(); + return Long.compare(rightTime, leftTime); + }); + BiCompanyOnlinePersonStatCO co = new BiCompanyOnlinePersonStatCO(); + co.setPersonList(personList); + co.setOnlineCount(personList.size()); + int internalCount = 0; + for (BiCompanyOnlinePersonCO person : personList) { + if (Boolean.TRUE.equals(person.getInternalEmployee())) { + internalCount++; + } + } + co.setInternalCount(internalCount); + co.setTemporaryCount(personList.size() - internalCount); + return co; + } + + private List queryCompanyOnlineCorpInfos(BiCompanyOnlinePersonQry qry) { + if (qry.getCorpinfoId() != null) { + CorpInfoView corpInfo = queryCorpInfoById(String.valueOf(qry.getCorpinfoId())); + if (corpInfo == null) { + throw new BizException("未找到对应企业信息"); + } + if (qry.getPortArea() != null && !qry.getPortArea().equals(corpInfo.portArea)) { + return Collections.emptyList(); + } + return Collections.singletonList(corpInfo); + } + return listCorpInfos(qry.getPortArea()); + } + private List loadMatchedPersonLocations(BiPersonLocationQry query) { List staffRows = loadAllStaffSnapshots(); Set phones = new LinkedHashSet<>(); @@ -1204,7 +1406,8 @@ public class PersonnelPositioningBiQueryExe { if (corpinfoId == null) { return null; } - return mapCorpInfo(biRepository.findCorpById(corpinfoId)); + return queryFirstCorpInfo(CORP_INFO_SELECT + + " AND CAST(id AS CHAR) = CAST(? AS CHAR) LIMIT 1", corpinfoId); } private CorpInfoView mapCorpInfo(BiCorpInfoDO row) { @@ -1381,6 +1584,16 @@ public class PersonnelPositioningBiQueryExe { } } + private static class BiPersonPositionArea { + private final AreaDO area; + private final List points; + + private BiPersonPositionArea(AreaDO area, List points) { + this.area = area; + this.points = points; + } + } + private static class StaffSnapshot { private JsonNode rawNode; private String staffName; diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/service/AlarmRecordServiceImpl.java b/web-app/src/main/java/com/zcloud/personnel/positioning/service/AlarmRecordServiceImpl.java index 109e75f..901eed8 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/service/AlarmRecordServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/service/AlarmRecordServiceImpl.java @@ -6,9 +6,12 @@ import com.zcloud.personnel.positioning.command.AlarmRecordRemoveExe; import com.zcloud.personnel.positioning.command.AlarmRecordUpdateExe; import com.zcloud.personnel.positioning.command.query.AlarmRecordQueryExe; import com.zcloud.personnel.positioning.dto.AlarmRecordAddCmd; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiAlarmTypeQry; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiQry; import com.zcloud.personnel.positioning.dto.AlarmRecordPageQry; import com.zcloud.personnel.positioning.dto.AlarmRecordUpdateCmd; import com.zcloud.personnel.positioning.dto.clientobject.AlarmRecordCO; +import com.zcloud.personnel.positioning.dto.clientobject.AlarmTypeStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.SingleResponse; @@ -36,6 +39,16 @@ public class AlarmRecordServiceImpl implements AlarmRecordServiceI { return alarmRecordQueryExe.execute(qry); } + @Override + public List listBiAlarm(AlarmRecordBiQry qry) { + return alarmRecordQueryExe.listBiAlarm(qry); + } + + @Override + public List listBiAlarmType(AlarmRecordBiAlarmTypeQry qry) { + return alarmRecordQueryExe.listBiAlarmType(qry); + } + @Override public List listAll() { return alarmRecordQueryExe.listAll(); diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/service/AreaServiceImpl.java b/web-app/src/main/java/com/zcloud/personnel/positioning/service/AreaServiceImpl.java index 0dfe2a3..76fd320 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/service/AreaServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/service/AreaServiceImpl.java @@ -9,6 +9,7 @@ import com.zcloud.personnel.positioning.dto.AreaAddCmd; import com.zcloud.personnel.positioning.dto.AreaPageQry; import com.zcloud.personnel.positioning.dto.AreaUpdateCmd; import com.zcloud.personnel.positioning.dto.clientobject.AreaCO; +import com.zcloud.personnel.positioning.dto.clientobject.AreaPersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.SingleResponse; @@ -46,6 +47,11 @@ public class AreaServiceImpl implements AreaServiceI { return areaQueryExe.listOptions(corpinfoId, keyword); } + @Override + public List listPersonStat(Long corpinfoId) { + return areaQueryExe.listPersonStat(corpinfoId); + } + @Override public AreaCO queryById(Long id) { return areaQueryExe.queryById(id); diff --git a/web-app/src/main/java/com/zcloud/personnel/positioning/service/PersonnelPositioningBiServiceImpl.java b/web-app/src/main/java/com/zcloud/personnel/positioning/service/PersonnelPositioningBiServiceImpl.java index 56f6bba..5eff937 100644 --- a/web-app/src/main/java/com/zcloud/personnel/positioning/service/PersonnelPositioningBiServiceImpl.java +++ b/web-app/src/main/java/com/zcloud/personnel/positioning/service/PersonnelPositioningBiServiceImpl.java @@ -4,13 +4,17 @@ import com.alibaba.cola.dto.PageResponse; import com.zcloud.personnel.positioning.api.PersonnelPositioningBiServiceI; import com.zcloud.personnel.positioning.command.query.PersonnelPositioningBiQueryExe; import com.zcloud.personnel.positioning.dto.BiAreaFenceQry; +import com.zcloud.personnel.positioning.dto.BiCompanyOnlinePersonQry; import com.zcloud.personnel.positioning.dto.BiCompanyFenceQry; import com.zcloud.personnel.positioning.dto.BiPersonLocationQry; +import com.zcloud.personnel.positioning.dto.BiPersonPositionQry; import com.zcloud.personnel.positioning.dto.BiPersonTraceQry; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonTraceCO; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -48,6 +52,16 @@ public class PersonnelPositioningBiServiceImpl implements PersonnelPositioningBi return personnelPositioningBiQueryExe.listPersonLocation(qry); } + @Override + public List listPersonPosition(BiPersonPositionQry qry) { + return personnelPositioningBiQueryExe.listPersonPosition(qry); + } + + @Override + public BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry) { + return personnelPositioningBiQueryExe.queryCompanyOnlinePersonStat(qry); + } + @Override public BiPersonTraceCO queryPersonTrace(BiPersonTraceQry qry) { return personnelPositioningBiQueryExe.queryPersonTrace(qry); diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/api/AlarmRecordServiceI.java b/web-client/src/main/java/com/zcloud/personnel/positioning/api/AlarmRecordServiceI.java index 9fc242b..ea7cee8 100644 --- a/web-client/src/main/java/com/zcloud/personnel/positioning/api/AlarmRecordServiceI.java +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/api/AlarmRecordServiceI.java @@ -1,9 +1,12 @@ package com.zcloud.personnel.positioning.api; import com.zcloud.personnel.positioning.dto.AlarmRecordAddCmd; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiAlarmTypeQry; +import com.zcloud.personnel.positioning.dto.AlarmRecordBiQry; import com.zcloud.personnel.positioning.dto.AlarmRecordPageQry; import com.zcloud.personnel.positioning.dto.AlarmRecordUpdateCmd; import com.zcloud.personnel.positioning.dto.clientobject.AlarmRecordCO; +import com.zcloud.personnel.positioning.dto.clientobject.AlarmTypeStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.SingleResponse; @@ -19,6 +22,10 @@ import java.util.List; public interface AlarmRecordServiceI { PageResponse listPage(AlarmRecordPageQry qry); + List listBiAlarm(AlarmRecordBiQry qry); + + List listBiAlarmType(AlarmRecordBiAlarmTypeQry qry); + List listAll(); AlarmRecordCO queryById(Long id); diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/api/AreaServiceI.java b/web-client/src/main/java/com/zcloud/personnel/positioning/api/AreaServiceI.java index 3e16de7..c050427 100644 --- a/web-client/src/main/java/com/zcloud/personnel/positioning/api/AreaServiceI.java +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/api/AreaServiceI.java @@ -4,6 +4,7 @@ import com.zcloud.personnel.positioning.dto.AreaAddCmd; import com.zcloud.personnel.positioning.dto.AreaPageQry; import com.zcloud.personnel.positioning.dto.AreaUpdateCmd; import com.zcloud.personnel.positioning.dto.clientobject.AreaCO; +import com.zcloud.personnel.positioning.dto.clientobject.AreaPersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.OptionCO; import com.alibaba.cola.dto.PageResponse; import com.alibaba.cola.dto.SingleResponse; @@ -23,6 +24,8 @@ public interface AreaServiceI { List listOptions(String corpinfoId, String keyword); + List listPersonStat(Long corpinfoId); + AreaCO queryById(Long id); SingleResponse add(AreaAddCmd cmd); diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/api/PersonnelPositioningBiServiceI.java b/web-client/src/main/java/com/zcloud/personnel/positioning/api/PersonnelPositioningBiServiceI.java index 0c76b7a..e641a30 100644 --- a/web-client/src/main/java/com/zcloud/personnel/positioning/api/PersonnelPositioningBiServiceI.java +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/api/PersonnelPositioningBiServiceI.java @@ -2,13 +2,17 @@ package com.zcloud.personnel.positioning.api; import com.alibaba.cola.dto.PageResponse; import com.zcloud.personnel.positioning.dto.BiAreaFenceQry; +import com.zcloud.personnel.positioning.dto.BiCompanyOnlinePersonQry; import com.zcloud.personnel.positioning.dto.BiCompanyFenceQry; import com.zcloud.personnel.positioning.dto.BiPersonLocationQry; +import com.zcloud.personnel.positioning.dto.BiPersonPositionQry; import com.zcloud.personnel.positioning.dto.BiPersonTraceQry; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; +import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonTraceCO; import java.util.List; @@ -28,6 +32,10 @@ public interface PersonnelPositioningBiServiceI { PageResponse listPersonLocation(BiPersonLocationQry qry); + List listPersonPosition(BiPersonPositionQry qry); + + BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry); + BiPersonTraceCO queryPersonTrace(BiPersonTraceQry qry); PageResponse listAreaFence(BiAreaFenceQry qry); diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiAlarmTypeQry.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiAlarmTypeQry.java new file mode 100644 index 0000000..b229811 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiAlarmTypeQry.java @@ -0,0 +1,16 @@ +package com.zcloud.personnel.positioning.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 可视化大屏报警类型查询参数 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class AlarmRecordBiAlarmTypeQry { + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private Long corpinfoId; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiQry.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiQry.java new file mode 100644 index 0000000..a45f29b --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/AlarmRecordBiQry.java @@ -0,0 +1,19 @@ +package com.zcloud.personnel.positioning.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 可视化大屏报警列表查询参数 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class AlarmRecordBiQry { + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private Long corpinfoId; + + @ApiModelProperty(value = "港区,1:秦皇岛港区,2:秦皇岛东,3:秦皇岛西", name = "portArea") + private Integer portArea; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiCompanyOnlinePersonQry.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiCompanyOnlinePersonQry.java new file mode 100644 index 0000000..42c818e --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiCompanyOnlinePersonQry.java @@ -0,0 +1,19 @@ +package com.zcloud.personnel.positioning.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * BI企业在线人员查询参数 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class BiCompanyOnlinePersonQry { + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private Long corpinfoId; + + @ApiModelProperty(value = "港区,1:秦皇岛港区,2:秦皇岛东,3:秦皇岛西", name = "portArea") + private Integer portArea; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiPersonPositionQry.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiPersonPositionQry.java new file mode 100644 index 0000000..4899f8b --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/BiPersonPositionQry.java @@ -0,0 +1,16 @@ +package com.zcloud.personnel.positioning.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 可视化大屏人员定位查询参数。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class BiPersonPositionQry { + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private Long corpinfoId; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AlarmTypeStatCO.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AlarmTypeStatCO.java new file mode 100644 index 0000000..eb16852 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AlarmTypeStatCO.java @@ -0,0 +1,23 @@ +package com.zcloud.personnel.positioning.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 可视化大屏报警类型统计 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class AlarmTypeStatCO extends ClientObject { + @ApiModelProperty(value = "报警类型编码", name = "alarmCode") + private String alarmCode; + + @ApiModelProperty(value = "报警类型名称", name = "alarmName") + private String alarmName; + + @ApiModelProperty(value = "报警数量", name = "alarmCount") + private Long alarmCount; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AreaPersonStatCO.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AreaPersonStatCO.java new file mode 100644 index 0000000..ed43ff2 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/AreaPersonStatCO.java @@ -0,0 +1,52 @@ +package com.zcloud.personnel.positioning.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 区域人员统计。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class AreaPersonStatCO extends ClientObject { + @ApiModelProperty(value = "区域ID", name = "areaId") + private Long areaId; + + @ApiModelProperty(value = "区域编码", name = "areaCode") + private String areaCode; + + @ApiModelProperty(value = "区域名称", name = "areaName") + private String areaName; + + @ApiModelProperty(value = "区域类型", name = "areaType") + private String areaType; + + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private String corpinfoId; + + @ApiModelProperty(value = "企业名称", name = "corpinfoName") + private String corpinfoName; + + @ApiModelProperty(value = "中心点经度", name = "centerLon") + private BigDecimal centerLon; + + @ApiModelProperty(value = "中心点纬度", name = "centerLat") + private BigDecimal centerLat; + + @ApiModelProperty(value = "区域边界坐标JSON", name = "polygonJson") + private String polygonJson; + + @ApiModelProperty(value = "单位人数", name = "unitCount") + private Integer unitCount; + + @ApiModelProperty(value = "相关方人员数量", name = "relatedCount") + private Integer relatedCount; + + @ApiModelProperty(value = "区域内总人数", name = "totalCount") + private Integer totalCount; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonCO.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonCO.java new file mode 100644 index 0000000..0d2cebb --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonCO.java @@ -0,0 +1,61 @@ +package com.zcloud.personnel.positioning.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * BI企业在线人员 + * + * @Author + * @Date 2026-07-27 + */ +@Data +public class BiCompanyOnlinePersonCO extends ClientObject { + @ApiModelProperty(value = "本平台用户ID,内部员工时返回", name = "userId") + private Long userId; + + @ApiModelProperty(value = "人员姓名", name = "staffName") + private String staffName; + + @ApiModelProperty(value = "三方人员编号", name = "staffNo") + private String staffNo; + + @ApiModelProperty(value = "手机号", name = "mobileNo") + private String mobileNo; + + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private String corpinfoId; + + @ApiModelProperty(value = "企业名称", name = "corpinfoName") + private String corpinfoName; + + @ApiModelProperty(value = "是否内部员工", name = "internalEmployee") + private Boolean internalEmployee; + + @ApiModelProperty(value = "人员类型 INTERNAL内部 TEMP临时", name = "personType") + private String personType; + + @ApiModelProperty(value = "终端号", name = "terminalNo") + private String terminalNo; + + @ApiModelProperty(value = "当前位置", name = "currentLocation") + private String currentLocation; + + @ApiModelProperty(value = "最后定位时间", name = "lastLocationTime") + private Long lastLocationTime; + + @ApiModelProperty(value = "经度", name = "lon") + private BigDecimal lon; + + @ApiModelProperty(value = "纬度", name = "lat") + private BigDecimal lat; + + @ApiModelProperty(value = "人员原始JSON", name = "staffRawJson") + private String staffRawJson; + + @ApiModelProperty(value = "定位原始JSON", name = "locationRawJson") + private String locationRawJson; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonStatCO.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonStatCO.java new file mode 100644 index 0000000..7a79aa6 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiCompanyOnlinePersonStatCO.java @@ -0,0 +1,28 @@ +package com.zcloud.personnel.positioning.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * BI企业在线人员统计 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class BiCompanyOnlinePersonStatCO extends ClientObject { + @ApiModelProperty(value = "在线员工数量", name = "onlineCount") + private Integer onlineCount; + + @ApiModelProperty(value = "内部人员数量", name = "internalCount") + private Integer internalCount; + + @ApiModelProperty(value = "临时人员数量", name = "temporaryCount") + private Integer temporaryCount; + + @ApiModelProperty(value = "在线人员列表", name = "personList") + private List personList; +} diff --git a/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiPersonPositionCO.java b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiPersonPositionCO.java new file mode 100644 index 0000000..bfce225 --- /dev/null +++ b/web-client/src/main/java/com/zcloud/personnel/positioning/dto/clientobject/BiPersonPositionCO.java @@ -0,0 +1,49 @@ +package com.zcloud.personnel.positioning.dto.clientobject; + +import com.alibaba.cola.dto.ClientObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 可视化大屏人员定位。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class BiPersonPositionCO extends ClientObject { + @ApiModelProperty(value = "用户ID", name = "userId") + private Long userId; + + @ApiModelProperty(value = "人员姓名", name = "personName") + private String personName; + + @ApiModelProperty(value = "所属区域", name = "areaName") + private String areaName; + + @ApiModelProperty(value = "在线状态 ONLINE在线 OFFLINE离线", name = "onlineStatus") + private String onlineStatus; + + @ApiModelProperty(value = "在线状态名称", name = "onlineStatusName") + private String onlineStatusName; + + @ApiModelProperty(value = "企业id", name = "corpinfoId") + private String corpinfoId; + + @ApiModelProperty(value = "企业名称", name = "corpinfoName") + private String corpinfoName; + + @ApiModelProperty(value = "区域ID", name = "areaId") + private Long areaId; + + @ApiModelProperty(value = "经度", name = "lon") + private BigDecimal lon; + + @ApiModelProperty(value = "纬度", name = "lat") + private BigDecimal lat; + + @ApiModelProperty(value = "最后定位时间", name = "lastLocationTime") + private Long lastLocationTime; +} diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/AlarmTypeStatDO.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/AlarmTypeStatDO.java new file mode 100644 index 0000000..790c4fc --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/AlarmTypeStatDO.java @@ -0,0 +1,18 @@ +package com.zcloud.personnel.positioning.persistence.dataobject; + +import lombok.Data; + +/** + * 可视化大屏报警类型统计 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class AlarmTypeStatDO { + private String alarmCode; + + private String alarmName; + + private Long alarmCount; +} diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiPersonPositionUserDO.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiPersonPositionUserDO.java new file mode 100644 index 0000000..e622b58 --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiPersonPositionUserDO.java @@ -0,0 +1,20 @@ +package com.zcloud.personnel.positioning.persistence.dataobject; + +import lombok.Data; + +/** + * 可视化大屏人员定位用户数据。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Data +public class BiPersonPositionUserDO { + private Long userId; + private String username; + private String personName; + private String mobileNo; + private String idCardNo; + private String corpinfoId; + private String corpinfoName; +} diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AlarmRecordMapper.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AlarmRecordMapper.java index 6a5a48e..1178596 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AlarmRecordMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AlarmRecordMapper.java @@ -1,5 +1,6 @@ package com.zcloud.personnel.positioning.persistence.mapper; +import com.zcloud.personnel.positioning.persistence.dataobject.AlarmTypeStatDO; import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO; import com.zcloud.personnel.positioning.persistence.dataobject.CompanyOptionDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -7,7 +8,6 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; -import java.util.Map; /** * web-infrastructure @@ -17,7 +17,8 @@ import java.util.Map; */ @Mapper public interface AlarmRecordMapper extends BaseMapper { - List listCompanyOptions(@Param("params") Map params); + List selectBiAlarmList(@Param("corpinfoId") String corpinfoId, + @Param("portArea") Integer portArea); - String findCorpinfoName(@Param("corpinfoId") String corpinfoId); + List selectBiAlarmTypeList(@Param("corpinfoId") String corpinfoId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AreaMapper.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AreaMapper.java index f9483d5..d6b7ece 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AreaMapper.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/AreaMapper.java @@ -3,6 +3,9 @@ package com.zcloud.personnel.positioning.persistence.mapper; import com.zcloud.personnel.positioning.persistence.dataobject.AreaDO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * web-infrastructure @@ -12,4 +15,5 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface AreaMapper extends BaseMapper { + List selectBiPersonPositionAreas(@Param("corpinfoId") String corpinfoId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/UserMapper.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/UserMapper.java new file mode 100644 index 0000000..01b3803 --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.zcloud.personnel.positioning.persistence.mapper; + +import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户查询。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Mapper +public interface UserMapper { + List selectBiPersonPositionUsers(@Param("corpinfoId") String corpinfoId); +} diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AlarmRecordRepository.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AlarmRecordRepository.java index 92f2b6e..f4c40fe 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AlarmRecordRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AlarmRecordRepository.java @@ -1,5 +1,6 @@ package com.zcloud.personnel.positioning.persistence.repository; +import com.zcloud.personnel.positioning.persistence.dataobject.AlarmTypeStatDO; import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO; import com.zcloud.personnel.positioning.persistence.dataobject.CompanyOptionDO; import com.alibaba.cola.dto.PageResponse; @@ -17,7 +18,7 @@ import java.util.Map; public interface AlarmRecordRepository extends BaseRepository { PageResponse listPage(Map params); - List listCompanyOptions(Map params); + List listBiAlarm(String corpinfoId, Integer portArea); - String findCorpinfoName(String corpinfoId); + List listBiAlarmType(String corpinfoId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AreaRepository.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AreaRepository.java index 064139c..1d11bee 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AreaRepository.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/AreaRepository.java @@ -4,6 +4,7 @@ import com.zcloud.personnel.positioning.persistence.dataobject.AreaDO; import com.alibaba.cola.dto.PageResponse; import com.jjb.saas.framework.repository.repo.BaseRepository; +import java.util.List; import java.util.Map; /** @@ -14,4 +15,6 @@ import java.util.Map; */ public interface AreaRepository extends BaseRepository { PageResponse listPage(Map params); + + List listBiPersonPositionAreas(String corpinfoId); } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/UserRepository.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/UserRepository.java new file mode 100644 index 0000000..c031324 --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/UserRepository.java @@ -0,0 +1,15 @@ +package com.zcloud.personnel.positioning.persistence.repository; + +import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; + +import java.util.List; + +/** + * 用户仓储。 + * + * @Author Codex + * @Date 2026-07-27 + */ +public interface UserRepository { + List listBiPersonPositionUsers(String corpinfoId); +} diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AlarmRecordRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AlarmRecordRepositoryImpl.java index d39bb25..40a1f24 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AlarmRecordRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AlarmRecordRepositoryImpl.java @@ -1,5 +1,6 @@ package com.zcloud.personnel.positioning.persistence.repository.impl; +import com.zcloud.personnel.positioning.persistence.dataobject.AlarmTypeStatDO; import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO; import com.zcloud.personnel.positioning.persistence.dataobject.CompanyOptionDO; import com.zcloud.personnel.positioning.persistence.mapper.AlarmRecordMapper; @@ -39,12 +40,12 @@ public class AlarmRecordRepositoryImpl extends BaseRepositoryImpl listCompanyOptions(Map params) { - return alarmRecordMapper.listCompanyOptions(params); + public List listBiAlarm(String corpinfoId, Integer portArea) { + return alarmRecordMapper.selectBiAlarmList(corpinfoId, portArea); } @Override - public String findCorpinfoName(String corpinfoId) { - return alarmRecordMapper.findCorpinfoName(corpinfoId); + public List listBiAlarmType(String corpinfoId) { + return alarmRecordMapper.selectBiAlarmTypeList(corpinfoId); } } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AreaRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AreaRepositoryImpl.java index 5c8583e..7573764 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AreaRepositoryImpl.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/AreaRepositoryImpl.java @@ -14,6 +14,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Map; +import java.util.List; /** * web-infrastructure @@ -35,4 +36,9 @@ public class AreaRepositoryImpl extends BaseRepositoryImpl i IPage result = areaMapper.selectPage(iPage, queryWrapper); return PageHelper.pageToResponse(result, result.getRecords()); } + + @Override + public List listBiPersonPositionAreas(String corpinfoId) { + return areaMapper.selectBiPersonPositionAreas(corpinfoId); + } } diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/UserRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/UserRepositoryImpl.java new file mode 100644 index 0000000..7af6e42 --- /dev/null +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/repository/impl/UserRepositoryImpl.java @@ -0,0 +1,26 @@ +package com.zcloud.personnel.positioning.persistence.repository.impl; + +import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; +import com.zcloud.personnel.positioning.persistence.mapper.UserMapper; +import com.zcloud.personnel.positioning.persistence.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户仓储实现。 + * + * @Author Codex + * @Date 2026-07-27 + */ +@Service +@RequiredArgsConstructor +public class UserRepositoryImpl implements UserRepository { + private final UserMapper userMapper; + + @Override + public List listBiPersonPositionUsers(String corpinfoId) { + return userMapper.selectBiPersonPositionUsers(corpinfoId); + } +} diff --git a/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml b/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml index ada983c..722b22f 100644 --- a/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/AlarmRecordMapper.xml @@ -3,23 +3,78 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + SELECT + ar.id, + ar.alarm_no, + ar.finds_alarm_id, + ar.alarm_code, + ar.alarm_name, + ar.level, + ar.description, + ar.dispose_status, + ar.dispose_description, + ar.duration, + ar.start_time, + ar.end_time, + ar.start_fences_json, + ar.end_fences_json, + ar.lon, + ar.lat, + ar.alt, + ar.speed, + ar.direction, + ar.gt, + CAST(ci.id AS CHAR) AS corpinfo_id, + ci.corp_name AS corpinfo_name, + ar.first_id_card_no, + ar.first_staff_no_snapshot, + ar.first_staff_name_snapshot, + ar.terminal_no_list_json, + ar.sync_time, + ar.raw_json, + ar.delete_enum, + ar.remarks, + ar.create_name, + ar.update_name, + ar.tenant_id, + ar.org_id, + ar.env, + ar.version, + ar.create_time, + ar.update_time, + ar.create_id, + ar.update_id + FROM alarm_record ar + INNER JOIN corp_info ci + ON CAST(ci.id AS CHAR) = CAST(ar.corpinfo_id AS CHAR) + WHERE (ar.delete_enum IS NULL OR ar.delete_enum = 'FALSE') + AND (ci.delete_enum IS NULL OR ci.delete_enum = 'FALSE') + + AND CAST(ci.id AS CHAR) = CAST(#{corpinfoId} AS CHAR) - ORDER BY corp_name ASC - LIMIT 200 + + AND ci.port_area = #{portArea} + + ORDER BY COALESCE(ar.start_time, ar.create_time) DESC, ar.id DESC - + SELECT + ar.alarm_code AS alarmCode, + MAX(ar.alarm_name) AS alarmName, + COUNT(1) AS alarmCount + FROM alarm_record ar + INNER JOIN corp_info ci + ON CAST(ci.id AS CHAR) = CAST(ar.corpinfo_id AS CHAR) + WHERE (ar.delete_enum IS NULL OR ar.delete_enum = 'FALSE') + AND (ci.delete_enum IS NULL OR ci.delete_enum = 'FALSE') + + AND CAST(ci.id AS CHAR) = CAST(#{corpinfoId} AS CHAR) + + GROUP BY ar.alarm_code + ORDER BY alarmCount DESC, ar.alarm_code ASC diff --git a/web-infrastructure/src/main/resources/mapper/AreaMapper.xml b/web-infrastructure/src/main/resources/mapper/AreaMapper.xml index b71d5c9..f7714fd 100644 --- a/web-infrastructure/src/main/resources/mapper/AreaMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/AreaMapper.xml @@ -3,4 +3,45 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + diff --git a/web-infrastructure/src/main/resources/mapper/UserMapper.xml b/web-infrastructure/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..21e603b --- /dev/null +++ b/web-infrastructure/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,23 @@ + + + + + +