Selaa lähdekoodia

pms 设备责任人数据权限 终版

zhangcl 1 viikko sitten
vanhempi
commit
df9fb78df9

+ 28 - 1
yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java

@@ -68,6 +68,13 @@ public class DeptDataPermissionRule implements DataPermissionRule {
      */
     private final Map<String, BiFunction<Alias, Long, Expression>> deviceOwnerConditions = new HashMap<>();
 
+    /**
+     * 设备表直接责任人条件配置
+     * key: 设备表名
+     * value: 条件生成函数 (参数1: 表别名, 参数2: 用户ID, 返回: 设备责任人条件表达式)
+     */
+    private final Map<String, BiFunction<Alias, Long, Expression>> deviceOwnerDirectConditions = new HashMap<>();
+
     /**
      * 基于部门的表字段配置
      * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。
@@ -167,6 +174,17 @@ public class DeptDataPermissionRule implements DataPermissionRule {
         TABLE_NAMES.add(mainTable);
     }
 
+    /**
+     * 添加设备表直接责任人条件
+     *
+     * @param deviceTable 设备表名
+     * @param conditionGenerator 条件生成函数
+     */
+    public void addDeviceOwnerDirectCondition(String deviceTable, BiFunction<Alias, Long, Expression> conditionGenerator) {
+        deviceOwnerDirectConditions.put(deviceTable, conditionGenerator);
+        TABLE_NAMES.add(deviceTable);
+    }
+
     private Expression buildDeptExpression(String tableName, Alias tableAlias, Set<Long> deptIds) {
         // 如果不存在配置,则无需作为条件
         String columnName = deptColumns.get(tableName);
@@ -207,13 +225,22 @@ public class DeptDataPermissionRule implements DataPermissionRule {
 
         // 设备责任人条件
         Expression deviceOwnerExpression = null;
-        if (deviceOwnerConditionGenerator != null) {
+        if (ObjUtil.isNotEmpty(deviceOwnerConditionGenerator)) {
             deviceOwnerExpression = deviceOwnerConditionGenerator.apply(tableAlias, userId);
             if (ObjUtil.isNotEmpty(deviceOwnerExpression)) {
                 expressions.add(deviceOwnerExpression);
             }
         }
 
+        // 设备表直接责任人条件
+        BiFunction<Alias, Long, Expression> directCondition = deviceOwnerDirectConditions.get(tableName);
+        if (ObjUtil.isNotEmpty(directCondition)) {
+            Expression condition = directCondition.apply(tableAlias, userId);
+            if (ObjUtil.isNotEmpty(condition)) {
+                expressions.add(condition);
+            }
+        }
+
         // 组合条件
         if (expressions.isEmpty()) {
             return null;

+ 66 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/config/PmsDataPermissionConfiguration.java

@@ -32,9 +32,9 @@ import org.springframework.context.annotation.Configuration;
 import java.util.function.BiFunction;
 
 /**
- * system 模块的数据权限 Configuration
+ * pms 模块的数据权限 Configuration
  *
- * @author 芋道源码
+ * @author ruiqi
  */
 @Slf4j
 @Configuration(proxyBeanMethods = false)
@@ -76,7 +76,7 @@ public class PmsDataPermissionConfiguration {
             rule.addUserColumn(AdminUserDO.class, "id");
             rule.addUserColumn(SupplierDO.class, "creator");
 
-            // 工单主表添加设备责任人条件
+            // 保养工单主表添加设备责任人条件
             rule.addDeviceOwnerCondition("rq_iot_main_work_order",
                     DeviceOwnerConditionBuilder.createConditionGenerator(
                             new DeviceOwnerConditionBuilder.DeviceOwnerConfig()
@@ -90,6 +90,29 @@ public class PmsDataPermissionConfiguration {
                                     .devicePersonPersonIdColumn("person_id")
                     )
             );
+
+            // 巡检工单主表添加设备责任人条件
+            rule.addDeviceOwnerCondition("rq_iot_inspect_order",
+                    DeviceOwnerConditionBuilder.createConditionGenerator(
+                            new DeviceOwnerConditionBuilder.DeviceOwnerConfig()
+                                    .mainTable("rq_iot_inspect_order")
+                                    .mainTableIdColumn("id")
+                                    .bomTable("rq_iot_inspect_order_detail")
+                                    .bomTableMainIdColumn("order_id")
+                                    .bomTableDeviceIdColumn("device_id")
+                                    .devicePersonTable("rq_iot_device_person")
+                                    .devicePersonIdColumn("device_id")
+                                    .devicePersonPersonIdColumn("person_id")
+                    )
+            );
+
+            // 添加设备表直接责任人条件
+            rule.addDeviceOwnerDirectCondition("rq_iot_device",
+                    DeviceOwnerDirectBuilder.createConditionGenerator(
+                            "rq_iot_device", "id",
+                            "rq_iot_device_person", "person_id", "device_id"
+                    )
+            );
         };
     }
 
@@ -192,4 +215,44 @@ public class PmsDataPermissionConfiguration {
         }
     }
 
+    // 设备表直接责任人条件构建器
+    public static class DeviceOwnerDirectBuilder {
+        /**
+         * 创建设备表直接责任人条件生成器
+         *
+         * @param deviceTable 设备表名
+         * @param deviceIdColumn 设备ID字段名
+         * @param personTable 责任人表名
+         * @param personIdColumn 责任人ID字段名
+         * @param deviceIdJoinColumn 设备责任人表 设备ID字段名
+         * @return 条件生成函数
+         */
+        public static BiFunction<Alias, Long, Expression> createConditionGenerator(
+                String deviceTable, String deviceIdColumn,
+                String personTable, String personIdColumn, String deviceIdJoinColumn) {
+            return (tableAlias, userId) -> {
+                try {
+                    // 处理表别名
+                    String tablePrefix = tableAlias != null ? tableAlias.getName() : deviceTable;
+
+                    // 构建列名表达式
+                    String columnExpression = tablePrefix + "." + deviceIdColumn;
+
+                    // 构建SQL条件表达式
+                    String expressionSQL = String.format(
+                            "%s IN (SELECT %s FROM %s WHERE %s = %d)",
+                            columnExpression,
+                            deviceIdJoinColumn, personTable, personIdColumn, userId
+                    );
+
+                    // 解析为JSqlParser表达式
+                    return CCJSqlParserUtil.parseCondExpression(expressionSQL);
+                } catch (JSQLParserException e) {
+                    log.error("构建设备表直接责任人条件失败", e);
+                    return null;
+                }
+            };
+        }
+    }
+
 }