ky 8 miesięcy temu
rodzic
commit
75cdd34f75

+ 35 - 0
build.bat

@@ -0,0 +1,35 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: 检查dist目录是否存在
+if not exist "dist\" (
+    echo 错误:当前目录下未找到dist文件夹
+    pause
+    exit /b 1
+)
+
+:: 检查是否已存在dist.zip,若存在则删除
+if exist "dist.zip" (
+    echo 发现已存在dist.zip,正在删除...
+    del /f /q "dist.zip" >nul 2>&1
+    if errorlevel 1 (
+        echo 错误:无法删除已存在的dist.zip(可能被占用)
+        pause
+        exit /b 1
+    )
+)
+
+:: 使用PowerShell压缩整个dist文件夹(包含文件夹本身)为dist.zip
+echo 正在压缩dist文件夹(包含文件夹本身)...
+powershell -Command "Compress-Archive -Path 'dist' -DestinationPath 'dist.zip' -Force" >nul 2>&1
+
+:: 检查压缩是否成功
+if exist "dist.zip" (
+    echo 压缩成功!dist.zip已生成(包含完整dist文件夹)
+) else (
+    echo 压缩失败,请检查权限或目录内容
+    pause
+    exit /b 1
+)
+
+endlocal

+ 4 - 0
src/api/OM-record.ts

@@ -68,6 +68,8 @@ export interface OMRecordPageQuery extends PageQuery {
     operationStaff?: string;
     folderId?: number
     updateDateRange?: string[];
+    onlyViewMe?: number;
+
 }
 
 /** 运维管理表单对象 */
@@ -113,4 +115,6 @@ export interface OMRecordPageVO {
     createTime?: Date;
     /** 更新时间 */
     updateTime?: Date;
+
+
 }

+ 28 - 0
src/api/mine-demand.ts

@@ -44,6 +44,15 @@ class MineDemandAPI {
         window.location.href = `${import.meta.env.VITE_APP_BASE_API}/api/v1/demand-file/download/${id}`;
     }
 
+    static export(queryParams?: MineDemandPageQuery) {
+        return request({
+            url: `${MINEDEMAND_BASE_URL}/export`,
+            method: "get",
+            params: queryParams,
+            responseType: "arraybuffer",
+        });
+    }
+
     static deleteDemandFile(id?: number) {
         return request({
             url: `/api/v1/demand-file/delete/${id}`,
@@ -89,6 +98,8 @@ export interface MineDemandPageQuery extends PageQuery {
     mineName?: string;
     /** 需求名称 */
     demandName?: string;
+
+    type?: number;
     /** 需求提交人 */
     submitter?: string;
     /** 运维人员 */
@@ -113,7 +124,10 @@ export interface MineDemandPageQuery extends PageQuery {
     backendStaff?: string;
     /** 后端版本号 */
     backendVersion?: string;
+
     completeStatus?: number;
+
+    onlyViewMe?: number;
 }
 
 /** 煤矿需求管理表单对象 */
@@ -125,6 +139,8 @@ export interface MineDemandForm {
     mineName?: string;
     /** 需求名称 */
     demandName?: string;
+
+    type?: number;
     /** 需求提交人 */
     submitter?: string;
     /** 运维人员 */
@@ -157,6 +173,16 @@ export interface MineDemandForm {
     backendProgress?: string;
 
     operationProgress?: string;
+
+
+    frontendComplex?: number;
+    backendComplex?: number;
+
+    frontendCompleteTime?: Date;
+    backendCompleteTime?: Date;
+
+    frontendStartTime?: Date;
+    backendStartTime?: Date;
 }
 
 export interface DemandFileForm {
@@ -174,6 +200,8 @@ export interface MineDemandPageVO {
     area?: string;
     /** 矿名 */
     mineName?: string;
+
+    type?: number;
     /** 需求名称 */
     demandName?: string;
     /** 需求提交人 */

+ 3 - 13
src/components/Dictionary/index.vue

@@ -1,17 +1,7 @@
 <template>
-  <el-select
-    v-model="selectedValue"
-    :placeholder="placeholder"
-    :disabled="disabled"
-    clearable
-    @change="handleChange"
-  >
-    <el-option
-      v-for="option in options"
-      :key="option.value"
-      :label="option.label"
-      :value="option.value"
-    />
+  <el-select v-model="selectedValue" :placeholder="placeholder" :disabled="disabled" clearable style="width: 197px;"
+    @change="handleChange">
+    <el-option v-for="option in options" :key="option.value" :label="option.label" :value="option.value" />
   </el-select>
 </template>
 

+ 73 - 0
src/directive/deploy.bat

@@ -0,0 +1,73 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: ==============================================
+:: 配置信息 - 请根据实际情况修改以下参数
+:: ==============================================
+:: 项目根目录
+set PROJECT_DIR=D:\workspace\java\vpm-boot
+:: 打包后JAR文件的本地路径
+set JAR_LOCAL_PATH=%PROJECT_DIR%\target\dist\vpm-boot.jar
+
+:: SFTP/SSH服务器配置(SFTP基于SSH,共用22端口)
+set SERVER_IP=182.92.126.35
+set SSH_PORT=22
+set SSH_USER=root  :: 替换为实际SSH用户名
+set SSH_PASS=Ccri123456  :: 替换为实际SSH密码
+set REMOTE_DIR=/data/jar/upload-admin
+set REMOTE_SCRIPT=/data/jar/upload-admin/restart.sh
+
+:: PuTTY工具路径(不含引号,若路径有空格才需要引号)
+set PUTTY_PATH=D:\develop\putty  :: 注意:这里去掉了路径中的引号
+set PSCP="%PUTTY_PATH%\pscp.exe"  :: 用引号包裹完整路径(处理空格)
+set PLINK="%PUTTY_PATH%\plink.exe"
+
+
+
+
+:: ==============================================
+:: 步骤2: SFTP上传(修复路径引用)
+:: ==============================================
+echo.
+echo [2/3] 开始SFTP上传JAR文件(端口%SSH_PORT%)...
+
+:: 检查pscp.exe是否存在
+if not exist %PSCP% (
+    echo 错误:未找到pscp.exe!请确认路径:%PSCP%
+    exit /b 1
+)
+
+:: 执行SFTP上传(注意参数格式)
+%PSCP% -P %SSH_PORT% -pw %SSH_PASS% -batch "%JAR_LOCAL_PATH%" %SSH_USER%@%SERVER_IP%:%REMOTE_DIR%
+
+if %ERRORLEVEL% neq 0 (
+    echo 错误:SFTP上传失败!请检查账号、密码或远程目录权限
+    exit /b 1
+)
+echo [2/3] SFTP上传成功,目标路径:%SERVER_IP%:%REMOTE_DIR%
+
+
+:: ==============================================
+:: 步骤3: 远程执行脚本(修复路径引用)
+:: ==============================================
+echo.
+echo [3/3] 开始远程执行重启脚本...
+
+:: 检查plink.exe是否存在
+if not exist %PLINK% (
+    echo 错误:未找到plink.exe!请确认路径:%PLINK%
+    exit /b 1
+)
+
+:: 远程执行命令
+%PLINK% -ssh %SSH_USER%@%SERVER_IP% -P %SSH_PORT% -pw %SSH_PASS% -batch "sh %REMOTE_SCRIPT%"
+
+if %ERRORLEVEL% neq 0 (
+    echo 错误:远程执行%REMOTE_SCRIPT%失败!
+    exit /b 1
+)
+
+echo [3/3] 远程脚本执行成功
+echo.
+echo 所有操作完成!
+endlocal

+ 6 - 18
src/layout/components/NavBar/components/NavbarAction.vue

@@ -5,17 +5,11 @@
       <menu-search />
       <!--全屏 -->
       <div class="nav-action-item" @click="toggle">
-        <svg-icon
-          :icon-class="isFullscreen ? 'fullscreen-exit' : 'fullscreen'"
-        />
+        <svg-icon :icon-class="isFullscreen ? 'fullscreen-exit' : 'fullscreen'" />
       </div>
 
       <!-- 布局大小 -->
-      <el-tooltip
-        :content="$t('sizeSelect.tooltip')"
-        effect="dark"
-        placement="bottom"
-      >
+      <el-tooltip :content="$t('sizeSelect.tooltip')" effect="dark" placement="bottom">
         <size-select class="nav-action-item" />
       </el-tooltip>
 
@@ -23,27 +17,21 @@
       <lang-select class="nav-action-item" />
 
       <!-- 消息通知 -->
-      <notice class="nav-action-item" />
+      <!-- <notice class="nav-action-item" /> -->
     </template>
 
     <!-- 用户头像 -->
     <el-dropdown class="nav-action-item" trigger="click">
       <div class="flex-center h100% p10px">
-        <img
-          :src="userStore.user.avatar + '?imageView2/1/w/80/h/80'"
-          class="rounded-full mr-10px w24px h24px"
-        />
-        <span>{{ userStore.user.username }}</span>
+        <img :src="userStore.user.avatar + '?imageView2/1/w/80/h/80'" class="rounded-full mr-10px w24px h24px" />
+        <span>{{ userStore.user.nickname }}</span>
       </div>
       <template #dropdown>
         <el-dropdown-menu>
           <el-dropdown-item @click="handleOpenUserProfile">
             {{ $t("navbar.profile") }}
           </el-dropdown-item>
-          <a
-            target="_blank"
-            href="https://gitee.com/youlaiorg/vue3-element-admin"
-          >
+          <a target="_blank" href="https://gitee.com/youlaiorg/vue3-element-admin">
             <el-dropdown-item>{{ $t("navbar.gitee") }}</el-dropdown-item>
           </a>
           <a target="_blank" href="https://juejin.cn/post/7228990409909108793">

+ 221 - 46
src/views/mine-demand/index.vue

@@ -99,7 +99,9 @@
               <el-input v-model="queryParams.backendStaff" placeholder="请输入后端人员" clearable class="search-input"
                 size="default" />
             </el-form-item>
-
+            <!-- <el-form-item label="需求类型" prop="type">
+              <dictionary type="button" code="demand-type" placeholder="请选择需求类型" v-model="queryParams.type" />
+            </el-form-item> -->
             <el-form-item class="form-actions">
               <el-button type="primary" @click="handleQuery()" size="default">
                 <i-ep-search class="icon-mr" />搜索
@@ -113,7 +115,7 @@
 
         <el-card shadow="never" class="table-container">
           <template #header>
-            <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
+            <!-- <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
               <i-ep-plus />
               新增
             </el-button>
@@ -121,6 +123,33 @@
               @click="handleDelete()"><i-ep-delete />
               删除
             </el-button>
+            <div>
+              <el-button class="ml-3" @click="handleExport">
+                <template #icon><i-ep-download /></template>
+    导出
+    </el-button>
+    </div> -->
+
+            <div class="flex-x-between">
+              <div>
+                <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
+                  <i-ep-plus />
+                  新增
+                </el-button>
+                <el-button v-hasPerm="['system:mineDemand:delete']" type="danger" :disabled="removeIds.length === 0"
+                  @click="handleDelete()"><i-ep-delete />
+                  删除
+                </el-button>
+              </div>
+              <div>
+
+
+                <el-button class="ml-3" @click="handleExport">
+                  <template #icon><i-ep-download /></template>
+                  导出
+                </el-button>
+              </div>
+            </div>
           </template>
           <div class="breadcrumb-card">
             <!-- 使用flex布局并控制整体对齐方式 -->
@@ -142,8 +171,13 @@
                   </el-breadcrumb-item>
                 </el-breadcrumb>
               </div>
-
               <!-- 右侧:单选按钮组 -->
+              <div style="white-space: nowrap;  border-radius: 6px; ">
+                <el-radio-group v-model="queryParams.onlyViewMe" @change="handleQuery" fill="var(--el-color-success)">
+                  <el-radio-button label="全部" :value="0" style=" border-radius: 4px; transition: all 0.2s ease;" />
+                  <el-radio-button label="只看我" :value="1" style=" border-radius: 4px; transition: all 0.2s ease;" />
+                </el-radio-group>
+              </div>
               <div style="white-space: nowrap;  border-radius: 6px; ">
                 <el-radio-group v-model="queryParams.completeStatus" @change="handleQuery">
                   <el-radio-button label="全部" :value="0" style=" border-radius: 4px; transition: all 0.2s ease;" />
@@ -152,17 +186,26 @@
                   <el-radio-button label="未完成" :value="3" style=" border-radius: 4px; transition: all 0.2s ease;" />
                 </el-radio-group>
               </div>
+
             </el-row>
           </div>
 
           <el-table ref="dataTableRef" v-loading="loading" :data="pageData" highlight-current-row border
             @selection-change="handleSelectionChange">
             <el-table-column fixed type="selection" width="55" align="center" />
-            <el-table-column fixed key="area" label="所属片区" prop="area" min-width="150" align="center" />
-            <el-table-column fixed key="mineName" label="矿名" prop="mineName" min-width="150" align="center" />
-            <el-table-column fixed key="demandName" label="需求名称" prop="demandName" min-width="150" align="center"
+            <el-table-column fixed key="area" label="片区" prop="area" min-width="75" align="center"
+              show-overflow-tooltip />
+            <el-table-column fixed key="mineName" label="矿名" prop="mineName" min-width="100" align="center"
+              show-overflow-tooltip />
+            <el-table-column fixed key="demandName" label="需求名称" prop="demandName" min-width="200" align="center"
+              show-overflow-tooltip />
+            <el-table-column fixed align="center" label="需求类型" width="170">
+              <template #default="scope">
+                <DictLabel code="demand-type" v-model="scope.row.type" />
+              </template>
+            </el-table-column>
+            <el-table-column key="submitter" label="需求提交人" prop="submitter" min-width="150" align="center"
               show-overflow-tooltip />
-            <el-table-column key="submitter" label="需求提交人" prop="submitter" min-width="150" align="center" />
             <el-table-column key="operationStaff" label="运维人员" prop="operationStaff" min-width="150" align="center" />
             <el-table-column key="ventilationTechStaff" label="通防技术人员" prop="ventilationTechStaff" min-width="150"
               align="center" />
@@ -305,7 +348,7 @@
       </template>
     </el-dialog>
     <el-dialog v-model="progressVisible" title="进度管理" width="800px" @close="handleCloseDialog" draggable>
-      <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px"
+      <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px" v-loading="detailLoading"
         :autosize="{ minRows: 4, maxRows: 88 }">
         <el-form-item label="前端">
           <el-input type="textarea" v-model="formData.frontendProgress" placeholder="前端进度"
@@ -329,31 +372,53 @@
     </el-dialog>
     <!-- 煤矿需求管理表单弹窗 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" @close="handleCloseDialog" draggable>
-      <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px">
-        <el-form-item label="所属片区" prop="area">
-          <el-input v-model="formData.area" placeholder="所属片区" />
-        </el-form-item>
-        <el-form-item label="矿名" prop="mineName">
-          <el-input v-model="formData.mineName" placeholder="矿名" />
-        </el-form-item>
+      <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px" v-loading="detailLoading">
+        <el-row>
+          <el-form-item label="所属片区" prop="area">
+            <el-input v-model="formData.area" placeholder="所属片区" />
+          </el-form-item>
+          <el-form-item label="矿名" prop="mineName">
+            <el-input v-model="formData.mineName" placeholder="矿名" />
+          </el-form-item>
+        </el-row>
+
         <el-form-item label="需求名称" prop="demandName">
           <el-input v-model="formData.demandName" placeholder="需求名称" />
         </el-form-item>
-        <el-form-item label="需求提交人" prop="submitter">
-          <el-input v-model="formData.submitter" placeholder="需求提交人" />
-        </el-form-item>
-        <el-form-item label="运维人员" prop="operationStaff">
-          <el-input v-model="formData.operationStaff" placeholder="运维人员" />
-        </el-form-item>
-        <el-form-item label="通防技术人员" prop="ventilationTechStaff">
-          <el-input v-model="formData.ventilationTechStaff" placeholder="通防技术人员" />
-        </el-form-item>
-        <el-form-item label="前端人员" prop="frontendStaff">
-          <el-input v-model="formData.frontendStaff" placeholder="前端人员" />
-        </el-form-item>
-        <el-form-item label="后端人员" prop="backendStaff">
-          <el-input v-model="formData.backendStaff" placeholder="后端人员" />
-        </el-form-item>
+
+        <el-row>
+          <el-form-item label="需求类型" prop="type">
+            <dictionary type="button" code="demand-type" v-model="formData.type" />
+          </el-form-item>
+          <el-form-item label="需求提交人" prop="submitter">
+            <el-input v-model="formData.submitter" placeholder="需求提交人" />
+          </el-form-item>
+        </el-row>
+
+        <el-row>
+          <el-form-item label="运维人员" prop="operationStaff">
+            <el-input v-model="formData.operationStaff" placeholder="运维人员" />
+          </el-form-item>
+          <el-form-item label="通防技术人员" prop="ventilationTechStaff">
+            <el-input v-model="formData.ventilationTechStaff" placeholder="通防技术人员" />
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item label="前端人员" prop="frontendStaff">
+            <el-input v-model="formData.frontendStaff" placeholder="前端人员" :disabled="!frontendStuffEdit" />
+          </el-form-item>
+          <el-form-item label="后端人员" prop="backendStaff">
+            <el-input v-model="formData.backendStaff" placeholder="后端人员" :disabled="!backendStuffEdit" />
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item label="前端复杂度" prop="frontendComplex">
+            <el-input type="number" v-model="formData.frontendComplex" placeholder="前端复杂度" :disabled="!complexEdit" />
+          </el-form-item>
+          <el-form-item label="后端复杂度" prop="backendComplex">
+            <el-input type="number" v-model="formData.backendComplex" placeholder="后端复杂度" :disabled="!complexEdit" />
+          </el-form-item>
+        </el-row>
         <el-form-item label="前端版本号" prop="frontendVersion">
           <el-input type="textarea" v-model="formData.frontendVersion" placeholder="前端版本号"
             :autosize="{ minRows: 2, maxRows: 88 }" />
@@ -362,23 +427,46 @@
           <el-input type="textarea" v-model="formData.backendVersion" placeholder="后端版本号"
             :autosize="{ minRows: 2, maxRows: 88 }" />
         </el-form-item>
-        <el-row> <el-form-item label="提交时间" prop="submitTime">
-            <el-date-picker class="!w-[240px]" v-model="formData.submitTime" type="date" placeholder="提交时间"
-              value-format="YYYY-MM-DD" />
+        <el-row>
+          <el-form-item label="提交时间" prop="submitTime">
+            <el-date-picker v-model="formData.submitTime" type="date" placeholder="提交时间" value-format="YYYY-MM-DD" />
           </el-form-item>
           <el-form-item label="计划完成时间" prop="plannedCompleteTime">
-            <el-date-picker class="!w-[240px]" v-model="formData.plannedCompleteTime" type="date" placeholder="计划完成时间"
+            <el-date-picker v-model="formData.plannedCompleteTime" type="date" placeholder="计划完成时间"
               value-format="YYYY-MM-DD" />
-          </el-form-item></el-row>
-        <el-row> <el-form-item label="实际开始时间" prop="actualStartTime">
-            <el-date-picker class="!w-[240px]" v-model="formData.actualStartTime" type="date" placeholder="实际开始时间"
+          </el-form-item>
+        </el-row>
+
+        <el-row>
+          <el-form-item label="实际开始时间" prop="actualStartTime">
+            <el-date-picker v-model="formData.actualStartTime" type="date" placeholder="实际开始时间"
               value-format="YYYY-MM-DD" />
           </el-form-item>
           <el-form-item label="实际完成时间" prop="actualCompleteTime">
-            <el-date-picker class="!w-[240px]" v-model="formData.actualCompleteTime" type="date" placeholder="实际完成时间"
+            <el-date-picker v-model="formData.actualCompleteTime" type="date" placeholder="实际完成时间"
               value-format="YYYY-MM-DD" />
-          </el-form-item></el-row>
-
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item label="前端开始时间" prop="frontendStartTime">
+            <el-date-picker v-model="formData.frontendStartTime" type="date" placeholder="前端开始时间"
+              value-format="YYYY-MM-DD" />
+          </el-form-item>
+          <el-form-item label="后端开始时间" prop="backendStartTime">
+            <el-date-picker v-model="formData.backendStartTime" type="date" placeholder="后端开始时间"
+              value-format="YYYY-MM-DD" />
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item label="前端完成时间" prop="frontendCompleteTime">
+            <el-date-picker v-model="formData.frontendCompleteTime" type="date" placeholder="前端完成时间"
+              value-format="YYYY-MM-DD" />
+          </el-form-item>
+          <el-form-item label="后端完成时间" prop="backendCompleteTime">
+            <el-date-picker v-model="formData.backendCompleteTime" type="date" placeholder="后端完成时间"
+              value-format="YYYY-MM-DD" />
+          </el-form-item>
+        </el-row>
         <el-form-item label="需求说明" prop="demandDescription">
           <el-input type="textarea" v-model="formData.demandDescription" placeholder="需求说明"
             :autosize="{ minRows: 4, maxRows: 88 }" />
@@ -405,10 +493,52 @@ import { InfoFilled } from '@element-plus/icons-vue'
 import MineDemandAPI, { MineDemandPageVO, MineDemandForm, MineDemandPageQuery, DemandFileForm } from "@/api/mine-demand";
 import { Action, ElLoading } from "element-plus";
 import FolderAPI, { SysFolder } from "@/api/folder";
-import { Tree } from "element-plus/es/components/tree-v2/src/types";
-import Node from "element-plus/es/components/cascader-panel/src/node";
-import { sample } from "lodash";
+
 import { ArrowRight } from '@element-plus/icons-vue'
+import UserAPI, { type UserInfo } from "@/api/user";
+
+// ----------------------------------------------------------------------
+const userInfo = ref<UserInfo>({
+  roles: [],
+  perms: [],
+});
+
+const complexEdit = ref(false)
+const frontendStuffEdit = ref(false)
+const backendStuffEdit = ref(false)
+const isTeamLeader = ref(false)
+/** 加载用户信息 */
+const loadUserInfo = async () => {
+  const data = await UserAPI.getInfo();
+  userInfo.value = data;
+  console.log(userInfo);
+  let roles = userInfo.value.roles
+  if (roles && roles.includes('TEAM_LEADER')) {
+    isTeamLeader.value = true
+    complexEdit.value = true
+  }
+};
+const devStuffEditStatus = () => {
+  if (formData.frontendStaff) {
+    if (isTeamLeader.value) {
+      frontendStuffEdit.value = true
+    } else {
+      frontendStuffEdit.value = false
+    }
+  } else {
+    frontendStuffEdit.value = true
+  }
+  if (formData.backendStaff) {
+    if (isTeamLeader.value) {
+      backendStuffEdit.value = true
+    } else {
+      backendStuffEdit.value = false
+    }
+  } else {
+    backendStuffEdit.value = true
+  }
+}
+
 // ----------------------------------------------------------------------
 const folderType = ref<string>("demand");
 const curFolderNodeId = ref<number>(1)
@@ -421,6 +551,8 @@ const folderDialog = reactive({
   visible: false,
   msg: ""
 });
+
+
 function getFolderNode() {
   dirTreeLoading.value = true
   FolderAPI.getFolderTree(folderType.value).then(data => {
@@ -511,11 +643,13 @@ const loading = ref(false);
 const removeIds = ref<number[]>([]);
 const total = ref(0);
 const uploadLoading = ref(false);
+const detailLoading = ref(false)
 const queryParams = reactive<MineDemandPageQuery>({
   pageNum: 1,
   pageSize: 10,
   folderId: 1,
-  completeStatus: 0
+  completeStatus: 0,
+  onlyViewMe: 0,
 });
 const breadList = ref<any>([])
 
@@ -595,6 +729,7 @@ function handleResetQuery() {
   queryParams.pageSize = pageSize
   queryParams.completeStatus = completeStatus
   queryParams.folderId = treeRef.value?.getCurrentKey()
+  queryParams.onlyViewMe = 0
   handleQuery();
 }
 function handleFileDialog(id: number) {
@@ -688,21 +823,30 @@ function handleSelectionChange(selection: any) {
 /** 打开煤矿需求管理弹窗 */
 function handleOpenDialog(id?: number) {
   dialog.visible = true;
+  detailLoading.value = true
+
   if (id) {
     dialog.title = "修改煤矿需求管理";
     MineDemandAPI.getFormData(id).then((data) => {
       Object.assign(formData, data);
+      devStuffEditStatus()
+      detailLoading.value = false
     });
   } else {
     dialog.title = "新增煤矿需求管理";
+    detailLoading.value = false
+    devStuffEditStatus()
   }
 }
 
 function handleProgressDialog(id?: number) {
   progressVisible.value = true;
+  detailLoading.value = true
   if (id) {
     MineDemandAPI.getFormData(id).then((data) => {
       Object.assign(formData, data);
+      devStuffEditStatus()
+      detailLoading.value = false
     });
   }
 }
@@ -751,7 +895,35 @@ function handleCloseDialog() {
   dataFormRef.value.resetFields();
   dataFormRef.value.clearValidate();
   formData.id = undefined;
+  Object.keys(formData).forEach(key => {
+    formData[key] = undefined;
+  });
 }
+
+function handleExport() {
+  MineDemandAPI.export(queryParams).then((response: any) => {
+    const fileData = response.data;
+    const fileName = decodeURI(
+      response.headers["content-disposition"].split(";")[1].split("=")[1]
+    );
+    const fileType =
+      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
+
+    const blob = new Blob([fileData], { type: fileType });
+    const downloadUrl = window.URL.createObjectURL(blob);
+
+    const downloadLink = document.createElement("a");
+    downloadLink.href = downloadUrl;
+    downloadLink.download = fileName;
+
+    document.body.appendChild(downloadLink);
+    downloadLink.click();
+
+    document.body.removeChild(downloadLink);
+    window.URL.revokeObjectURL(downloadUrl);
+  });
+}
+
 function getBreadcrumb(id: number) {
   FolderAPI.getAncestor(id).then((data) => {
     breadList.value = data
@@ -790,8 +962,11 @@ function handleDelete(id?: number) {
 }
 
 onMounted(() => {
+  console.log(111);
+
+  loadUserInfo()
   handleQuery();
-  getFolderNode()
+  getFolderNode();
 });
 </script>
 <style scoped>
@@ -1027,7 +1202,7 @@ onMounted(() => {
 .custom-tree-container {
   width: 100%;
   box-sizing: border-box;
-  height: 820px;
+  height: 815px;
   overflow: hidden;
   overflow-x: auto;
 }

+ 33 - 16
src/views/om-record/index.vue

@@ -89,7 +89,6 @@
           </el-form>
         </div>
         <el-card shadow="never" class="table-container">
-
           <template #header>
             <el-button v-hasPerm="['system:oMRecord:add']" type="success" @click="handleOpenDialog()">
               <i-ep-plus />
@@ -100,28 +99,45 @@
               删除
             </el-button>
           </template>
+
           <div class="breadcrumb-card">
-            <el-row class="breadcrumb-container align-items-center">
-              <!-- 首页图标 -->
-              <el-icon class="home-icon">
-                <Fold />
-              </el-icon>
-              <!-- 面包屑导航 -->
-              <el-breadcrumb separator-class="breadcrumb-separator" :separator-icon="ArrowRight">
-                <el-breadcrumb-item v-for="(item, index) in breadList" :key="index"
-                  :class="{ 'last-item': index === breadList.length - 1 }" @click="handleBreadcrumbClick(item.id)">
-                  {{ item.name }}
-                </el-breadcrumb-item>
-              </el-breadcrumb>
+            <!-- 使用flex布局并控制整体对齐方式 -->
+            <el-row class="breadcrumb-container align-items-center"
+              style="display: flex; justify-content: flex-start; width: 100%; gap: 64px; ">
+              <!-- 左侧:首页图标 + 面包屑 -->
+              <div style="display: flex; align-items: center; gap: 8px;">
+                <!-- 首页图标 -->
+                <el-icon class="home-icon" style="font-size: 18px; cursor: pointer;">
+                  <Fold />
+                </el-icon>
+
+                <!-- 面包屑导航 -->
+                <el-breadcrumb separator-class="breadcrumb-separator" :separator-icon="ArrowRight">
+                  <el-breadcrumb-item v-for="(item, index) in breadList" :key="index"
+                    :class="{ 'last-item': index === breadList.length - 1 }" @click="handleBreadcrumbClick(item.id)"
+                    style="cursor: pointer;">
+                    {{ item.name }}
+                  </el-breadcrumb-item>
+                </el-breadcrumb>
+              </div>
+              <!-- 右侧:单选按钮组 -->
+              <div style="white-space: nowrap;  border-radius: 6px; ">
+                <el-radio-group v-model="queryParams.onlyViewMe" @change="handleQuery" fill="var(--el-color-success)">
+                  <el-radio-button label="全部" :value="0" style=" border-radius: 4px; transition: all 0.2s ease;" />
+                  <el-radio-button label="只看我" :value="1" style=" border-radius: 4px; transition: all 0.2s ease;" />
+                </el-radio-group>
+              </div>
             </el-row>
           </div>
+
           <el-table ref="dataTableRef" v-loading="loading" :data="pageData" highlight-current-row border
             @selection-change="handleSelectionChange">
             <el-table-column type="selection" width="55" align="center" />
             <el-table-column key="projectName" label="项目" prop="projectName" min-width="100" align="center"
               show-overflow-tooltip />
-            <el-table-column key="operationStaff" label="运维人员" prop="operationStaff" min-width="50" align="center" />
-            <el-table-column key="updateDate" label="更新日期" prop="updateDate" min-width="75" align="center" />
+            <el-table-column key="operationStaff" label="运维人员" prop="operationStaff" min-width="100" align="center"
+              show-overflow-tooltip />
+            <el-table-column key="updateDate" label="更新日期" prop="updateDate" min-width="100" align="center" />
             <el-table-column key="frontendVersion" label="前端包版本" prop="frontendVersion" min-width="100"
               show-overflow-tooltip align="center" />
             <el-table-column key="backendVersion" label="后端包版本" prop="backendVersion" min-width="100" align="center"
@@ -328,6 +344,7 @@ const queryParams = reactive<OMRecordPageQuery>({
   pageNum: 1,
   pageSize: 10,
   folderId: 1001,
+  onlyViewMe: 0,
 });
 
 // 运维管理表格数据
@@ -531,7 +548,7 @@ onMounted(() => {
 .custom-tree-container {
   width: 100%;
   box-sizing: border-box;
-  height: 710px;
+  height: 720px;
   overflow: hidden;
   overflow-x: auto;
 }