yzx 2 mēneši atpakaļ
vecāks
revīzija
0bb29803e5

+ 1 - 1
src/views/bpm/disbursement/AuthorityForm.vue

@@ -320,7 +320,7 @@ const handleDateChange = (row: UserRow) => {
 
 // 更新过期状态和剩余天数
 const updateExpirationStatus = (row: UserRow) => {
-  if (row.maturityTime) {
+  if (row.maturityTime != null && row.maturityTime !== 0) {
     const maturityDate = typeof row.maturityTime === 'string' 
       ? new Date(row.maturityTime)
       : row.maturityTime;

+ 195 - 4
src/views/layer/gisname/AuthorityForm.vue

@@ -94,6 +94,19 @@
             :formatter="dateFormatter"
             min-width="150"
         />
+        <!-- 字段权限 -->
+        <el-table-column label="字段权限" width="120" align="center">
+          <template #default="scope">
+            <el-button 
+              type="primary" 
+              link 
+              @click="openFieldPermissions(scope.row)"
+              :disabled="isSpecialUser(scope.row) || !scope.row.userId"
+            >
+              <Icon icon="ep:key" />配置
+            </el-button>
+          </template>
+        </el-table-column>
         <!-- 操作列 -->
         <el-table-column label="操作" width="100" align="center" fixed="right">
           <template #default="scope">
@@ -130,15 +143,73 @@
       <el-button @click="submitForm" type="primary" :loading="loading">提交</el-button>
     </template>
   </Dialog>
+
+  <!-- 字段权限配置抽屉 -->
+  <el-drawer
+    v-model="fieldPermissionDrawer"
+    title="字段权限配置"
+    size="50%"
+    append-to-body
+  >
+    <template #default>
+      <div class="p-4">
+        <el-alert
+          title="配置字段级权限控制"
+          type="info"
+          description="开启或关闭用户对特定字段的访问权限。"
+          show-icon
+          :closable="false"
+          class="mb-4"
+        />
+        
+        <!-- 快速设置按钮组 -->
+        <div class="mb-4 flex gap-2">
+          <el-button type="primary" @click="applyAllPermissions(true)">
+            全部启用
+          </el-button>
+          <el-button @click="applyAllPermissions(false)">
+            全部禁用
+          </el-button>
+        </div>
+        
+        <!-- 字段权限加载状态 -->
+        <div v-if="fieldLoading" class="flex justify-center items-center py-10">
+          <el-icon class="is-loading"><Loading /></el-icon>
+          <span class="ml-2">正在加载字段信息...</span>
+        </div>
+        
+        <!-- 字段权限表格 -->
+        <el-table v-else :data="layerFields" border style="width: 100%">
+          <el-table-column prop="fieldName" label="字段名称" min-width="180" />
+          <el-table-column label="是否启用" width="120" align="center">
+            <template #default="scope">
+              <el-switch v-model="scope.row.enabled" />
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </template>
+    <template #footer>
+      <div class="flex justify-between items-center">
+        <span class="text-gray-500 text-sm">修改后的权限将在提交时生效</span>
+        <div>
+          <el-button @click="fieldPermissionDrawer = false">取消</el-button>
+          <el-button type="primary" @click="saveFieldPermissions">确认</el-button>
+        </div>
+      </div>
+    </template>
+  </el-drawer>
 </template>
 
 <script setup lang="ts">
-import { GisFormApi } from '@/api/gislayer/gisform/index.ts'
+import { GisFormApi } from '@/api/gislayer/gisform/index'
 import * as UserApi from "@/api/system/user";
 import { dateFormatter } from "@/utils/formatTime";
 import { ref, reactive, onMounted } from "vue";
 import { useMessage } from "@/hooks/web/useMessage";
 import { ElMessage, ElTable, ElTableColumn } from 'element-plus'
+import { getgisAttr } from "@/api/layer/gisname"; // 导入获取图层属性的API
+import { Loading } from '@element-plus/icons-vue'
 
 /** 图层权限表单 */
 defineOptions({ name: 'LayerAuthorityForm' })
@@ -146,6 +217,12 @@ const message = useMessage() // 消息弹窗
 const loading = ref(false) // 列表的加载中
 const total = ref(0) // 列表的总页数
 
+// 字段权限相关接口
+interface FieldPermission {
+  fieldName: string;   // 字段名称
+  enabled: boolean;    // 是否启用(开/关状态)
+}
+
 interface UserRow {
   id?: number         // 记录ID
   userId?: number      // 用户ID
@@ -160,6 +237,7 @@ interface UserRow {
   daysLeft?: number    // 剩余天数
   layer?: string       // 图层名称
   isDeleted?: boolean  // 是否标记为删除(本地状态)
+  fieldPermissions?: Record<string, boolean> // 字段权限(字段名 -> 是否启用)
 }
 
 const dialogVisible = ref(false)
@@ -167,6 +245,13 @@ const list = ref<UserRow[]>([])          // 表格数据
 const userOptions = ref<UserApi.UserVO[]>([]) // 用户选项
 const deletedUserIds = ref<number[]>([]) // 存储已标记为删除的用户ID
 
+// 字段权限相关
+const fieldPermissionDrawer = ref(false) // 字段权限抽屉是否可见
+const currentUser = ref<UserRow | null>(null) // 当前正在编辑字段权限的用户
+const layerFields = ref<FieldPermission[]>([]) // 图层字段列表
+const fieldLoading = ref(false) // 字段加载状态
+const currentLayer = ref<string>('') // 当前图层名称
+
 const queryParams = reactive({
   addUserId: undefined,
   layer: undefined,
@@ -237,6 +322,22 @@ const getList = async () => {
         item.onlyRead = 3;
       }
       
+      // 解析字段权限
+      if (item.fieldPermissions) {
+        try {
+          // 如果是字符串,则解析JSON
+          if (typeof item.fieldPermissions === 'string') {
+            item.fieldPermissions = JSON.parse(item.fieldPermissions);
+          }
+        } catch (error) {
+          console.error('解析字段权限失败:', error);
+          item.fieldPermissions = {}; // 使用空对象作为默认值
+        }
+      } else {
+        // 如果没有字段权限,使用空对象
+        item.fieldPermissions = {};
+      }
+      
       // 更新过期状态和剩余天数
       updateExpirationStatus(item);
       
@@ -273,12 +374,16 @@ const handleUserChange = (row: UserRow) => {
         // 更新过期状态
         updateExpirationStatus(row);
       }
+      
+      // 默认字段权限为空,将在打开字段权限配置时动态加载
+      row.fieldPermissions = {};
     }
   } else {
     // 清空其他字段
     row.deptName = undefined
     row.mobile = undefined
     row.nickname = undefined
+    row.fieldPermissions = undefined
   }
   updateSubmitData()
 }
@@ -313,6 +418,79 @@ const updateExpirationStatus = (row: UserRow) => {
   }
 }
 
+// 打开字段权限配置抽屉
+const openFieldPermissions = async (row: UserRow) => {
+  if (!row.userId || !queryParams.layer) return;
+  
+  currentUser.value = row;
+  currentLayer.value = queryParams.layer as string;
+  fieldPermissionDrawer.value = true;
+  
+  // 加载字段信息
+  fieldLoading.value = true;
+  try {
+    // 从getgisAttr API获取字段列表
+    const fieldList = await getgisAttr(currentLayer.value);
+    
+    // 将返回的字段列表处理为我们需要的格式
+    if (fieldList && Array.isArray(fieldList)) {
+      // 如果用户已有字段权限配置,合并现有配置
+      if (row.fieldPermissions) {
+        // 创建新的字段权限列表
+        layerFields.value = fieldList.map(fieldName => ({
+          fieldName,
+          enabled: row.fieldPermissions?.[fieldName] ?? true // 默认启用
+        }));
+      } else {
+        // 如果没有现有配置,所有字段默认启用
+        layerFields.value = fieldList.map(fieldName => ({
+          fieldName,
+          enabled: true
+        }));
+      }
+    } else {
+      // 如果API返回的不是数组,显示警告
+      layerFields.value = [];
+      message.warning('无法获取图层字段信息');
+    }
+  } catch (error) {
+    console.error('获取字段信息失败:', error);
+    message.error('获取字段信息失败');
+    layerFields.value = [];
+  } finally {
+    fieldLoading.value = false;
+  }
+}
+
+// 批量应用权限设置
+const applyAllPermissions = (enabled: boolean) => {
+  layerFields.value.forEach(field => {
+    field.enabled = enabled;
+  });
+}
+
+// 保存字段权限配置
+const saveFieldPermissions = () => {
+  if (!currentUser.value) return;
+  
+  // 将字段权限列表转换为字段->布尔值的映射
+  const fieldPermissions: Record<string, boolean> = {};
+  layerFields.value.forEach(field => {
+    fieldPermissions[field.fieldName] = field.enabled;
+  });
+  
+  // 保存到当前用户
+  currentUser.value.fieldPermissions = fieldPermissions;
+  
+  // 关闭抽屉
+  fieldPermissionDrawer.value = false;
+  
+  // 更新提交数据
+  updateSubmitData();
+  
+  message.success('字段权限配置已保存,将在提交时生效');
+}
+
 // 添加行
 const handleAddRow = () => {
   // 默认7天后过期的日期
@@ -325,7 +503,8 @@ const handleAddRow = () => {
     onlyRead: 3, // 默认只读 
     valid: true,
     daysLeft: 7,
-    layer: queryParams.layer
+    layer: queryParams.layer,
+    fieldPermissions: {} // 空字段权限,将在打开字段权限配置时动态加载
   };
   
   list.value.push(newRow);
@@ -363,11 +542,17 @@ const updateSubmitData = () => {
         maturityTime = maturityTime.toISOString().substring(0, 19).replace('T', ' ');
       }
       
+      // 字段权限JSON字符串 - 如果存在则序列化,否则使用空对象
+      const fieldPermissionsJson = row.fieldPermissions 
+        ? JSON.stringify(row.fieldPermissions) 
+        : '{}';
+      
       return {
         userId: row.userId,
         maturityTime: maturityTime,
         onlyRead: row.onlyRead || 3,
-        layer: queryParams.layer
+        layer: queryParams.layer,
+        fieldPermissions: fieldPermissionsJson // 添加字段权限JSON
       };
     });
     
@@ -414,11 +599,17 @@ const submitForm = async () => {
           maturityTime = maturityTime.toISOString().substring(0, 19).replace('T', ' ');
         }
         
+        // 字段权限JSON字符串
+        const fieldPermissionsJson = row.fieldPermissions 
+          ? JSON.stringify(row.fieldPermissions) 
+          : '{}';
+        
         return {
           userId: row.userId,
           maturityTime: maturityTime,
           onlyRead: row.onlyRead || 3,
-          layer: queryParams.layer
+          layer: queryParams.layer,
+          fieldPermissions: fieldPermissionsJson // 添加字段权限JSON
         };
       });