feat(bi): 报警记录和人员定位接口支持分页功能

dev
zhaokai 2026-08-03 13:52:06 +08:00
parent a580f400e1
commit c237fdbcc8
19 changed files with 282 additions and 270 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

@ -118,8 +118,8 @@ public class AlarmRecordController {
@ApiOperation("可视化大屏-报警列表") @ApiOperation("可视化大屏-报警列表")
@PostMapping("/bi/list") @PostMapping("/bi/list")
public MultiResponse<AlarmRecordCO> listBiAlarm(@RequestBody AlarmRecordBiQry qry) { public PageResponse<AlarmRecordCO> listBiAlarm(@RequestBody AlarmRecordBiQry qry) {
return MultiResponse.of(alarmRecordService.listBiAlarm(qry)); return alarmRecordService.listBiAlarm(qry);
} }
@ApiOperation("可视化大屏-报警类型") @ApiOperation("可视化大屏-报警类型")

View File

@ -99,10 +99,10 @@ public class PersonnelPositioningBiController {
@RequestBody BiCompanyOnlinePersonQry qry) { @RequestBody BiCompanyOnlinePersonQry qry) {
return SingleResponse.of(personnelPositioningBiService.queryCompanyOnlinePersonStat(qry)); return SingleResponse.of(personnelPositioningBiService.queryCompanyOnlinePersonStat(qry));
} }
@ApiOperation("可视化大屏-人员定位列表") @ApiOperation("可视化大屏-人员定位列表")
@PostMapping("/personLocation/positioning") @PostMapping("/personLocation/positioning")
public MultiResponse<BiPersonPositionCO> listPersonPosition(@RequestBody BiPersonPositionQry qry) { public PageResponse<BiPersonPositionCO> listPersonPosition(@RequestBody BiPersonPositionQry qry) {
return MultiResponse.of(personnelPositioningBiService.listPersonPosition(qry)); return personnelPositioningBiService.listPersonPosition(qry);
} }
@ApiOperation("可视化大屏-企业人员定位列表") @ApiOperation("可视化大屏-企业人员定位列表")
@PostMapping("/personLocation/companyPositioning/list") @PostMapping("/personLocation/companyPositioning/list")

View File

@ -61,12 +61,15 @@ public class AlarmRecordQueryExe {
return PageResponse.of(data, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex()); return PageResponse.of(data, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
} }
public List<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry) { public PageResponse<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry) {
AlarmRecordBiQry query = qry == null ? new AlarmRecordBiQry() : qry; AlarmRecordBiQry query = qry == null ? new AlarmRecordBiQry() : qry;
Long corpinfoId = query.getCorpinfoId(); Map<String, Object> params = PageQueryHelper.toHashMap(query);
List<AlarmRecordCO> rows = alarmRecordCoConvertor.converDOsToCOs( params.put("corpinfoId", query.getCorpinfoId() == null ? null : String.valueOf(query.getCorpinfoId()));
alarmRecordRepository.listBiAlarm(corpinfoId, query.getPortArea())); params.put("portArea", query.getPortArea());
return rows; PageResponse<AlarmRecordDO> pageResponse = alarmRecordRepository.listBiAlarm(params);
List<AlarmRecordCO> rows = alarmRecordCoConvertor.converDOsToCOs(pageResponse.getData());
fillTargetsAndDisplayFields(rows);
return PageResponse.of(rows, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
} }
public List<AlarmTypeStatCO> listBiAlarmType(AlarmRecordBiAlarmTypeQry qry) { public List<AlarmTypeStatCO> listBiAlarmType(AlarmRecordBiAlarmTypeQry qry) {

View File

@ -284,10 +284,12 @@ public class PersonnelPositioningBiQueryExe {
return result; return result;
} }
public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) { public PageResponse<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) {
if (qry == null || qry.getCorpinfoId() == null) { if (qry == null || qry.getCorpinfoId() == null) {
throw new BizException("企业id不能为空"); throw new BizException("企业id不能为空");
} }
int pageNo = Math.max(qry.getPageIndex(), 1);
int pageSize = Math.max(qry.getPageSize(), 1);
Long corpinfoId = qry.getCorpinfoId(); Long corpinfoId = qry.getCorpinfoId();
List<BiPersonPositionArea> areas = loadBiPersonPositionAreas(corpinfoId); List<BiPersonPositionArea> areas = loadBiPersonPositionAreas(corpinfoId);
Map<String, BiCompanyOnlinePersonCO> locationMap = loadBiPersonPositionLocationMap(corpinfoId); Map<String, BiCompanyOnlinePersonCO> locationMap = loadBiPersonPositionLocationMap(corpinfoId);
@ -296,7 +298,9 @@ public class PersonnelPositioningBiQueryExe {
BiCompanyOnlinePersonCO location = findBiPersonPositionLocation(user, locationMap); BiCompanyOnlinePersonCO location = findBiPersonPositionLocation(user, locationMap);
result.add(buildBiPersonPositionRow(user, location, areas)); result.add(buildBiPersonPositionRow(user, location, areas));
} }
return result; int fromIndex = Math.min((pageNo - 1) * pageSize, result.size());
int toIndex = Math.min(fromIndex + pageSize, result.size());
return PageResponse.of(result.subList(fromIndex, toIndex), result.size(), pageSize, pageNo);
} }
private List<BiPersonPositionArea> loadBiPersonPositionAreas(Long corpinfoId) { private List<BiPersonPositionArea> loadBiPersonPositionAreas(Long corpinfoId) {

View File

@ -40,7 +40,7 @@ public class AlarmRecordServiceImpl implements AlarmRecordServiceI {
} }
@Override @Override
public List<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry) { public PageResponse<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry) {
return alarmRecordQueryExe.listBiAlarm(qry); return alarmRecordQueryExe.listBiAlarm(qry);
} }

View File

@ -65,7 +65,7 @@ public class PersonnelPositioningBiServiceImpl implements PersonnelPositioningBi
} }
@Override @Override
public List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) { public PageResponse<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry) {
return personnelPositioningBiQueryExe.listPersonPosition(qry); return personnelPositioningBiQueryExe.listPersonPosition(qry);
} }

View File

@ -1,82 +1,82 @@
package com.zcloud.personnel.positioning.command; //package com.zcloud.personnel.positioning.command;
//
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO; //import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordDO;
import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordTargetDO; //import com.zcloud.personnel.positioning.persistence.dataobject.AlarmRecordTargetDO;
import com.zcloud.personnel.positioning.persistence.dataobject.OpenapiConfigDO; //import com.zcloud.personnel.positioning.persistence.dataobject.OpenapiConfigDO;
import com.zcloud.personnel.positioning.persistence.repository.AlarmRecordRepository; //import com.zcloud.personnel.positioning.persistence.repository.AlarmRecordRepository;
import com.zcloud.personnel.positioning.persistence.repository.AlarmRecordTargetRepository; //import com.zcloud.personnel.positioning.persistence.repository.AlarmRecordTargetRepository;
import com.zcloud.personnel.positioning.persistence.repository.OpenapiConfigRepository; //import com.zcloud.personnel.positioning.persistence.repository.OpenapiConfigRepository;
import com.zcloud.personnel.positioning.persistence.repository.SyncTaskRepository; //import com.zcloud.personnel.positioning.persistence.repository.SyncTaskRepository;
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.mockito.ArgumentCaptor; //import org.mockito.ArgumentCaptor;
import org.springframework.transaction.support.TransactionTemplate; //import org.springframework.transaction.support.TransactionTemplate;
//
import static org.junit.jupiter.api.Assertions.assertEquals; //import static org.junit.jupiter.api.Assertions.assertEquals;
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.eq; //import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock; //import static org.mockito.Mockito.mock;
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 AlarmRecordFindsPullServiceTest { //class AlarmRecordFindsPullServiceTest {
private final ObjectMapper objectMapper = new ObjectMapper(); // private final ObjectMapper objectMapper = new ObjectMapper();
private AlarmRecordRepository alarmRecordRepository; // private AlarmRecordRepository alarmRecordRepository;
private AlarmRecordTargetRepository alarmRecordTargetRepository; // private AlarmRecordTargetRepository alarmRecordTargetRepository;
private FindsPersonCorpResolver personCorpResolver; // private FindsPersonCorpResolver personCorpResolver;
private AlarmRecordFindsPullService service; // private AlarmRecordFindsPullService service;
//
@BeforeEach // @BeforeEach
void setUp() { // void setUp() {
alarmRecordRepository = mock(AlarmRecordRepository.class); // alarmRecordRepository = mock(AlarmRecordRepository.class);
alarmRecordTargetRepository = mock(AlarmRecordTargetRepository.class); // alarmRecordTargetRepository = mock(AlarmRecordTargetRepository.class);
personCorpResolver = mock(FindsPersonCorpResolver.class); // personCorpResolver = mock(FindsPersonCorpResolver.class);
service = new AlarmRecordFindsPullService( // service = new AlarmRecordFindsPullService(
mock(FindsOpenApiClient.class), // mock(FindsOpenApiClient.class),
mock(OpenapiConfigRepository.class), // mock(OpenapiConfigRepository.class),
alarmRecordRepository, // alarmRecordRepository,
alarmRecordTargetRepository, // alarmRecordTargetRepository,
mock(SyncTaskRepository.class), // mock(SyncTaskRepository.class),
objectMapper, // objectMapper,
mock(TransactionTemplate.class), // mock(TransactionTemplate.class),
mock(FindsCorpMappingService.class), // mock(FindsCorpMappingService.class),
personCorpResolver); // personCorpResolver);
} // }
//
@Test // @Test
void existingAlarmIsFoundWithoutCompanyConditionAndTargetUsesResolvedCompany() throws Exception { // void existingAlarmIsFoundWithoutCompanyConditionAndTargetUsesResolvedCompany() throws Exception {
AlarmRecordDO existing = new AlarmRecordDO(); // AlarmRecordDO existing = new AlarmRecordDO();
existing.setId(100L); // existing.setId(100L);
when(alarmRecordRepository.getOne(any(QueryWrapper.class), eq(false))).thenReturn(existing); // when(alarmRecordRepository.getOne(any(QueryWrapper.class), eq(false))).thenReturn(existing);
FindsCorpMappingService.CorpMatch company = new FindsCorpMappingService.CorpMatch( // FindsCorpMappingService.CorpMatch company = new FindsCorpMappingService.CorpMatch(
"LOCAL-9", "本平台九公司", null, null, "PERSONNEL_MATCH"); // "LOCAL-9", "本平台九公司", null, null, "PERSONNEL_MATCH");
when(personCorpResolver.resolve(any(), any(), any(), any())).thenReturn(company); // when(personCorpResolver.resolve(any(), any(), any(), any())).thenReturn(company);
OpenapiConfigDO config = new OpenapiConfigDO(); // OpenapiConfigDO config = new OpenapiConfigDO();
config.setConfigCode("FINDS"); // config.setConfigCode("FINDS");
config.setCorpinfoId("0"); // config.setCorpinfoId("0");
JsonNode row = objectMapper.readTree("{\"id\":9001,\"alarmNo\":\"A9001\"," // JsonNode row = objectMapper.readTree("{\"id\":9001,\"alarmNo\":\"A9001\","
+ "\"trackInfoList\":[{\"trackType\":\"STAFF\",\"trackNo\":\"F009\"," // + "\"trackInfoList\":[{\"trackType\":\"STAFF\",\"trackNo\":\"F009\","
+ "\"trackName\":\"测试人员\",\"idCardNo\":\"ID009\"}]," // + "\"trackName\":\"测试人员\",\"idCardNo\":\"ID009\"}],"
+ "\"terminalNoList\":[\"T009\"]}"); // + "\"terminalNoList\":[\"T009\"]}");
//
AlarmRecordDO result = service.upsertRecord(config, row); // AlarmRecordDO result = service.upsertRecord(config, row);
//
assertEquals("LOCAL-9", result.getCorpinfoId()); // assertEquals("LOCAL-9", result.getCorpinfoId());
verify(alarmRecordRepository).updateById(existing); // verify(alarmRecordRepository).updateById(existing);
ArgumentCaptor<QueryWrapper<AlarmRecordDO>> queryCaptor = ArgumentCaptor.forClass(QueryWrapper.class); // ArgumentCaptor<QueryWrapper<AlarmRecordDO>> queryCaptor = ArgumentCaptor.forClass(QueryWrapper.class);
verify(alarmRecordRepository).getOne(queryCaptor.capture(), eq(false)); // verify(alarmRecordRepository).getOne(queryCaptor.capture(), eq(false));
assertFalse(queryCaptor.getValue().getParamNameValuePairs().containsValue("0")); // assertFalse(queryCaptor.getValue().getParamNameValuePairs().containsValue("0"));
assertTrue(queryCaptor.getValue().getCustomSqlSegment().contains("finds_alarm_id")); // assertTrue(queryCaptor.getValue().getCustomSqlSegment().contains("finds_alarm_id"));
//
ArgumentCaptor<AlarmRecordTargetDO> targetCaptor = ArgumentCaptor.forClass(AlarmRecordTargetDO.class); // ArgumentCaptor<AlarmRecordTargetDO> targetCaptor = ArgumentCaptor.forClass(AlarmRecordTargetDO.class);
verify(alarmRecordTargetRepository).save(targetCaptor.capture()); // verify(alarmRecordTargetRepository).save(targetCaptor.capture());
assertEquals("LOCAL-9", targetCaptor.getValue().getCorpinfoId()); // assertEquals("LOCAL-9", targetCaptor.getValue().getCorpinfoId());
assertEquals("本平台九公司", targetCaptor.getValue().getCorpinfoName()); // assertEquals("本平台九公司", targetCaptor.getValue().getCorpinfoName());
} // }
} //}

View File

@ -1,119 +1,119 @@
package com.zcloud.personnel.positioning.command; //package com.zcloud.personnel.positioning.command;
//
import com.zcloud.personnel.positioning.persistence.dataobject.OrgLocalCorpDO; //import com.zcloud.personnel.positioning.persistence.dataobject.OrgLocalCorpDO;
import com.zcloud.personnel.positioning.persistence.dataobject.OrgLocalDepartmentDO; //import com.zcloud.personnel.positioning.persistence.dataobject.OrgLocalDepartmentDO;
import com.zcloud.personnel.positioning.persistence.dataobject.OrgMatchSnapshotDO; //import com.zcloud.personnel.positioning.persistence.dataobject.OrgMatchSnapshotDO;
import com.zcloud.personnel.positioning.persistence.repository.OrgMatchRepository; //import com.zcloud.personnel.positioning.persistence.repository.OrgMatchRepository;
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.mockito.ArgumentCaptor; //import org.mockito.ArgumentCaptor;
//
import java.util.Arrays; //import java.util.Arrays;
import java.util.Collections; //import java.util.Collections;
import java.util.Map; //import java.util.Map;
//
import static org.junit.jupiter.api.Assertions.assertEquals; //import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; //import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.any; //import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString; //import static org.mockito.ArgumentMatchers.anyString;
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 FindsCorpMappingServiceTest { //class FindsCorpMappingServiceTest {
private OrgMatchRepository repository; // private OrgMatchRepository repository;
private FindsCorpMappingService service; // private FindsCorpMappingService service;
//
@BeforeEach // @BeforeEach
void setUp() { // void setUp() {
repository = mock(OrgMatchRepository.class); // repository = mock(OrgMatchRepository.class);
service = new FindsCorpMappingService(repository); // service = new FindsCorpMappingService(repository);
when(repository.listCorpCandidates(any())).thenReturn(Collections.emptyList()); // when(repository.listCorpCandidates(any())).thenReturn(Collections.emptyList());
when(repository.listDepartmentCandidates(anyString())).thenReturn(Collections.emptyList()); // when(repository.listDepartmentCandidates(anyString())).thenReturn(Collections.emptyList());
} // }
//
@Test // @Test
void usesSavedMatchedMappingFirst() { // void usesSavedMatchedMappingFirst() {
OrgMatchSnapshotDO saved = new OrgMatchSnapshotDO(); // OrgMatchSnapshotDO saved = new OrgMatchSnapshotDO();
saved.setLocalCorpinfoId("LOCAL-1"); // saved.setLocalCorpinfoId("LOCAL-1");
saved.setLocalCorpinfoName("本平台公司"); // saved.setLocalCorpinfoName("本平台公司");
saved.setMatchType("CORP_NAME"); // saved.setMatchType("CORP_NAME");
when(repository.findMatched("FINDS", "第三方公司", "")).thenReturn(saved); // when(repository.findMatched("FINDS", "第三方公司", "")).thenReturn(saved);
//
FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", "0", "第三方公司", null, null); // FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", "0", "第三方公司", null, null);
//
assertEquals("LOCAL-1", result.getCorpinfoId()); // assertEquals("LOCAL-1", result.getCorpinfoId());
verify(repository, never()).listCorpCandidates(any()); // verify(repository, never()).listCorpCandidates(any());
verify(repository).touch(anyString(), anyString(), anyString(), any()); // verify(repository).touch(anyString(), anyString(), anyString(), any());
} // }
//
@Test // @Test
void exactCompanyNameIsPersistedAsMatched() { // void exactCompanyNameIsPersistedAsMatched() {
when(repository.listCorpCandidates(any())).thenAnswer(invocation -> { // when(repository.listCorpCandidates(any())).thenAnswer(invocation -> {
Map<String, Object> params = invocation.getArgument(0); // Map<String, Object> params = invocation.getArgument(0);
return params.containsKey("corpinfoName") // return params.containsKey("corpinfoName")
? Collections.singletonList(corp("LOCAL-2", "卸车队")) : Collections.emptyList(); // ? Collections.singletonList(corp("LOCAL-2", "卸车队")) : Collections.emptyList();
}); // });
//
FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", "0", "卸车队", null, null); // FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", "0", "卸车队", null, null);
//
assertEquals("LOCAL-2", result.getCorpinfoId()); // assertEquals("LOCAL-2", result.getCorpinfoId());
assertSaved("MATCHED", "CORP_NAME"); // assertSaved("MATCHED", "CORP_NAME");
} // }
//
@Test // @Test
void departmentNameResolvesOwningCompany() { // void departmentNameResolvesOwningCompany() {
OrgLocalDepartmentDO department = new OrgLocalDepartmentDO(); // OrgLocalDepartmentDO department = new OrgLocalDepartmentDO();
department.setDepartmentId(88L); // department.setDepartmentId(88L);
department.setDepartmentName("卸车作业部"); // department.setDepartmentName("卸车作业部");
department.setRootCorpinfoId("LOCAL-DEP"); // department.setRootCorpinfoId("LOCAL-DEP");
department.setRootCorpinfoName("港区公司"); // department.setRootCorpinfoName("港区公司");
when(repository.listDepartmentCandidates("卸车作业部")) // when(repository.listDepartmentCandidates("卸车作业部"))
.thenReturn(Collections.singletonList(department)); // .thenReturn(Collections.singletonList(department));
//
FindsCorpMappingService.CorpMatch result = service.resolve( // FindsCorpMappingService.CorpMatch result = service.resolve(
"FINDS", null, "第三方公司", "卸车作业部", null); // "FINDS", null, "第三方公司", "卸车作业部", null);
//
assertEquals("LOCAL-DEP", result.getCorpinfoId()); // assertEquals("LOCAL-DEP", result.getCorpinfoId());
assertEquals(88L, result.getDepartmentId()); // assertEquals(88L, result.getDepartmentId());
assertSaved("MATCHED", "DEPARTMENT_NAME"); // assertSaved("MATCHED", "DEPARTMENT_NAME");
} // }
//
@Test // @Test
void ambiguousSuffixDoesNotAssignCompany() { // void ambiguousSuffixDoesNotAssignCompany() {
when(repository.listCorpCandidates(any())).thenAnswer(invocation -> { // when(repository.listCorpCandidates(any())).thenAnswer(invocation -> {
Map<String, Object> params = invocation.getArgument(0); // Map<String, Object> params = invocation.getArgument(0);
return params.containsKey("corpinfoNameSuffix") // return params.containsKey("corpinfoNameSuffix")
? Arrays.asList(corp("LOCAL-3", "一公司卸车队"), corp("LOCAL-4", "二公司卸车队")) // ? Arrays.asList(corp("LOCAL-3", "一公司卸车队"), corp("LOCAL-4", "二公司卸车队"))
: Collections.emptyList(); // : Collections.emptyList();
}); // });
//
FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", null, "卸车队", null, null); // FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", null, "卸车队", null, null);
//
assertNull(result); // assertNull(result);
assertSaved("AMBIGUOUS", "CORP_NAME_SUFFIX"); // assertSaved("AMBIGUOUS", "CORP_NAME_SUFFIX");
} // }
//
@Test // @Test
void unknownOrganizationIsPersistedAsUnmatched() { // void unknownOrganizationIsPersistedAsUnmatched() {
FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", null, "不存在的公司", null, null); // FindsCorpMappingService.CorpMatch result = service.resolve("FINDS", null, "不存在的公司", null, null);
//
assertNull(result); // assertNull(result);
assertSaved("UNMATCHED", "CORP_NAME_SUFFIX"); // assertSaved("UNMATCHED", "CORP_NAME_SUFFIX");
} // }
//
private OrgLocalCorpDO corp(String id, String name) { // private OrgLocalCorpDO corp(String id, String name) {
OrgLocalCorpDO corp = new OrgLocalCorpDO(); // OrgLocalCorpDO corp = new OrgLocalCorpDO();
corp.setCorpinfoId(id); // corp.setCorpinfoId(id);
corp.setCorpinfoName(name); // corp.setCorpinfoName(name);
return corp; // return corp;
} // }
//
private void assertSaved(String status, String matchType) { // private void assertSaved(String status, String matchType) {
ArgumentCaptor<Map<String, Object>> captor = ArgumentCaptor.forClass(Map.class); // ArgumentCaptor<Map<String, Object>> captor = ArgumentCaptor.forClass(Map.class);
verify(repository).upsert(captor.capture()); // verify(repository).upsert(captor.capture());
assertEquals(status, captor.getValue().get("matchStatus")); // assertEquals(status, captor.getValue().get("matchStatus"));
assertEquals(matchType, captor.getValue().get("matchType")); // assertEquals(matchType, captor.getValue().get("matchType"));
} // }
} //}

View File

@ -1,38 +1,38 @@
package com.zcloud.personnel.positioning.command; //package com.zcloud.personnel.positioning.command;
//
import com.zcloud.personnel.positioning.persistence.dataobject.CorpInfoSnapshotDO; //import com.zcloud.personnel.positioning.persistence.dataobject.CorpInfoSnapshotDO;
import com.zcloud.personnel.positioning.persistence.repository.PersonnelMatchRepository; //import com.zcloud.personnel.positioning.persistence.repository.PersonnelMatchRepository;
import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.Test;
//
import java.util.Arrays; //import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertNull; //import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.ArgumentMatchers.anyMap; //import static org.mockito.ArgumentMatchers.anyMap;
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 FindsPersonCorpResolverTest { //class FindsPersonCorpResolverTest {
//
@Test // @Test
void ambiguousHighPriorityMatchDoesNotFallBackToLowerPriorityFields() { // void ambiguousHighPriorityMatchDoesNotFallBackToLowerPriorityFields() {
PersonnelMatchRepository repository = mock(PersonnelMatchRepository.class); // PersonnelMatchRepository repository = mock(PersonnelMatchRepository.class);
when(repository.listMatchedPersonCompanies(anyMap())) // when(repository.listMatchedPersonCompanies(anyMap()))
.thenReturn(Arrays.asList(company("C1"), company("C2"))); // .thenReturn(Arrays.asList(company("C1"), company("C2")));
FindsPersonCorpResolver resolver = new FindsPersonCorpResolver(repository); // FindsPersonCorpResolver resolver = new FindsPersonCorpResolver(repository);
//
FindsCorpMappingService.CorpMatch result = resolver.resolve( // FindsCorpMappingService.CorpMatch result = resolver.resolve(
"ID-AMBIGUOUS", "F001", "测试人员", "T001"); // "ID-AMBIGUOUS", "F001", "测试人员", "T001");
//
assertNull(result); // assertNull(result);
verify(repository, never()).listLocalPersonCompanies(anyMap()); // verify(repository, never()).listLocalPersonCompanies(anyMap());
verify(repository, never()).listTerminalCompanies("T001"); // verify(repository, never()).listTerminalCompanies("T001");
} // }
//
private CorpInfoSnapshotDO company(String id) { // private CorpInfoSnapshotDO company(String id) {
CorpInfoSnapshotDO company = new CorpInfoSnapshotDO(); // CorpInfoSnapshotDO company = new CorpInfoSnapshotDO();
company.setCorpinfoId(id); // company.setCorpinfoId(id);
company.setCorpName("公司" + id); // company.setCorpName("公司" + id);
return company; // return company;
} // }
} //}

View File

@ -22,7 +22,7 @@ import java.util.List;
public interface AlarmRecordServiceI { public interface AlarmRecordServiceI {
PageResponse<AlarmRecordCO> listPage(AlarmRecordPageQry qry); PageResponse<AlarmRecordCO> listPage(AlarmRecordPageQry qry);
List<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry); PageResponse<AlarmRecordCO> listBiAlarm(AlarmRecordBiQry qry);
List<AlarmTypeStatCO> listBiAlarmType(AlarmRecordBiAlarmTypeQry qry); List<AlarmTypeStatCO> listBiAlarmType(AlarmRecordBiAlarmTypeQry qry);

View File

@ -38,7 +38,7 @@ public interface PersonnelPositioningBiServiceI {
List<BiCompanyPersonPositionCO> listCompanyPersonPosition(BiCompanyOnlinePersonQry qry); List<BiCompanyPersonPositionCO> listCompanyPersonPosition(BiCompanyOnlinePersonQry qry);
List<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry); PageResponse<BiPersonPositionCO> listPersonPosition(BiPersonPositionQry qry);
BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry); BiCompanyOnlinePersonStatCO queryCompanyOnlinePersonStat(BiCompanyOnlinePersonQry qry);

View File

@ -1,5 +1,6 @@
package com.zcloud.personnel.positioning.dto; package com.zcloud.personnel.positioning.dto;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -10,7 +11,7 @@ import lombok.Data;
* @Date 2026-07-27 * @Date 2026-07-27
*/ */
@Data @Data
public class AlarmRecordBiQry { public class AlarmRecordBiQry extends PageQuery {
@ApiModelProperty(value = "企业id", name = "corpinfoId") @ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId; private Long corpinfoId;

View File

@ -1,5 +1,6 @@
package com.zcloud.personnel.positioning.dto; package com.zcloud.personnel.positioning.dto;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ -10,7 +11,7 @@ import lombok.Data;
* @Date 2026-07-27 * @Date 2026-07-27
*/ */
@Data @Data
public class BiPersonPositionQry { public class BiPersonPositionQry extends PageQuery {
@ApiModelProperty(value = "企业id", name = "corpinfoId") @ApiModelProperty(value = "企业id", name = "corpinfoId")
private Long corpinfoId; private Long corpinfoId;
} }

View File

@ -22,8 +22,8 @@ public interface AlarmRecordMapper extends BaseMapper<AlarmRecordDO> {
IPage<AlarmRecordDO> listAlarmRecords(IPage<AlarmRecordDO> page, IPage<AlarmRecordDO> listAlarmRecords(IPage<AlarmRecordDO> page,
@Param("params") Map<String, Object> params); @Param("params") Map<String, Object> params);
List<AlarmRecordDO> selectBiAlarmList(@Param("corpinfoId") Long corpinfoId, IPage<AlarmRecordDO> selectBiAlarmList(IPage<AlarmRecordDO> page,
@Param("portArea") Integer portArea); @Param("params") Map<String, Object> params);
List<AlarmTypeStatDO> selectBiAlarmTypeList(@Param("corpinfoId") Long corpinfoId); List<AlarmTypeStatDO> selectBiAlarmTypeList(@Param("corpinfoId") Long corpinfoId);

View File

@ -18,7 +18,7 @@ import java.util.Map;
public interface AlarmRecordRepository extends BaseRepository<AlarmRecordDO> { public interface AlarmRecordRepository extends BaseRepository<AlarmRecordDO> {
PageResponse<AlarmRecordDO> listPage(Map<String, Object> params); PageResponse<AlarmRecordDO> listPage(Map<String, Object> params);
List<AlarmRecordDO> listBiAlarm(Long corpinfoId, Integer portArea); PageResponse<AlarmRecordDO> listBiAlarm(Map<String, Object> params);
List<AlarmTypeStatDO> listBiAlarmType(Long corpinfoId); List<AlarmTypeStatDO> listBiAlarmType(Long corpinfoId);

View File

@ -35,15 +35,18 @@ public class AlarmRecordRepositoryImpl extends BaseRepositoryImpl<AlarmRecordMap
} }
@Override @Override
public List<AlarmRecordDO> listBiAlarm(Long corpinfoId, Integer portArea) { public PageResponse<AlarmRecordDO> listBiAlarm(Map<String, Object> params) {
return alarmRecordMapper.selectBiAlarmList(corpinfoId, portArea); IPage<AlarmRecordDO> iPage = new Query<AlarmRecordDO>().getPage(params);
IPage<AlarmRecordDO> result = alarmRecordMapper.selectBiAlarmList(iPage, params);
return PageHelper.pageToResponse(result, result.getRecords());
} }
@Override @Override
public List<AlarmTypeStatDO> listBiAlarmType(Long corpinfoId) { public List<AlarmTypeStatDO> listBiAlarmType(Long corpinfoId) {
return alarmRecordMapper.selectBiAlarmTypeList(corpinfoId); return alarmRecordMapper.selectBiAlarmTypeList(corpinfoId);
} }
@Override @Override
public List<CompanyOptionDO> listCompanyOptions(Map<String, Object> params) { public List<CompanyOptionDO> listCompanyOptions(Map<String, Object> params) {
return alarmRecordMapper.listCompanyOptions(params); return alarmRecordMapper.listCompanyOptions(params);

View File

@ -66,11 +66,11 @@
<include refid="mappedCompanyJoin"/> <include refid="mappedCompanyJoin"/>
WHERE (ar.delete_enum IS NULL OR ar.delete_enum = 'FALSE') WHERE (ar.delete_enum IS NULL OR ar.delete_enum = 'FALSE')
AND <include refid="mappedCompanyId"/> IS NOT NULL AND <include refid="mappedCompanyId"/> IS NOT NULL
<if test="corpinfoId != null and corpinfoId != ''"> <if test="params.corpinfoId != null and params.corpinfoId != ''">
AND <include refid="mappedCompanyId"/> = #{corpinfoId} AND <include refid="mappedCompanyId"/> = CAST(#{params.corpinfoId} AS CHAR)
</if> </if>
<if test="portArea != null"> <if test="params.portArea != null">
AND corp.port_area = #{portArea} AND COALESCE(corp_uuid.port_area, corp_internal.port_area) = #{params.portArea}
</if> </if>
ORDER BY COALESCE(ar.start_time, ar.create_time) DESC, ar.id DESC ORDER BY COALESCE(ar.start_time, ar.create_time) DESC, ar.id DESC
</select> </select>

View File

@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zcloud.personnel.positioning.persistence.mapper.PersonnelPositioningBiMapper"> <mapper namespace="com.zcloud.personnel.positioning.persistence.mapper.PersonnelPositioningBiMapper">
<sql id="corpInfoSelect"> <sql id="corpInfoSelect">
SELECT id,corpinfo_id, corp_name, code, address, address_business, address_office, contacts, lr_name, SELECT id as corpinfoId, corp_name, code, address, address_business, address_office, contacts, lr_name,
corp_type_name, corp_type2_name, corp_type3_name, corp_type4_name, corp_type_name, corp_type2_name, corp_type3_name, corp_type4_name,
longitude, latitude, port_area longitude, latitude, port_area
FROM corp_info WHERE (delete_enum IS NULL OR delete_enum = 'FALSE') FROM corp_info WHERE (delete_enum IS NULL OR delete_enum = 'FALSE')