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:
config:
import:
# - classpath:nacos-prod.yml
- classpath:nacos.yml
- classpath:nacos-prod.yml
# - classpath:nacos.yml
- classpath:kafka.yml
- classpath:sdk.yml
- classpath:swagger.yml

View File

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

View File

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

View File

@ -61,12 +61,15 @@ public class AlarmRecordQueryExe {
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;
Long corpinfoId = query.getCorpinfoId();
List<AlarmRecordCO> rows = alarmRecordCoConvertor.converDOsToCOs(
alarmRecordRepository.listBiAlarm(corpinfoId, query.getPortArea()));
return rows;
Map<String, Object> params = PageQueryHelper.toHashMap(query);
params.put("corpinfoId", query.getCorpinfoId() == null ? null : String.valueOf(query.getCorpinfoId()));
params.put("portArea", query.getPortArea());
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) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -18,7 +18,7 @@ import java.util.Map;
public interface AlarmRecordRepository extends BaseRepository<AlarmRecordDO> {
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);

View File

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

View File

@ -66,11 +66,11 @@
<include refid="mappedCompanyJoin"/>
WHERE (ar.delete_enum IS NULL OR ar.delete_enum = 'FALSE')
AND <include refid="mappedCompanyId"/> IS NOT NULL
<if test="corpinfoId != null and corpinfoId != ''">
AND <include refid="mappedCompanyId"/> = #{corpinfoId}
<if test="params.corpinfoId != null and params.corpinfoId != ''">
AND <include refid="mappedCompanyId"/> = CAST(#{params.corpinfoId} AS CHAR)
</if>
<if test="portArea != null">
AND corp.port_area = #{portArea}
<if test="params.portArea != null">
AND COALESCE(corp_uuid.port_area, corp_internal.port_area) = #{params.portArea}
</if>
ORDER BY COALESCE(ar.start_time, ar.create_time) DESC, ar.id DESC
</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">
<mapper namespace="com.zcloud.personnel.positioning.persistence.mapper.PersonnelPositioningBiMapper">
<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,
longitude, latitude, port_area
FROM corp_info WHERE (delete_enum IS NULL OR delete_enum = 'FALSE')