فهرست منبع

完善移动端故障管理数据权限

zengy 1 روز پیش
والد
کامیت
aa491b1c8b

+ 2 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/mobile/MobileOfficeController.java

@@ -1,6 +1,7 @@
 package com.zksy.web.controller.mobile;
 
 import com.zksy.base.alarm.dto.MobileAlarmQuery;
+import com.zksy.base.alarm.enums.AlarmAuditStatusEnum;
 import com.zksy.base.alarm.service.AlarmOperationsService;
 import com.zksy.base.service.EquipmentBaseService;
 import com.zksy.common.core.domain.AjaxResult;
@@ -32,6 +33,7 @@ public class MobileOfficeController {
         result.put("equipmentAlarming", equipment.findMobileByPage(1, 1, null, null, null, 1).getTotal());
         MobileAlarmQuery alarmQuery = new MobileAlarmQuery();
         alarmQuery.setPageSize(1);
+        alarmQuery.setAuditStatus(AlarmAuditStatusEnum.UNREVIEWED.getCode());
         result.put("alarmPending", alarms.mobilePage(alarmQuery).getTotal());
         result.put("alarmAddedToday", alarms.mobileTodayCount());
         InspectTaskPageDTO inspectQuery = new InspectTaskPageDTO();

+ 1 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmOperationsService.java

@@ -36,17 +36,14 @@ public class AlarmOperationsService {
     }
     public Page<AlarmVO> mobilePage(MobileAlarmQuery query) {
         AlarmQuery filters = query.toAlarmQuery();
-        // 与 PC 审核页一致,只查未处理事件,包含所有审核结果。
-        filters.setAlarmStatus(AlarmRecordStatusEnum.UNHANDLED.getCode());
         List<Integer> typeIds = scope.resolveMobile(query);
         return pageInScope(filters, typeIds);
     }
-    /** 今日新增仅统计移动端故障列表中仍可见的未处理事件。 */
+    /** 今日新增统计移动端可见范围内当天产生的全部报警。 */
     public long mobileTodayCount() {
         MobileAlarmQuery query = new MobileAlarmQuery();
         query.setPageSize(1);
         AlarmQuery filters = query.toAlarmQuery();
-        filters.setAlarmStatus(AlarmRecordStatusEnum.UNHANDLED.getCode());
         LocalDate today = LocalDate.now(ZoneId.of("Asia/Shanghai"));
         filters.setStartTime(today.atStartOfDay());
         filters.setEndTime(today.plusDays(1).atStartOfDay());

+ 3 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/AlarmReviewScopeService.java

@@ -26,7 +26,7 @@ public class AlarmReviewScopeService {
     private final ISysMenuService menuService;
     private final OpsAssignScopeSupport companyScope;
 
-    /** 移动端仅匹配公司设备类型的直接子级,管理员也不扩大范围。 */
+    /** 移动端匹配用户所属公司的设备类型直接子级,并包含所有共享窨井设备类型(父类 4)。 */
     public List<Integer> resolveMobile(MobileAlarmQuery query) {
         Set<Integer> roots = companyScope.currentCompanyEquipmentRootTypeIds();
         if (query.getRootTypeId() != null) {
@@ -34,7 +34,8 @@ public class AlarmReviewScopeService {
             roots = Collections.singleton(query.getRootTypeId());
         }
         if (roots.isEmpty()) return Collections.emptyList();
-        final Set<Integer> allowed = roots;
+        final Set<Integer> allowed = new LinkedHashSet<>(roots);
+        allowed.add(4);
         return typeMapper.selectList(null).stream()
                 .filter(type -> allowed.contains(type.getParentId()) && type.getId() != null)
                 .map(EquipmentType::getId).distinct().collect(Collectors.toList());

+ 3 - 4
pipe-network-service/zksy-system/src/main/resources/mapper/base/AlarmOperationsMapper.xml

@@ -1,13 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zksy.base.alarm.mapper.AlarmOperationsMapper">
-    <!-- 已转工单按 device_id 取设备;待审核事件尚无工单,按报警设备编码取设备。 -->
+    <!-- 移动端故障范围统一按报警自身 device_code 关联设备,与工单是否存在无关。 -->
     <sql id="mobileJoins">
         FROM app_user.alarm_data a
         LEFT JOIN app_user.work_order w ON w.order_id = a.work_order_id
         LEFT JOIN LATERAL (SELECT b.* FROM app_user.equipment_base b
-            WHERE (a.work_order_id IS NOT NULL AND b.equipment_id = w.device_id)
-               OR (a.work_order_id IS NULL AND b.equipment_code = a.device_code)
+            WHERE b.equipment_code = a.device_code
             ORDER BY b.equipment_id LIMIT 1) e ON true
         LEFT JOIN LATERAL (SELECT s.alarm_status FROM app_user.equipment_status s
             WHERE s.equipment_id = e.equipment_id AND s.del_flag = '0'
@@ -27,7 +26,7 @@
         SELECT <include refid="columns"/> <include refid="mobileJoins"/>
         <where>
             <include refid="mobileScope"/>
-            AND a.alarm_status = #{query.alarmStatus}
+            <if test="query.alarmStatus != null">AND a.alarm_status = #{query.alarmStatus}</if>
             <if test="query.keyword != null and query.keyword != ''">
                 AND (a.device_code ILIKE CONCAT('%',#{query.keyword},'%')
                     OR e.equipment_name ILIKE CONCAT('%',#{query.keyword},'%')

+ 14 - 4
pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/mapper/MobileAlarmMapperTest.java

@@ -10,7 +10,7 @@ import java.time.LocalDateTime;
 import static org.junit.jupiter.api.Assertions.*;
 
 class MobileAlarmMapperTest {
-    @Test void companyScopeUsesOrderDeviceAndPreservesEventsWithoutOrders() throws Exception {
+    @Test void mobileScopeUsesAlarmDeviceCodeAndPreservesEventsWithOrWithoutOrders() throws Exception {
         MybatisConfiguration config = new MybatisConfiguration();
         for (String name : Arrays.asList("AlarmReviewMapper", "AlarmOperationsMapper")) {
             try (InputStream xml = getClass().getResourceAsStream("/mapper/base/" + name + ".xml")) {
@@ -26,8 +26,8 @@ class MobileAlarmMapperTest {
         for (String statement : Arrays.asList(AlarmOperationsMapper.class.getName()+".selectMobilePage",
                 AlarmOperationsMapper.class.getName()+".selectMobileDetail", AlarmReviewMapper.class.getName()+".selectMobileDetail")) {
             String sql = config.getMappedStatement(statement).getBoundSql(params).getSql().replaceAll("\\s+", " ");
-            assertTrue(sql.contains("a.work_order_id IS NOT NULL AND b.equipment_id = w.device_id"));
-            assertTrue(sql.contains("a.work_order_id IS NULL AND b.equipment_code = a.device_code"));
+            assertTrue(sql.contains("b.equipment_code = a.device_code"));
+            assertFalse(sql.contains("b.equipment_id = w.device_id"));
             assertTrue(sql.contains("e.equipment_type_id IN"));
             if (statement.endsWith("selectMobilePage")) {
                 assertTrue(sql.contains("AND a.alarm_status = ?"));
@@ -42,8 +42,18 @@ class MobileAlarmMapperTest {
                 assertFalse(sql.contains("AND a.alarm_status ="));
             }
             params.put("typeIds",Collections.emptyList());
-            assertTrue(config.getMappedStatement(statement).getBoundSql(params).getSql().contains("1 = 0"));
+            String emptyScopeSql = config.getMappedStatement(statement).getBoundSql(params).getSql();
+            assertTrue(emptyScopeSql.contains("1 = 0"));
             params.put("typeIds",Collections.singletonList(11));
         }
+
+        query.setAlarmStatus(null);
+        String allStatusesSql = config.getMappedStatement(AlarmOperationsMapper.class.getName()+".selectMobilePage")
+                .getBoundSql(params).getSql().replaceAll("\\s+", " ");
+        assertFalse(allStatusesSql.contains("a.alarm_status = ?"), allStatusesSql);
+        query.setAlarmStatus(0);
+        String filteredSql = config.getMappedStatement(AlarmOperationsMapper.class.getName()+".selectMobilePage")
+                .getBoundSql(params).getSql().replaceAll("\\s+", " ");
+        assertTrue(filteredSql.contains("a.alarm_status = ?"), filteredSql);
     }
 }

+ 5 - 5
pipe-network-service/zksy-system/src/test/java/com/zksy/base/alarm/service/AlarmMobileServiceTest.java

@@ -40,11 +40,11 @@ class AlarmMobileServiceTest {
     }
 
     @ParameterizedTest @ValueSource(ints = {1, 2, 3})
-    void scopeIncludesOnlyDirectCompanyChildren(int root) {
+    void scopeIncludesCompanyChildrenAndSharedManholeChildren(int root) {
         when(company.currentCompanyEquipmentRootTypeIds()).thenReturn(Collections.singleton(root));
         when(types.selectList(null)).thenReturn(Arrays.asList(type(1,0), type(2,0), type(3,0), type(4,0),
                 type(11,1), type(21,2), type(31,3), type(41,4), type(111,11)));
-        assertEquals(Collections.singletonList(root * 10 + 1), scope.resolveMobile(new MobileAlarmQuery()));
+        assertEquals(new HashSet<>(Arrays.asList(root * 10 + 1, 41)), new HashSet<>(scope.resolveMobile(new MobileAlarmQuery())));
     }
     @Test void forgedRootBlocksEveryEntryBeforeReadingOrWriting() {
         when(company.currentCompanyEquipmentRootTypeIds()).thenReturn(Collections.singleton(1));
@@ -63,7 +63,7 @@ class AlarmMobileServiceTest {
         operations.mobilePage(new MobileAlarmQuery());
         verify(queries).selectMobilePage(any(), any(), eq(Collections.emptyList()));
     }
-    @Test void pageFixesUnhandledScopeAndForwardsFiltersAndPagination() {
+    @Test void pageShowsAllAlarmStatusesAndForwardsFiltersAndPagination() {
         when(company.currentCompanyEquipmentRootTypeIds()).thenReturn(Collections.singleton(2));
         when(types.selectList(null)).thenReturn(Collections.singletonList(type(21,2)));
         when(queries.selectMobilePage(any(), any(), anyList())).thenReturn(new Page<>());
@@ -74,7 +74,7 @@ class AlarmMobileServiceTest {
         verify(queries).selectMobilePage(argThat(page -> page.getCurrent() == 3 && page.getSize() == 20),
                 capture.capture(), eq(Collections.singletonList(21)));
         AlarmQuery actual = capture.getValue();
-        assertEquals(0, actual.getAlarmStatus()); assertEquals(2, actual.getAuditStatus());
+        assertNull(actual.getAlarmStatus()); assertEquals(2, actual.getAuditStatus());
         assertEquals("BJ123", actual.getKeyword());
         assertEquals(3, actual.getPageNum()); assertEquals(20, actual.getPageSize());
     }
@@ -94,7 +94,7 @@ class AlarmMobileServiceTest {
         verify(queries).selectMobilePage(argThat(page -> page.getCurrent() == 1 && page.getSize() == 1),
                 capture.capture(), eq(Collections.singletonList(11)));
         AlarmQuery actual = capture.getValue();
-        assertEquals(0, actual.getAlarmStatus());
+        assertNull(actual.getAlarmStatus());
         assertTrue(actual.getStartTime().toLocalDate().equals(before) || actual.getStartTime().toLocalDate().equals(after));
         assertEquals(actual.getStartTime().plusDays(1), actual.getEndTime());
     }