Parcourir la source

pms 在仅个人数据权限基础上附加设备责任人数据权限

zhangcl il y a 1 semaine
Parent
commit
b7af34c4f9

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.datapermission.core.rule.dept;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -24,10 +25,8 @@ import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
 import net.sf.jsqlparser.expression.operators.relational.InExpression;
 import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.function.BiFunction;
 
 /**
  * 基于部门的 {@link DataPermissionRule} 数据权限规则实现
@@ -62,6 +61,13 @@ public class DeptDataPermissionRule implements DataPermissionRule {
 
     private final PermissionApi permissionApi;
 
+    /**
+     * 设备责任人条件生成器配置
+     * key: 主表名
+     * value: 条件生成函数 (参数1: 表别名, 参数2: 用户ID, 返回: 设备责任人条件表达式)
+     */
+    private final Map<String, BiFunction<Alias, Long, Expression>> deviceOwnerConditions = new HashMap<>();
+
     /**
      * 基于部门的表字段配置
      * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。
@@ -150,6 +156,17 @@ public class DeptDataPermissionRule implements DataPermissionRule {
         return new ParenthesedExpressionList(new OrExpression(deptExpression, userExpression));
     }
 
+    /**
+     * 添加设备责任人条件生成器
+     *
+     * @param mainTable 主表名
+     * @param conditionGenerator 条件生成函数
+     */
+    public void addDeviceOwnerCondition(String mainTable, BiFunction<Alias, Long, Expression> conditionGenerator) {
+        deviceOwnerConditions.put(mainTable, conditionGenerator);
+        TABLE_NAMES.add(mainTable);
+    }
+
     private Expression buildDeptExpression(String tableName, Alias tableAlias, Set<Long> deptIds) {
         // 如果不存在配置,则无需作为条件
         String columnName = deptColumns.get(tableName);
@@ -171,12 +188,45 @@ public class DeptDataPermissionRule implements DataPermissionRule {
         if (Boolean.FALSE.equals(self)) {
             return null;
         }
+
+        List<Expression> expressions = new ArrayList<>();
+
         String columnName = userColumns.get(tableName);
-        if (StrUtil.isEmpty(columnName)) {
+
+        BiFunction<Alias, Long, Expression> deviceOwnerConditionGenerator = deviceOwnerConditions.get(tableName);
+        // 原始用户条件
+        Expression userExpression = null;
+
+        if (StrUtil.isNotEmpty(columnName)) {
+            userExpression = new EqualsTo(
+                    MyBatisUtils.buildColumn(tableName, tableAlias, columnName),
+                    new LongValue(userId)
+            );
+            expressions.add(userExpression);
+        }
+
+        // 设备责任人条件
+        Expression deviceOwnerExpression = null;
+        if (deviceOwnerConditionGenerator != null) {
+            deviceOwnerExpression = deviceOwnerConditionGenerator.apply(tableAlias, userId);
+            if (ObjUtil.isNotEmpty(deviceOwnerExpression)) {
+                expressions.add(deviceOwnerExpression);
+            }
+        }
+
+        // 组合条件
+        if (expressions.isEmpty()) {
             return null;
+        } else if (expressions.size() == 1) {
+            return expressions.get(0);
+        } else {
+            // 使用 OR 连接多个条件
+            Expression result = expressions.get(0);
+            for (int i = 1; i < expressions.size(); i++) {
+                result = new ParenthesedExpressionList(new OrExpression(result, expressions.get(i)));
+            }
+            return result;
         }
-        // 拼接条件
-        return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), new LongValue(userId));
     }
 
     // ==================== 添加配置 ====================

+ 125 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/config/PmsDataPermissionConfiguration.java

@@ -18,14 +18,25 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.maintenance.IotMaintenancePlan
 import cn.iocoder.yudao.module.supplier.dal.dataobject.product.SupplierDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Alias;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.util.function.BiFunction;
+
 /**
  * system 模块的数据权限 Configuration
  *
  * @author 芋道源码
  */
+@Slf4j
 @Configuration(proxyBeanMethods = false)
 public class PmsDataPermissionConfiguration {
 
@@ -64,7 +75,121 @@ public class PmsDataPermissionConfiguration {
             // user
             rule.addUserColumn(AdminUserDO.class, "id");
             rule.addUserColumn(SupplierDO.class, "creator");
+
+            // 为工单主表添加设备责任人条件
+            rule.addDeviceOwnerCondition("rq_iot_main_work_order",
+                    DeviceOwnerConditionBuilder.createConditionGenerator(
+                            new DeviceOwnerConditionBuilder.DeviceOwnerConfig()
+                                    .mainTable("rq_iot_main_work_order")
+                                    .mainTableIdColumn("id")
+                                    .bomTable("rq_iot_main_work_order_bom")
+                                    .bomTableMainIdColumn("work_order_id")
+                                    .bomTableDeviceIdColumn("device_id")
+                                    .devicePersonTable("rq_iot_device_person")
+                                    .devicePersonIdColumn("device_id")
+                                    .devicePersonPersonIdColumn("person_id")
+                    )
+            );
         };
     }
 
+    // 设备责任人条件构建器
+    public static class DeviceOwnerConditionBuilder {
+        // 配置对象
+        @Getter
+        @Setter
+        @NoArgsConstructor
+        public static class DeviceOwnerConfig {
+            private String mainTable;              // 主表名
+            private String mainTableIdColumn = "id"; // 主表ID字段名,默认为"id"
+            private String bomTable;                // 业务子表名
+            private String bomTableMainIdColumn;    // 业务子表关联主表的字段名
+            private String bomTableDeviceIdColumn;  // 业务子表关联设备表的字段名
+            private String devicePersonTable;       // 设备责任人表名
+            private String devicePersonIdColumn;    // 设备责任人表关联设备的字段名
+            private String devicePersonPersonIdColumn; // 设备责任人表责任人ID字段名
+
+            // 流畅API设置方法
+            public DeviceOwnerConfig mainTable(String table) {
+                this.mainTable = table;
+                return this;
+            }
+
+            public DeviceOwnerConfig mainTableIdColumn(String column) {
+                this.mainTableIdColumn = column;
+                return this;
+            }
+
+            public DeviceOwnerConfig bomTable(String table) {
+                this.bomTable = table;
+                return this;
+            }
+
+            public DeviceOwnerConfig bomTableMainIdColumn(String column) {
+                this.bomTableMainIdColumn = column;
+                return this;
+            }
+
+            public DeviceOwnerConfig bomTableDeviceIdColumn(String column) {
+                this.bomTableDeviceIdColumn = column;
+                return this;
+            }
+
+            public DeviceOwnerConfig devicePersonTable(String table) {
+                this.devicePersonTable = table;
+                return this;
+            }
+
+            public DeviceOwnerConfig devicePersonIdColumn(String column) {
+                this.devicePersonIdColumn = column;
+                return this;
+            }
+
+            public DeviceOwnerConfig devicePersonPersonIdColumn(String column) {
+                this.devicePersonPersonIdColumn = column;
+                return this;
+            }
+        }
+
+        /**
+         * 创建设备责任人条件生成器
+         *
+         * @param config 设备责任人配置
+         * @return 条件生成函数
+         */
+        public static BiFunction<Alias, Long, Expression> createConditionGenerator(
+                DeviceOwnerConfig config) {
+            return (tableAlias, userId) -> {
+                try {
+                    // 处理表别名:如果别名存在则使用别名,否则使用表名
+                    String tablePrefix = tableAlias != null ? tableAlias.getName() : config.mainTable;
+
+                    // 构建列名表达式(使用表别名或表名)
+                    String columnExpression = tablePrefix + "." + config.mainTableIdColumn;
+
+                    // 构建完整的SQL条件表达式
+                    String expressionSQL = String.format(
+                            "%s IN (" +
+                                    "SELECT %s FROM %s " +
+                                    "WHERE %s IN (" +
+                                    "   SELECT %s FROM %s WHERE %s = %d" +
+                                    ")" +
+                                    ")",
+                            columnExpression,
+                            config.bomTableMainIdColumn, config.bomTable,
+                            config.bomTableDeviceIdColumn,
+                            config.devicePersonIdColumn, config.devicePersonTable, config.devicePersonPersonIdColumn,
+                            userId
+                    );
+
+                    // 解析为JSqlParser表达式
+                    return CCJSqlParserUtil.parseCondExpression(expressionSQL);
+                } catch (JSQLParserException e) {
+                    log.error("构建设备责任人条件失败", e);
+                    return null;
+                }
+            };
+        }
+    }
+
 }