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 1a00bed..9252af8 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 @@ -116,7 +116,7 @@ public class AreaQueryExe { } private void countPerson(List areas, BiCompanyOnlinePersonCO person) { - if (person == null || person.getLon() == null || person.getLat() == null) { + if (!biPersonLocationProvider.isOnline(person) || person.getLon() == null || person.getLat() == null) { return; } for (AreaStatAccumulator area : areas) { 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 index b4db936..c95ca92 100644 --- 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 @@ -1,6 +1,9 @@ package com.zcloud.personnel.positioning.command.query; +import com.alibaba.cola.dto.PageResponse; +import com.zcloud.personnel.positioning.dto.PositionPersonPageQry; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO; +import com.zcloud.personnel.positioning.dto.clientobject.PositionPersonCO; import com.zcloud.personnel.positioning.persistence.dataobject.BiPersonPositionUserDO; import com.zcloud.personnel.positioning.persistence.repository.UserRepository; import lombok.Data; @@ -27,8 +30,12 @@ import java.util.Map; @RequiredArgsConstructor public class BiPersonLocationProvider { private static final Logger LOGGER = LoggerFactory.getLogger(BiPersonLocationProvider.class); + private static final int PAGE_SIZE = 10000; + private static final String STATUS_ONLINE = "ONLINE"; + private static final String STATUS_OFFLINE = "OFFLINE"; private final UserRepository userRepository; + private final PositionPersonQueryExe positionPersonQueryExe; public List listCompanyOnlinePersons(String corpinfoId, String corpinfoName, @@ -51,13 +58,56 @@ public class BiPersonLocationProvider { return result; } + public boolean isOnline(BiCompanyOnlinePersonCO person) { + return person != null && STATUS_ONLINE.equalsIgnoreCase(person.getLocationStatus()); + } + private List loadThirdPartyPersonLocations(String corpinfoId, String corpinfoName, String corpCode) { - LOGGER.info("TODO 待接入第三方人员定位接口,corpinfoId={},corpinfoName={},corpCode={}", + LOGGER.info("开始调用企业人员定位查询,corpinfoId={},corpinfoName={},corpCode={}", corpinfoId, corpinfoName, corpCode); - // TODO 后续只在这里接入第三方接口:根据企业id获取在线人员、经纬度、定位时间、人员唯一标识。 - return Collections.emptyList(); + List result = new ArrayList<>(); + int pageIndex = 1; + int totalCount = Integer.MAX_VALUE; + while (result.size() < totalCount) { + PositionPersonPageQry qry = new PositionPersonPageQry(); + qry.setCorpinfoId(corpinfoId); + qry.setPageIndex(pageIndex); + qry.setPageSize(PAGE_SIZE); + PageResponse page = positionPersonQueryExe.list(qry); + if (page == null || page.getData() == null || page.getData().isEmpty()) { + break; + } + totalCount = page.getTotalCount(); + for (PositionPersonCO row : page.getData()) { + result.add(toThirdPartyPersonLocation(row)); + } + if (page.getData().size() < PAGE_SIZE) { + break; + } + pageIndex++; + } + LOGGER.info("企业人员定位查询完成,corpinfoId={},人员状态数量={}", corpinfoId, result.size()); + return result; + } + + private ThirdPartyPersonLocation toThirdPartyPersonLocation(PositionPersonCO row) { + ThirdPartyPersonLocation location = new ThirdPartyPersonLocation(); + location.setUserId(row.getUserId()); + location.setUsername(row.getLocalStaffNo()); + location.setPersonName(row.getStaffName()); + location.setStaffNo(row.getLocalStaffNo()); + location.setMobileNo(row.getMobileNo()); + location.setIdCardNo(row.getIdCardNo()); + location.setTerminalNo(row.getTerminalNo()); + location.setLocationStatus(normalizeStatus(row.getLocationStatus())); + location.setLocationStatusName(row.getLocationStatusName()); + location.setLocationName(firstText(row.getCurrentLocation(), row.getLastLocationName())); + location.setLastLocationTime(row.getLastLocationTime()); + location.setLon(row.getLon()); + location.setLat(row.getLat()); + return location; } private Map buildUserMap(String corpinfoId) { @@ -95,6 +145,9 @@ public class BiPersonLocationProvider { co.setInternalEmployee(user != null); co.setPersonType(user == null ? "TEMP" : "INTERNAL"); co.setTerminalNo(location.getTerminalNo()); + co.setLocationStatus(location.getLocationStatus()); + co.setLocationStatusName(firstText(location.getLocationStatusName(), + STATUS_ONLINE.equalsIgnoreCase(location.getLocationStatus()) ? "在线" : "离线")); co.setCurrentLocation(location.getLocationName()); co.setLastLocationTime(location.getLastLocationTime()); co.setLon(location.getLon()); @@ -120,6 +173,10 @@ public class BiPersonLocationProvider { return user; } + private String normalizeStatus(String status) { + return STATUS_ONLINE.equalsIgnoreCase(status) ? STATUS_ONLINE : STATUS_OFFLINE; + } + private String firstText(String... values) { if (values == null) { return null; @@ -141,6 +198,8 @@ public class BiPersonLocationProvider { private String mobileNo; private String idCardNo; private String terminalNo; + private String locationStatus; + private String locationStatusName; private String locationName; private Long lastLocationTime; private BigDecimal lon; 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 b74e166..6778b33 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 @@ -255,8 +255,8 @@ public class PersonnelPositioningBiQueryExe { private BiPortPersonVehicleStatCO buildPortPersonVehicleStat(Integer portArea, String portName) { int personCount = 0; for (BiCorpInfoDO corpInfo : biRepository.listPersonPositionCompanies(null, portArea)) { - personCount += biPersonLocationProvider.listCompanyOnlinePersons( - corpInfo.getCorpinfoId(), corpInfo.getCorpName(), corpInfo.getCode()).size(); + personCount += countOnlinePersonsOne(biPersonLocationProvider.listCompanyOnlinePersons( + corpInfo.getCorpinfoId(), corpInfo.getCorpName(), corpInfo.getCode())); } BiPortPersonVehicleStatCO co = new BiPortPersonVehicleStatCO(); co.setPortArea(portArea); @@ -277,7 +277,7 @@ public class PersonnelPositioningBiQueryExe { BiCompanyPersonPositionCO co = new BiCompanyPersonPositionCO(); co.setCorpinfoId(corpInfo.getCorpinfoId()); co.setCorpinfoName(corpInfo.getCorpName()); - co.setPersonCount(personList.size()); + co.setPersonCount(countOnlinePersonsOne(personList)); co.setVehicleCount(0); result.add(co); } @@ -354,7 +354,7 @@ public class PersonnelPositioningBiQueryExe { co.setPersonName(user.getPersonName()); co.setCorpinfoId(user.getCorpinfoId()); co.setCorpinfoName(user.getCorpinfoName()); - if (location == null) { + if (!biPersonLocationProvider.isOnline(location)) { co.setOnlineStatus("OFFLINE"); co.setOnlineStatusName("离线"); return co; @@ -442,8 +442,12 @@ public class PersonnelPositioningBiQueryExe { List corpInfos = queryCompanyOnlineCorpInfos(query); List personList = new ArrayList<>(); for (CorpInfoView corpInfo : corpInfos) { - personList.addAll(biPersonLocationProvider.listCompanyOnlinePersons( - corpInfo.corpinfoId, corpInfo.corpName, corpInfo.code)); + for (BiCompanyOnlinePersonCO person : biPersonLocationProvider.listCompanyOnlinePersons( + corpInfo.corpinfoId, corpInfo.corpName, corpInfo.code)) { + if (biPersonLocationProvider.isOnline(person)) { + personList.add(person); + } + } } personList.sort((left, right) -> { long leftTime = left.getLastLocationTime() == null ? 0L : left.getLastLocationTime(); @@ -464,6 +468,19 @@ public class PersonnelPositioningBiQueryExe { return co; } + private int countOnlinePersonsOne(List personList) { + int count = 0; + if (personList == null) { + return count; + } + for (BiCompanyOnlinePersonCO person : personList) { + if (biPersonLocationProvider.isOnline(person)) { + count++; + } + } + return count; + } + private List queryCompanyOnlineCorpInfos(BiCompanyOnlinePersonQry qry) { if (qry.getCorpinfoId() != null) { CorpInfoView corpInfo = queryCorpInfoById(String.valueOf(qry.getCorpinfoId())); 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 index 0d2cebb..3973c4e 100644 --- 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 @@ -41,6 +41,12 @@ public class BiCompanyOnlinePersonCO extends ClientObject { @ApiModelProperty(value = "终端号", name = "terminalNo") private String terminalNo; + @ApiModelProperty(value = "定位状态 ONLINE在线 OFFLINE离线", name = "locationStatus") + private String locationStatus; + + @ApiModelProperty(value = "定位状态名称", name = "locationStatusName") + private String locationStatusName; + @ApiModelProperty(value = "当前位置", name = "currentLocation") private String currentLocation; diff --git a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiCorpInfoDO.java b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiCorpInfoDO.java index 67e7d11..ce58277 100644 --- a/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiCorpInfoDO.java +++ b/web-infrastructure/src/main/java/com/zcloud/personnel/positioning/persistence/dataobject/BiCorpInfoDO.java @@ -4,6 +4,7 @@ import lombok.Data; @Data public class BiCorpInfoDO { + private String corpinfoId; private String corpName; private String code; diff --git a/web-infrastructure/src/main/resources/mapper/PersonnelPositioningBiMapper.xml b/web-infrastructure/src/main/resources/mapper/PersonnelPositioningBiMapper.xml index 18288e7..8dea44b 100644 --- a/web-infrastructure/src/main/resources/mapper/PersonnelPositioningBiMapper.xml +++ b/web-infrastructure/src/main/resources/mapper/PersonnelPositioningBiMapper.xml @@ -2,7 +2,7 @@ - SELECT corpinfo_id, corp_name, code, address, address_business, address_office, contacts, lr_name, + SELECT id,corpinfo_id, corp_name, code, address, address_business, address_office, contacts, lr_name, corp_type_name, corp_type2_name, corp_type3_name, corp_type4_name, longitude, latitude, port_area FROM corp_info WHERE (delete_enum IS NULL OR delete_enum = 'FALSE') @@ -19,7 +19,7 @@