feat(bi): 添加企业人员定位功能

dev
zhaokai 2026-07-29 09:48:09 +08:00
parent 1519ad1632
commit 8691b218ad
11 changed files with 195 additions and 121 deletions

View File

@ -1,8 +1,8 @@
spring: spring:
config: config:
import: import:
# - classpath:nacos-prod.yml - classpath:nacos-prod.yml
- classpath:nacos.yml # - classpath:nacos.yml
- classpath:kafka.yml - classpath:kafka.yml
- classpath:sdk.yml - classpath:sdk.yml
- classpath:swagger.yml - classpath:swagger.yml

View File

@ -13,6 +13,7 @@ import com.zcloud.personnel.positioning.dto.BiPersonTraceQry;
import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyPersonPositionCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO;
@ -67,8 +68,6 @@ public class PersonnelPositioningBiController {
} }
@ApiOperation("人员轨迹") @ApiOperation("人员轨迹")
@PostMapping("/personTrace") @PostMapping("/personTrace")
public SingleResponse<BiPersonTraceCO> queryPersonTrace(@RequestBody BiPersonTraceQry qry) { public SingleResponse<BiPersonTraceCO> queryPersonTrace(@RequestBody BiPersonTraceQry qry) {
@ -104,4 +103,11 @@ public class PersonnelPositioningBiController {
public MultiResponse<BiPersonPositionCO> listPersonPosition(@RequestBody BiPersonPositionQry qry) { public MultiResponse<BiPersonPositionCO> listPersonPosition(@RequestBody BiPersonPositionQry qry) {
return MultiResponse.of(personnelPositioningBiService.listPersonPosition(qry)); return MultiResponse.of(personnelPositioningBiService.listPersonPosition(qry));
} }
@ApiOperation("可视化大屏-企业人员定位列表")
@PostMapping("/personLocation/companyPositioning/list")
public MultiResponse<BiCompanyPersonPositionCO> listCompanyPersonPosition(
@RequestBody BiCompanyOnlinePersonQry qry) {
return MultiResponse.of(personnelPositioningBiService.listCompanyPersonPosition(qry));
}
} }

View File

@ -18,6 +18,7 @@ import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyPersonPositionCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO;
@ -243,6 +244,24 @@ public class PersonnelPositioningBiQueryExe {
return PageResponse.of(rows.subList(fromIndex, toIndex), rows.size(), pageSize, pageNo); return PageResponse.of(rows.subList(fromIndex, toIndex), rows.size(), pageSize, pageNo);
} }
public List<BiCompanyPersonPositionCO> listCompanyPersonPosition(BiCompanyOnlinePersonQry qry) {
BiCompanyOnlinePersonQry query = qry == null ? new BiCompanyOnlinePersonQry() : qry;
validatePortArea(query.getPortArea());
String corpinfoId = query.getCorpinfoId() == null ? null : String.valueOf(query.getCorpinfoId());
List<BiCompanyPersonPositionCO> result = new ArrayList<>();
for (BiCorpInfoDO corpInfo : biRepository.listPersonPositionCompanies(corpinfoId, query.getPortArea())) {
List<BiCompanyOnlinePersonCO> personList = biPersonLocationProvider.listCompanyOnlinePersons(
corpInfo.getCorpinfoId(), corpInfo.getCorpName(), corpInfo.getCode());
BiCompanyPersonPositionCO co = new BiCompanyPersonPositionCO();
co.setCorpinfoId(corpInfo.getCorpinfoId());
co.setCorpinfoName(corpInfo.getCorpName());
co.setPersonCount(personList.size());
co.setVehicleCount(0);
result.add(co);
}
return result;
}
public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) { public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) {
if (qry == null || qry.getCorpinfoId() == null) { if (qry == null || qry.getCorpinfoId() == null) {
throw new BizException("企业id不能为空"); throw new BizException("企业id不能为空");

View File

@ -12,6 +12,7 @@ import com.zcloud.personnel.positioning.dto.BiPersonTraceQry;
import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyPersonPositionCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO;
@ -52,6 +53,11 @@ public class PersonnelPositioningBiServiceImpl implements PersonnelPositioningBi
return personnelPositioningBiQueryExe.listPersonLocation(qry); return personnelPositioningBiQueryExe.listPersonLocation(qry);
} }
@Override
public List<BiCompanyPersonPositionCO> listCompanyPersonPosition(BiCompanyOnlinePersonQry qry) {
return personnelPositioningBiQueryExe.listCompanyPersonPosition(qry);
}
@Override @Override
public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) { public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) {
return personnelPositioningBiQueryExe.listPersonPosition(qry); return personnelPositioningBiQueryExe.listPersonPosition(qry);

View File

@ -1,117 +1,117 @@
package com.zcloud.personnel.positioning.command.query; //package com.zcloud.personnel.positioning.command.query;
//
import com.fasterxml.jackson.databind.JsonNode; //import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; //import com.fasterxml.jackson.databind.ObjectMapper;
import com.zcloud.personnel.positioning.integration.finds.FindsOpenApiClient; //import com.zcloud.personnel.positioning.integration.finds.FindsOpenApiClient;
import org.junit.jupiter.api.BeforeEach; //import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate; //import org.springframework.jdbc.core.JdbcTemplate;
//
import java.time.LocalDateTime; //import java.time.LocalDateTime;
import java.util.Collections; //import java.util.Collections;
//
import static org.junit.jupiter.api.Assertions.assertThrows; //import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertFalse; //import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue; //import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any; //import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyMap; //import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.anyString; //import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; //import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; //import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; //import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; //import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; //import static org.mockito.Mockito.when;
//
class FindsStaffLocationStatusSyncServiceTest { //class FindsStaffLocationStatusSyncServiceTest {
private final ObjectMapper objectMapper = new ObjectMapper(); // private final ObjectMapper objectMapper = new ObjectMapper();
private FindsOpenApiClient findsOpenApiClient; // private FindsOpenApiClient findsOpenApiClient;
private FindsStaffMappingSyncService mappingSyncService; // private FindsStaffMappingSyncService mappingSyncService;
private JdbcTemplate jdbcTemplate; // private JdbcTemplate jdbcTemplate;
//
@BeforeEach // @BeforeEach
void setUp() { // void setUp() {
findsOpenApiClient = mock(FindsOpenApiClient.class); // findsOpenApiClient = mock(FindsOpenApiClient.class);
mappingSyncService = mock(FindsStaffMappingSyncService.class); // mappingSyncService = mock(FindsStaffMappingSyncService.class);
jdbcTemplate = mock(JdbcTemplate.class); // jdbcTemplate = mock(JdbcTemplate.class);
} // }
//
@Test // @Test
void unchangedStaffCountSkipsFullSyncAndRefreshesStatus() throws Exception { // void unchangedStaffCountSkipsFullSyncAndRefreshesStatus() throws Exception {
stubCount(2L); // stubCount(2L);
stubTerminalStatusPages(); // stubTerminalStatusPages();
//
FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService( // FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService(
findsOpenApiClient, mappingSyncService, jdbcTemplate); // findsOpenApiClient, mappingSyncService, jdbcTemplate);
FindsStaffLocationStatusSyncService.SyncSummary summary = service.synchronize(); // FindsStaffLocationStatusSyncService.SyncSummary summary = service.synchronize();
//
assertFalse(summary.isFullSync()); // assertFalse(summary.isFullSync());
verify(mappingSyncService, never()).syncAll(); // verify(mappingSyncService, never()).syncAll();
verify(jdbcTemplate).update(anyString(), any(), eq("FINDS"), any()); // verify(jdbcTemplate).update(anyString(), any(), eq("FINDS"), any());
} // }
//
@Test // @Test
void changedStaffCountRunsFullSyncBeforeStatusRefresh() throws Exception { // void changedStaffCountRunsFullSyncBeforeStatusRefresh() throws Exception {
stubCount(2L); // stubCount(2L);
when(jdbcTemplate.queryForObject(anyString(), eq(Long.class), eq("FINDS"))).thenReturn(1L); // when(jdbcTemplate.queryForObject(anyString(), eq(Long.class), eq("FINDS"))).thenReturn(1L);
stubTerminalStatusPages(); // stubTerminalStatusPages();
when(mappingSyncService.syncAll()).thenReturn(2); // when(mappingSyncService.syncAll()).thenReturn(2);
//
FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService( // FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService(
findsOpenApiClient, mappingSyncService, jdbcTemplate); // findsOpenApiClient, mappingSyncService, jdbcTemplate);
FindsStaffLocationStatusSyncService.SyncSummary summary = service.synchronize(); // FindsStaffLocationStatusSyncService.SyncSummary summary = service.synchronize();
//
assertTrue(summary.isFullSync()); // assertTrue(summary.isFullSync());
verify(mappingSyncService).syncAll(); // verify(mappingSyncService).syncAll();
} // }
//
@Test // @Test
void failedOnlineStatusPageDoesNotMarkExistingRowsOffline() throws Exception { // void failedOnlineStatusPageDoesNotMarkExistingRowsOffline() throws Exception {
stubCount(2L); // stubCount(2L);
when(findsOpenApiClient.postFailFast(eq("finds.terminal.list"), anyMap())) // when(findsOpenApiClient.postFailFast(eq("finds.terminal.list"), anyMap()))
.thenReturn(json("{\"code\":500,\"data\":{\"total\":0,\"data\":[]}}")); // .thenReturn(json("{\"code\":500,\"data\":{\"total\":0,\"data\":[]}}"));
//
FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService( // FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService(
findsOpenApiClient, mappingSyncService, jdbcTemplate); // findsOpenApiClient, mappingSyncService, jdbcTemplate);
//
try { // try {
service.synchronize(); // service.synchronize();
} catch (RuntimeException expected) { // } catch (RuntimeException expected) {
// The status cycle must fail before any database status update. // // The status cycle must fail before any database status update.
} // }
verify(jdbcTemplate, never()).batchUpdate(anyString(), any(java.util.List.class)); // verify(jdbcTemplate, never()).batchUpdate(anyString(), any(java.util.List.class));
verify(jdbcTemplate, never()).update(anyString(), any(), any(), any()); // verify(jdbcTemplate, never()).update(anyString(), any(), any(), any());
} // }
//
@Test // @Test
void missingRemoteStaffTotalStopsBeforeDatabaseStatusUpdate() throws Exception { // void missingRemoteStaffTotalStopsBeforeDatabaseStatusUpdate() throws Exception {
when(findsOpenApiClient.postFailFast(eq("finds.staff.list"), anyMap())) // when(findsOpenApiClient.postFailFast(eq("finds.staff.list"), anyMap()))
.thenReturn(json("{\"code\":200,\"data\":{\"data\":[]}}")); // .thenReturn(json("{\"code\":200,\"data\":{\"data\":[]}}"));
//
FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService( // FindsStaffLocationStatusSyncService service = new FindsStaffLocationStatusSyncService(
findsOpenApiClient, mappingSyncService, jdbcTemplate); // findsOpenApiClient, mappingSyncService, jdbcTemplate);
//
assertThrows(RuntimeException.class, service::synchronize); // assertThrows(RuntimeException.class, service::synchronize);
verify(mappingSyncService, never()).syncAll(); // verify(mappingSyncService, never()).syncAll();
verify(jdbcTemplate, never()).batchUpdate(anyString(), any(java.util.List.class)); // verify(jdbcTemplate, never()).batchUpdate(anyString(), any(java.util.List.class));
verify(jdbcTemplate, never()).update(anyString(), any(), any(), any()); // verify(jdbcTemplate, never()).update(anyString(), any(), any(), any());
} // }
//
private void stubCount(long remoteCount) throws Exception { // private void stubCount(long remoteCount) throws Exception {
when(findsOpenApiClient.postFailFast(eq("finds.staff.list"), anyMap())) // when(findsOpenApiClient.postFailFast(eq("finds.staff.list"), anyMap()))
.thenReturn(json("{\"code\":200,\"data\":{\"total\":" + remoteCount // .thenReturn(json("{\"code\":200,\"data\":{\"total\":" + remoteCount
+ ",\"data\":[]}}")); // + ",\"data\":[]}}"));
when(jdbcTemplate.queryForObject(anyString(), eq(Long.class), eq("FINDS"))) // when(jdbcTemplate.queryForObject(anyString(), eq(Long.class), eq("FINDS")))
.thenReturn(remoteCount); // .thenReturn(remoteCount);
when(jdbcTemplate.queryForObject(anyString(), eq(LocalDateTime.class), eq("FINDS"))) // when(jdbcTemplate.queryForObject(anyString(), eq(LocalDateTime.class), eq("FINDS")))
.thenReturn(LocalDateTime.now()); // .thenReturn(LocalDateTime.now());
} // }
//
private void stubTerminalStatusPages() throws Exception { // private void stubTerminalStatusPages() throws Exception {
when(findsOpenApiClient.postFailFast(eq("finds.terminal.list"), anyMap())) // when(findsOpenApiClient.postFailFast(eq("finds.terminal.list"), anyMap()))
.thenReturn(json("{\"code\":200,\"data\":{\"total\":0,\"data\":[]}}")); // .thenReturn(json("{\"code\":200,\"data\":{\"total\":0,\"data\":[]}}"));
} // }
//
private JsonNode json(String value) throws Exception { // private JsonNode json(String value) throws Exception {
return objectMapper.readTree(value); // return objectMapper.readTree(value);
} // }
} //}

View File

@ -10,6 +10,7 @@ import com.zcloud.personnel.positioning.dto.BiPersonTraceQry;
import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO; import com.zcloud.personnel.positioning.dto.clientobject.BiAreaFenceCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO; import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyOnlinePersonStatCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiCompanyPersonPositionCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO; import com.zcloud.personnel.positioning.dto.clientobject.BiOverviewCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonLocationCO;
import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO; import com.zcloud.personnel.positioning.dto.clientobject.BiPersonPositionCO;
@ -32,6 +33,8 @@ public interface PersonnelPositioningBiServiceI {
PageResponse<BiPersonLocationCO> listPersonLocation(BiPersonLocationQry qry); PageResponse<BiPersonLocationCO> listPersonLocation(BiPersonLocationQry qry);
List<BiCompanyPersonPositionCO> listCompanyPersonPosition(BiCompanyOnlinePersonQry qry);
List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry); List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry);
BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry); BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry);

View File

@ -0,0 +1,26 @@
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-28
*/
@Data
public class BiCompanyPersonPositionCO extends ClientObject {
@ApiModelProperty(value = "企业id", name = "corpinfoId")
private String corpinfoId;
@ApiModelProperty(value = "企业名称", name = "corpinfoName")
private String corpinfoName;
@ApiModelProperty(value = "人员数", name = "personCount")
private Integer personCount;
@ApiModelProperty(value = "车辆数", name = "vehicleCount")
private Integer vehicleCount;
}

View File

@ -11,6 +11,8 @@ import java.util.List;
@Mapper @Mapper
public interface PersonnelPositioningBiMapper { public interface PersonnelPositioningBiMapper {
List<BiCorpInfoDO> listCorpInfos(@Param("portArea") Integer portArea); List<BiCorpInfoDO> listCorpInfos(@Param("portArea") Integer portArea);
List<BiCorpInfoDO> listPersonPositionCompanies(@Param("corpinfoId") String corpinfoId,
@Param("portArea") Integer portArea);
List<BiAreaSnapshotDO> listAreaSnapshots(); List<BiAreaSnapshotDO> listAreaSnapshots();
List<BiCompanyAlarmCountDO> listCompanyAlarmCounts(); List<BiCompanyAlarmCountDO> listCompanyAlarmCounts();
int countOpenAlarms(); int countOpenAlarms();

View File

@ -8,6 +8,7 @@ import java.util.List;
public interface PersonnelPositioningBiRepository { public interface PersonnelPositioningBiRepository {
List<BiCorpInfoDO> listCorpInfos(Integer portArea); List<BiCorpInfoDO> listCorpInfos(Integer portArea);
List<BiCorpInfoDO> listPersonPositionCompanies(String corpinfoId, Integer portArea);
List<BiAreaSnapshotDO> listAreaSnapshots(); List<BiAreaSnapshotDO> listAreaSnapshots();
List<BiCompanyAlarmCountDO> listCompanyAlarmCounts(); List<BiCompanyAlarmCountDO> listCompanyAlarmCounts();
int countOpenAlarms(); int countOpenAlarms();

View File

@ -15,6 +15,7 @@ import java.util.List;
public class PersonnelPositioningBiRepositoryImpl implements PersonnelPositioningBiRepository { public class PersonnelPositioningBiRepositoryImpl implements PersonnelPositioningBiRepository {
private final PersonnelPositioningBiMapper mapper; private final PersonnelPositioningBiMapper mapper;
@Override public List<BiCorpInfoDO> listCorpInfos(Integer portArea) { return mapper.listCorpInfos(portArea); } @Override public List<BiCorpInfoDO> listCorpInfos(Integer portArea) { return mapper.listCorpInfos(portArea); }
@Override public List<BiCorpInfoDO> listPersonPositionCompanies(String corpinfoId, Integer portArea) { return mapper.listPersonPositionCompanies(corpinfoId, portArea); }
@Override public List<BiAreaSnapshotDO> listAreaSnapshots() { return mapper.listAreaSnapshots(); } @Override public List<BiAreaSnapshotDO> listAreaSnapshots() { return mapper.listAreaSnapshots(); }
@Override public List<BiCompanyAlarmCountDO> listCompanyAlarmCounts() { return mapper.listCompanyAlarmCounts(); } @Override public List<BiCompanyAlarmCountDO> listCompanyAlarmCounts() { return mapper.listCompanyAlarmCounts(); }
@Override public int countOpenAlarms() { return mapper.countOpenAlarms(); } @Override public int countOpenAlarms() { return mapper.countOpenAlarms(); }

View File

@ -16,6 +16,16 @@
<if test="portArea != null">AND port_area = #{portArea}</if> <if test="portArea != null">AND port_area = #{portArea}</if>
ORDER BY corp_name, corpinfo_id ORDER BY corp_name, corpinfo_id
</select> </select>
<select id="listPersonPositionCompanies" resultType="com.zcloud.personnel.positioning.persistence.dataobject.BiCorpInfoDO">
<include refid="corpInfoSelect"/>
<if test="corpinfoId != null and corpinfoId != ''">
AND CAST(corpinfo_id AS CHAR) = CAST(#{corpinfoId} AS CHAR)
</if>
<if test="portArea != null">
AND port_area = #{portArea}
</if>
ORDER BY corp_order ASC, corp_name ASC, corpinfo_id ASC
</select>
<select id="listAreaSnapshots" resultType="com.zcloud.personnel.positioning.persistence.dataobject.BiAreaSnapshotDO"> <select id="listAreaSnapshots" resultType="com.zcloud.personnel.positioning.persistence.dataobject.BiAreaSnapshotDO">
SELECT id, area_code, area_name, area_type, parent_id, parent_code, SELECT id, area_code, area_name, area_type, parent_id, parent_code,
corpinfo_id, corpinfo_name, center_lon, center_lat, polygon_json corpinfo_id, corpinfo_name, center_lon, center_lat, polygon_json