Преглед изворни кода

Merge branch 'qhse_file' of shuzhihua/pms-iot-vue into master

yanghao пре 1 недеља
родитељ
комит
2fb794d3c1
4 измењених фајлова са 160 додато и 31 уклоњено
  1. 1 1
      .env.local
  2. 3 1
      src/utils/dict.ts
  3. 72 0
      src/views/pms/device/DeviceFileLibrary.vue
  4. 84 29
      src/views/pms/qhse/safety/index.vue

+ 1 - 1
.env.local

@@ -3,7 +3,7 @@ NODE_ENV=development
 
 VITE_DEV=true
 
-# 请求路径  http://192.168.188.86:48080  https://iot.deepoil.cc:5443  http://172.26.0.56:48080  http://192.168.188.198:48080
+# 请求路径  http://192.168.188.60:48080  https://iot.deepoil.cc:5443  http://172.26.0.56:48080  http://192.168.188.198:48080
 VITE_BASE_URL='https://iot.deepoil.cc:5443'
 
 # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务

+ 3 - 1
src/utils/dict.ts

@@ -332,7 +332,9 @@ export enum DICT_TYPE {
   QHSE_HAZARD_SOURCE = 'hazard_soure',
   QHSE_DEVICE_CERT_TYPE = 'qhse_device_cert_type',
   QHSE_DETECT_CYCLE = 'detect_cycle',
-  QHSE_TRAIN_CYCLE = 'qhse_train_cycle'
+  QHSE_TRAIN_CYCLE = 'qhse_train_cycle',
+  QHSE_CHECK_TYPE = 'qhse_hazard_type',
+  QHSE_FIX_DATE = 'qhse_check_period'
 }
 
 export function realValue(type: any, value: string) {

+ 72 - 0
src/views/pms/device/DeviceFileLibrary.vue

@@ -38,6 +38,23 @@
         </el-form>
       </div>
 
+      <div class="library-navigation">
+        <!-- <el-button link type="primary" class="library-back-btn" :disabled="!canGoBack" @click="goBack">
+          <Icon icon="ep:back" />
+          返回上一级
+        </el-button> -->
+        <el-breadcrumb separator=">" class="library-breadcrumb">
+          <el-breadcrumb-item
+            v-for="(item, index) in breadcrumbs"
+            :key="item.key"
+            class="library-breadcrumb__item"
+            :class="{ 'is-current': index === breadcrumbs.length - 1 }"
+            @click="handleBreadcrumbClick(index)">
+            {{ item.name }}
+          </el-breadcrumb-item>
+        </el-breadcrumb>
+      </div>
+
       <ZmTable
         :data="fileList"
         class="library-table"
@@ -164,6 +181,7 @@ const queryParams = reactive({
 
 const rootName = computed(() => props.deviceName || '设备资料')
 const breadcrumbs = ref<BreadcrumbItem[]>([{ id: null, name: '设备资料', key: 'root' }])
+const canGoBack = computed(() => breadcrumbs.value.length > 1)
 const currentFolderName = computed(() => {
   return breadcrumbs.value[breadcrumbs.value.length - 1]?.name || rootName.value
 })
@@ -218,6 +236,22 @@ const resetQuery = () => {
   loadFiles()
 }
 
+const handleBreadcrumbClick = async (index: number) => {
+  if (index < 0 || index >= breadcrumbs.value.length) return
+  if (index === breadcrumbs.value.length - 1) return
+
+  queryParams.filename = ''
+  queryParams.pageNo = 1
+  breadcrumbs.value = breadcrumbs.value.slice(0, index + 1)
+  queryParams.classId = breadcrumbs.value[index]?.id ?? rootClassId.value
+  await loadFiles()
+}
+
+const goBack = async () => {
+  if (!canGoBack.value) return
+  await handleBreadcrumbClick(breadcrumbs.value.length - 2)
+}
+
 const enterFolder = async (row: FileRecord) => {
   if (!row.id) return
 
@@ -380,6 +414,39 @@ watch(
   width: 260px;
 }
 
+.library-navigation {
+  display: flex;
+  gap: 12px;
+  margin-bottom: 14px;
+  align-items: center;
+  flex-wrap: wrap;
+}
+
+.library-back-btn {
+  padding: 0;
+}
+
+.library-breadcrumb {
+  min-width: 0;
+}
+
+.library-breadcrumb__item {
+  cursor: pointer;
+}
+
+.library-breadcrumb__item.is-current {
+  cursor: default;
+}
+
+.library-breadcrumb__item.is-current :deep(.el-breadcrumb__inner) {
+  color: var(--el-color-primary);
+  font-weight: 600;
+}
+
+.library-breadcrumb__item:not(.is-current):hover :deep(.el-breadcrumb__inner) {
+  color: var(--el-color-primary);
+}
+
 .library-table {
   --el-table-header-bg-color: var(--el-fill-color-lighter);
   --el-table-row-hover-bg-color: #f6faff;
@@ -505,5 +572,10 @@ watch(
   .library-search-input {
     width: 100%;
   }
+
+  .library-navigation {
+    align-items: flex-start;
+    flex-direction: column;
+  }
 }
 </style>

+ 84 - 29
src/views/pms/qhse/safety/index.vue

@@ -10,10 +10,10 @@
             <el-input placeholder="请输入地址" v-model="queryParams.address" />
           </el-form-item>
 
-          <el-form-item label="来源" prop="source">
+          <el-form-item label="检查主体" prop="source">
             <el-select
               v-model="queryParams.source"
-              placeholder="请选择来源"
+              placeholder="请选择检查主体"
               clearable
               style="width: 150px">
               <el-option
@@ -136,13 +136,24 @@
 
           <zm-table-column label="单位" align="center" prop="deptName" />
           <zm-table-column label="类型" align="center" prop="classifyName" />
-          <zm-table-column label="来源" align="center" min-width="90">
+          <zm-table-column label="检查主体" align="center" min-width="90">
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.QHSE_HAZARD_SOURCE" :value="scope.row.source" />
             </template>
           </zm-table-column>
 
-          <zm-table-column label="地点" align="center" prop="address" />
+          <zm-table-column label="检查类型" align="center" min-width="90">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.QHSE_CHECK_TYPE" :value="scope.row.checkType" />
+            </template>
+          </zm-table-column>
+          <zm-table-column prop="createTime" label="排查时间" align="center" min-width="150">
+            <template #default="{ row }">
+              {{ formatDate(row.checkTime) }}
+            </template>
+          </zm-table-column>
+
+          <zm-table-column label="排查地点" align="center" prop="address" />
 
           <zm-table-column label="存在问题" align="center" prop="problem" />
 
@@ -162,6 +173,11 @@
           </zm-table-column>
           <zm-table-column label="整改人" align="center" prop="correctPersonName" />
           <zm-table-column label="整改要求" align="center" prop="correctStandard" />
+          <zm-table-column label="整改期限" align="center" min-width="90">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.QHSE_FIX_DATE" :value="scope.row.checkPeriod" />
+            </template>
+          </zm-table-column>
 
           <zm-table-column label="整改情况" align="center" prop="rectifyDesc" />
 
@@ -180,12 +196,6 @@
             </template>
           </zm-table-column>
 
-          <zm-table-column prop="createTime" label="排查时间" align="center" min-width="150">
-            <template #default="{ row }">
-              {{ formatDate(row.checkTime) }}
-            </template>
-          </zm-table-column>
-
           <zm-table-column label="状态" align="center" width="90">
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.QHSE_HAZARD_STATUS" :value="scope.row.status" />
@@ -250,10 +260,10 @@
       :rules="formRules"
       label-width="120px"
       v-loading="formLoading">
-      <el-form-item label="隐患排查来源" prop="source">
+      <el-form-item label="检查主体" prop="source">
         <el-select
           v-model="formData.source"
-          placeholder="请选择隐患排查来源"
+          placeholder="请选择检查主体"
           clearable
           @change="handleChange">
           <el-option
@@ -263,6 +273,15 @@
             :value="dict.value" />
         </el-select>
       </el-form-item>
+      <el-form-item label="检查类型" prop="checkType">
+        <el-select v-model="formData.checkType" placeholder="请选择检查类型" clearable>
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_CHECK_TYPE)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="所属队伍" prop="deptId">
         <el-tree-select
           clearable
@@ -276,14 +295,14 @@
           filterable
           placeholder="请选择所属队伍" />
       </el-form-item>
-      <el-form-item label="隐患排查类型" prop="classify">
+      <el-form-item label="隐患类别" prop="classify">
         <el-tree-select
           style="width: 500px; overflow: auto"
           v-model="formData.classify"
           :data="deptTree"
           :props="defaultProps"
           :check-strictly="false"
-          placeholder="请选择隐患排查类型"
+          placeholder="请选择隐患类别"
           value-key="id" />
       </el-form-item>
 
@@ -295,6 +314,16 @@
           placeholder="请选择排查时间"
           style="width: 100%" />
       </el-form-item>
+      <el-form-item label="排查地点" prop="address">
+        <el-input v-model="formData.address" placeholder="请输入地点" />
+      </el-form-item>
+      <el-form-item label="存在问题" prop="problem">
+        <el-input
+          type="textarea"
+          :rows="2"
+          v-model="formData.problem"
+          placeholder="请输入存在问题" />
+      </el-form-item>
 
       <el-form-item label="整改要求" prop="correctStandard">
         <el-input
@@ -304,6 +333,20 @@
           placeholder="请输入整改要求" />
       </el-form-item>
 
+      <el-form-item label="整改期限" prop="checkPeriod">
+        <el-select
+          v-model="formData.checkPeriod"
+          placeholder="请选择整改期限"
+          clearable
+          @change="handleCheckPeriodChange">
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_FIX_DATE)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+
       <el-form-item label="整改人" prop="correctPerson">
         <el-select
           v-model="formData.correctPerson"
@@ -319,18 +362,6 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item label="地点" prop="address">
-        <el-input v-model="formData.address" placeholder="请输入地点" />
-      </el-form-item>
-
-      <el-form-item label="存在问题" prop="problem">
-        <el-input
-          type="textarea"
-          :rows="2"
-          v-model="formData.problem"
-          placeholder="请输入存在问题" />
-      </el-form-item>
-
       <el-form-item label="照片" prop="hazardFile">
         <UploadFile
           v-model="formData.hazardFile"
@@ -501,9 +532,19 @@ const formData = ref({
   source: '',
   checkTime: '',
   correctStandard: '',
-  correctPerson: ''
+  correctPerson: '',
+  checkType: '',
+  checkPeriod: ''
 })
 
+const validateRemark = (_rule, value, callback) => {
+  if (formData.value.checkPeriod === 'other' && !String(value || '').trim()) {
+    callback(new Error('整改期限为其他时,请在备注中注明时间要求'))
+    return
+  }
+  callback()
+}
+
 // 表单验证规则
 const formRules = {
   deptId: [{ required: true, message: '所在部门不能为空', trigger: 'blur' }],
@@ -514,10 +555,13 @@ const formRules = {
   rectifyFile: [{ required: true, message: '整改附件不能为空', trigger: 'blur' }],
   hazardFile: [{ required: true, message: '照片不能为空', trigger: 'blur' }],
   classify: [{ required: true, message: '分类不能为空', trigger: 'blur' }],
-  source: [{ required: true, message: '来源不能为空', trigger: 'blur' }],
+  source: [{ required: true, message: '检查主体不能为空', trigger: 'blur' }],
   checkTime: [{ required: true, message: '检查时间不能为空', trigger: 'blur' }],
   correctStandard: [{ required: true, message: '整改标准不能为空', trigger: 'blur' }],
-  correctPerson: [{ required: true, message: '整改人不能为空', trigger: 'blur' }]
+  correctPerson: [{ required: true, message: '整改人不能为空', trigger: 'blur' }],
+  checkType: [{ required: true, message: '检查类型不能为空', trigger: 'blur' }],
+  checkPeriod: [{ required: true, message: '整改期限不能为空', trigger: 'change' }],
+  remark: [{ validator: validateRemark, trigger: ['blur', 'change'] }]
 }
 
 /** 查询列表 */
@@ -598,6 +642,17 @@ const handleChange = (val) => {
     formData.value.deptId = ''
   }
 }
+
+const handleCheckPeriodChange = async (val) => {
+  if (val === 'other') {
+    await ElMessageBox.alert('整改期限为其他,请在备注中注明时间要求', '提示', {
+      confirmButtonText: '确定',
+      type: 'warning'
+    })
+  }
+
+  formRef.value?.validateField('remark')
+}
 // 显示新增对话框
 const handleAdd = async () => {
   isEdit.value = false