فهرست منبع

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

yanghao 2 روز پیش
والد
کامیت
330647f152

+ 4 - 2
src/layout/components/Menu/src/components/useRenderMenuItem.tsx

@@ -127,10 +127,12 @@ export const useRenderMenuItem = () =>
                 '安全培训计划',
                 '安全培训档案',
 
-                '隐患排查',
+                '隐患排查治理',
                 '隐患排查分类',
                 '隐患排查记录',
-                '应急体系',
+                '应急体系管理',
+                '排查治理分类',
+                '排查治理记录',
                 '预案台账',
                 '应急物资',
                 '海外应急处置',

+ 7 - 7
src/router/modules/remaining.ts

@@ -2296,26 +2296,26 @@ const remainingRouter: AppRouteRecordRaw[] = [
         }
       },
       {
-        path: 'month_report/add',
+        path: 'month_report/add/:id',
         component: () => import('@/views/pms/qhse/monthlyReport/MonthlyReportAdd.vue'),
         name: 'MonthlyReportAdd',
         meta: {
           noCache: true,
           canto: true,
           icon: 'ep:plus',
-          title: '新增月报',
+          title: '月报填报',
           hidden: true
         }
       },
       {
-        path: 'month_report/edit/:id',
-        component: () => import('@/views/pms/qhse/monthlyReport/MonthlyReportEdit.vue'),
-        name: 'MonthlyReportEdit',
+        path: 'month_report/detail/:id',
+        component: () => import('@/views/pms/qhse/monthlyReport/MonthlyReport.vue'),
+        name: 'MonthlyReportInfo',
         meta: {
           noCache: true,
           canto: true,
-          icon: 'ep:edit',
-          title: '编辑月报',
+          icon: 'ep:view',
+          title: '月报详情',
           hidden: true
         }
       }

+ 797 - 0
src/views/pms/qhse/monthlyReport/MonthlyReport.vue

@@ -0,0 +1,797 @@
+<template>
+  <div class="monthly-report-add">
+    <el-form
+      ref="formRef"
+      :model="reportInfo"
+      :rules="formRules"
+      label-width="auto"
+      class="report-form">
+      <!-- 1. 基本信息 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:document" class="mr-5px" />
+            <span>基本信息</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="部门名称" prop="deptId">
+              <el-tree-select
+                clearable
+                disabled
+                v-model="reportInfo.deptId"
+                :data="deptList2"
+                :props="defaultProps"
+                :check-strictly="false"
+                node-key="id"
+                filterable
+                placeholder="请选择所属队伍" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="月报标题" prop="title">
+              <el-input disabled v-model="reportInfo.title" placeholder="请输入月报标题" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="年月" prop="yearMonths">
+              <el-date-picker
+                disabled
+                v-model="reportInfo.yearMonths"
+                type="month"
+                placeholder="选择年月"
+                format="YYYY-MM"
+                value-format="YYYY-MM"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 2. 人工时和安全行驶公里数 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:user" class="mr-5px" />
+            <span>人工时和安全行驶公里数</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="员工人数" prop="employee">
+              <el-input-number
+                v-model="reportInfo.employee"
+                :min="0"
+                disabled
+                :precision="0"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="分包商人数" prop="subcontractors">
+              <el-input-number
+                v-model="reportInfo.subcontractors"
+                :min="0"
+                disabled
+                :precision="0"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="安全行驶里程数(公里)" prop="drivingMileage">
+              <el-input-number
+                v-model="reportInfo.drivingMileage"
+                :min="0"
+                disabled
+                :precision="2"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="总人工时数(小时)" prop="totalManHours">
+              <el-input-number
+                v-model="reportInfo.totalManHours"
+                :min="0"
+                disabled
+                :precision="2"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 3. QHSE被动性指标统计 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:warning" class="mr-5px" />
+            <span>QHSE被动性指标统计</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="无事故累计天数" prop="withoutAccident">
+              <el-input-number
+                v-model="reportInfo.withoutAccident"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="死亡事故(起)" prop="fatality">
+              <el-input-number
+                v-model="reportInfo.fatality"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="损失工时事故(起)" prop="injury">
+              <el-input-number
+                v-model="reportInfo.injury"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="工作受限事件(起)" prop="restrictedCase">
+              <el-input-number
+                v-model="reportInfo.restrictedCase"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="医疗处理事件(起)" prop="medicalCase">
+              <el-input-number
+                v-model="reportInfo.medicalCase"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="急救箱事件(起)" prop="firstAidCase">
+              <el-input-number
+                v-model="reportInfo.firstAidCase"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="交通事故(起)" prop="vehicleAccident">
+              <el-input-number
+                v-model="reportInfo.vehicleAccident"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="未遂事件(起)" prop="nearMiss">
+              <el-input-number
+                v-model="reportInfo.nearMiss"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="泄漏事件(起)" prop="spill">
+              <el-input-number
+                v-model="reportInfo.spill"
+                :min="0"
+                disabled
+                :precision="0"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="违反保命规则的次数(次)" prop="lifeSavingRules">
+              <el-input-number
+                v-model="reportInfo.lifeSavingRules"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 4. QHSE主动性指标统计 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:checked" class="mr-5px" />
+            <span>QHSE主动性指标统计</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="班前会(次)" prop="toolboxTalk">
+              <el-input-number
+                v-model="reportInfo.toolboxTalk"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE管理委员会会议(次)" prop="committeeMeeting">
+              <el-input-number
+                v-model="reportInfo.committeeMeeting"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE月度例会(次)" prop="monthlyMeeting">
+              <el-input-number
+                v-model="reportInfo.monthlyMeeting"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="公司级隐患排查(次)" prop="companyHazard">
+              <el-input-number
+                v-model="reportInfo.companyHazard"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE检查(次)" prop="qhseInspection">
+              <el-input-number
+                v-model="reportInfo.qhseInspection"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="安全观察卡(张)" prop="socCards">
+              <el-input-number
+                v-model="reportInfo.socCards"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="工作许可审核(份)" prop="ptwAudit">
+              <el-input-number
+                v-model="reportInfo.ptwAudit"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="工作安全分析(次)" prop="jsa">
+              <el-input-number
+                v-model="reportInfo.jsa"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="演练次数" prop="drills">
+              <el-input-number
+                v-model="reportInfo.drills"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE培训次数" prop="training">
+              <el-input-number
+                v-model="reportInfo.training"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE培训人次" prop="participantsTraining">
+              <el-input-number
+                v-model="reportInfo.participantsTraining"
+                :min="0"
+                :precision="0"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="QHSE培训学时数(小时)" prop="trainingsHours">
+              <el-input-number
+                v-model="reportInfo.trainingsHours"
+                :min="0"
+                :precision="2"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 5. 环境数据 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:sunrise" class="mr-5px" />
+            <span>环境数据</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="水消耗(吨)" prop="waterConsumption">
+              <el-input-number
+                v-model="reportInfo.waterConsumption"
+                :min="0"
+                :precision="2"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="柴油消耗(升)" prop="dieselConsumption">
+              <el-input-number
+                v-model="reportInfo.dieselConsumption"
+                :min="0"
+                :precision="2"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="用电量(千瓦·小时)" prop="electricityConsumption">
+              <el-input-number
+                v-model="reportInfo.electricityConsumption"
+                :min="0"
+                :precision="2"
+                disabled
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
+            <el-form-item label="天然气消耗量(立方米)" prop="naturalGasConsumption">
+              <el-input-number
+                v-model="reportInfo.naturalGasConsumption"
+                :min="0"
+                disabled
+                :precision="2"
+                controls-position="right"
+                style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 6. 其他信息 -->
+      <el-card class="form-section" shadow="hover">
+        <template #header>
+          <div class="section-header">
+            <Icon icon="ep:info-filled" class="mr-5px" />
+            <span>其他信息</span>
+          </div>
+        </template>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="工单填报人" prop="dutyPerson">
+              <el-select
+                v-model="reportInfo.dutyPerson"
+                filterable
+                clearable
+                disabled
+                placeholder="请选择填报人"
+                style="width: 100%">
+                <el-option
+                  v-for="item in userList"
+                  :key="item.id"
+                  :label="item.nickname"
+                  :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="16">
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input
+                v-model="reportInfo.remark"
+                type="textarea"
+                disabled
+                :rows="4"
+                placeholder="请输入备注信息" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+
+      <!-- 操作按钮 -->
+      <div class="form-actions">
+        <el-button @click="handleCancel">返 回</el-button>
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import { useRouter, useRoute } from 'vue-router'
+import { FormInstance, FormRules } from 'element-plus'
+import { QhseMonthReportApi } from '@/api/pms/qhse'
+import { handleTree, defaultProps } from '@/utils/tree'
+import * as DeptApi from '@/api/system/dept'
+import * as UserApi from '@/api/system/user'
+import { getUserProfile } from '@/api/system/user/profile'
+import { useTagsViewStore } from '@/store/modules/tagsView'
+const { delView } = useTagsViewStore()
+
+defineOptions({ name: 'MonthlyReportAdd' })
+
+const router = useRouter()
+const route = useRoute()
+const message = useMessage()
+const deptList2 = ref<Tree[]>([]) // 树形结构
+const userList = ref<any[]>([])
+
+// 表单引用
+const formRef = ref<FormInstance>()
+const submitLoading = ref(false)
+
+// 表单数据
+let reportInfo = reactive({
+  title: '',
+  yearMonths: '',
+  deptId: 0,
+  employee: '0',
+  subcontractors: '0',
+  drivingMileage: '0',
+  totalManHours: '0',
+  withoutAccident: '0',
+  fatality: '0',
+  injury: '0',
+  restrictedCase: '0',
+  medicalCase: '0',
+  firstAidCase: '0',
+  vehicleAccident: '0',
+  nearMiss: '0',
+  spill: '0',
+  lifeSavingRules: '0',
+  toolboxTalk: '0',
+  committeeMeeting: '0',
+  monthlyMeeting: '0',
+  companyHazard: '0',
+  qhseInspection: '0',
+  socCards: '0',
+  ptwAudit: '0',
+  jsa: '0',
+  drills: '0',
+  training: '0',
+  participantsTraining: '0',
+  trainingsHours: '0',
+  waterConsumption: '0',
+  dieselConsumption: '0',
+  electricityConsumption: '0',
+  naturalGasConsumption: '0',
+  dutyPerson: 0,
+  remark: ''
+})
+
+// 表单校验规则
+const formRules = reactive<FormRules>({
+  title: [{ required: true, message: '月报标题不能为空', trigger: 'blur' }],
+  yearMonth: [{ required: true, message: '年月不能为空', trigger: 'change' }],
+  deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
+  dutyPerson: [{ required: true, message: '工单填报人不能为空', trigger: 'change' }]
+})
+
+// 部门名称显示
+const deptName = ref('')
+
+/** 提交表单 */
+const handleSubmit = async () => {
+  if (!formRef.value) return
+
+  // 校验表单
+  const valid = await formRef.value.validate()
+  if (!valid) return
+
+  submitLoading.value = true
+  try {
+    await QhseMonthReportApi.createQhseMonthReport(reportInfo)
+    message.success('新增成功')
+    // 返回列表页或上一页
+    router.back()
+  } catch (error) {
+    console.error('提交失败:', error)
+  } finally {
+    submitLoading.value = false
+  }
+}
+
+/** 取消 */
+const handleCancel = () => {
+  delView(unref(router.currentRoute))
+  router.push({ name: 'QhseMonthlyReport', params: {} })
+}
+
+const userInfo = ref<any>({})
+onMounted(async () => {
+  const users = await getUserProfile()
+  userInfo.value = users
+  deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
+  userList.value = await UserApi.selectedDeptsEmployee({
+    deptIds: userInfo.value.dept.id
+  })
+  const res = await QhseMonthReportApi.getQhseMonthReport(route.params.id)
+  const data = (res as any)?.data ?? res ?? {}
+
+  Object.assign(reportInfo, data)
+})
+</script>
+<style scoped lang="scss">
+.monthly-report-add {
+  padding: 12px;
+  min-height: 100vh;
+  background-color: #f5f7fa;
+
+  .report-form {
+    max-width: 1400px;
+    margin: 0 auto;
+
+    .form-section {
+      margin-bottom: 16px;
+      border-radius: 8px;
+
+      :deep(.el-card__header) {
+        padding: 12px 16px;
+        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+        color: white;
+        border-radius: 8px 8px 0 0;
+      }
+
+      :deep(.el-card__body) {
+        padding: 16px;
+      }
+
+      .section-header {
+        display: flex;
+        align-items: center;
+        font-size: 15px;
+        font-weight: 600;
+      }
+
+      :deep(.el-form-item) {
+        margin-bottom: 16px;
+      }
+
+      :deep(.el-form-item__label) {
+        font-size: 14px;
+        line-height: 1.5;
+      }
+
+      :deep(.el-input),
+      :deep(.el-input-number),
+      :deep(.el-date-editor) {
+        width: 100%;
+      }
+
+      :deep(.el-input-number) {
+        .el-input__inner {
+          text-align: left;
+        }
+      }
+    }
+
+    .form-actions {
+      display: flex;
+      justify-content: center;
+      gap: 12px;
+      padding: 16px 0;
+      margin-top: 16px;
+      background: white;
+      border-radius: 8px;
+      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+      position: sticky;
+      bottom: 0;
+      z-index: 10;
+
+      .el-button {
+        min-width: 100px;
+        flex: 1;
+        max-width: 150px;
+        height: 44px;
+        font-size: 15px;
+      }
+    }
+  }
+}
+
+// 移动端优化
+@media screen and (max-width: 768px) {
+  .monthly-report-add {
+    padding: 8px;
+
+    .report-form {
+      .form-section {
+        margin-bottom: 12px;
+
+        :deep(.el-card__header) {
+          padding: 10px 12px;
+        }
+
+        :deep(.el-card__body) {
+          padding: 12px;
+        }
+
+        .section-header {
+          font-size: 14px;
+        }
+
+        :deep(.el-form-item__label) {
+          font-size: 13px;
+          padding-right: 8px;
+        }
+
+        :deep(.el-input__inner),
+        :deep(.el-textarea__inner) {
+          font-size: 14px;
+          min-height: 40px;
+        }
+
+        :deep(.el-input-number) {
+          .el-input-number__decrease,
+          .el-input-number__increase {
+            width: 32px;
+            height: 40px;
+            line-height: 40px;
+          }
+
+          .el-input__inner {
+            height: 40px;
+            line-height: 40px;
+          }
+        }
+
+        :deep(.el-date-editor) {
+          .el-input__inner {
+            height: 40px;
+            line-height: 40px;
+          }
+        }
+      }
+
+      .form-actions {
+        padding: 12px;
+        gap: 10px;
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        margin: 0;
+        border-radius: 0;
+        box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
+
+        .el-button {
+          height: 44px;
+          font-size: 15px;
+        }
+      }
+    }
+  }
+}
+
+// 超小屏幕优化
+@media screen and (max-width: 480px) {
+  .monthly-report-add {
+    padding: 6px;
+
+    .report-form {
+      .form-section {
+        :deep(.el-card__body) {
+          padding: 10px;
+        }
+
+        :deep(.el-form-item) {
+          margin-bottom: 12px;
+        }
+
+        :deep(.el-form-item__label) {
+          font-size: 12px;
+        }
+
+        :deep(.el-input__inner),
+        :deep(.el-textarea__inner) {
+          font-size: 13px;
+        }
+      }
+    }
+  }
+}
+
+:deep(.el-input.is-disabled) {
+  .el-input__inner {
+    color: #606266 !important;
+    -webkit-text-fill-color: #606266 !important;
+  }
+}
+
+:deep(.el-textarea.is-disabled) {
+  .el-textarea__inner {
+    color: #606266 !important;
+    -webkit-text-fill-color: #606266 !important;
+  }
+}
+</style>

+ 113 - 104
src/views/pms/qhse/monthlyReport/MonthlyReportAdd.vue

@@ -2,7 +2,7 @@
   <div class="monthly-report-add">
     <el-form
       ref="formRef"
-      :model="formData"
+      :model="reportInfo"
       :rules="formRules"
       label-width="auto"
       class="report-form">
@@ -17,28 +17,28 @@
         <el-row :gutter="16">
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
             <el-form-item label="部门名称" prop="deptId">
-              <el-input
-                v-model="deptName"
-                placeholder="请选择部门"
-                readonly
-                @click="openDeptSelect">
-                <template #suffix>
-                  <Icon icon="ep:search" class="cursor-pointer" />
-                </template>
-              </el-input>
+              <el-tree-select
+                clearable
+                v-model="reportInfo.deptId"
+                :data="deptList2"
+                :props="defaultProps"
+                :check-strictly="false"
+                node-key="id"
+                filterable
+                placeholder="请选择所属队伍" />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
             <el-form-item label="月报标题" prop="title">
-              <el-input v-model="formData.title" placeholder="请输入月报标题" />
+              <el-input v-model="reportInfo.title" placeholder="请输入月报标题" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="16">
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="年月" prop="yearMonth">
+            <el-form-item label="年月" prop="yearMonths">
               <el-date-picker
-                v-model="formData.yearMonth"
+                v-model="reportInfo.yearMonths"
                 type="month"
                 placeholder="选择年月"
                 format="YYYY-MM"
@@ -61,7 +61,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="员工人数" prop="employee">
               <el-input-number
-                v-model="formData.employee"
+                v-model="reportInfo.employee"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -71,7 +71,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="分包商人数" prop="subcontractors">
               <el-input-number
-                v-model="formData.subcontractors"
+                v-model="reportInfo.subcontractors"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -81,7 +81,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="安全行驶里程数(公里)" prop="drivingMileage">
               <el-input-number
-                v-model="formData.drivingMileage"
+                v-model="reportInfo.drivingMileage"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -91,7 +91,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="总人工时数(小时)" prop="totalManHours">
               <el-input-number
-                v-model="formData.totalManHours"
+                v-model="reportInfo.totalManHours"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -113,7 +113,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="无事故累计天数" prop="withoutAccident">
               <el-input-number
-                v-model="formData.withoutAccident"
+                v-model="reportInfo.withoutAccident"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -123,7 +123,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="死亡事故(起)" prop="fatality">
               <el-input-number
-                v-model="formData.fatality"
+                v-model="reportInfo.fatality"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -133,7 +133,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="损失工时事故(起)" prop="injury">
               <el-input-number
-                v-model="formData.injury"
+                v-model="reportInfo.injury"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -143,7 +143,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="工作受限事件(起)" prop="restrictedCase">
               <el-input-number
-                v-model="formData.restrictedCase"
+                v-model="reportInfo.restrictedCase"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -155,7 +155,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="医疗处理事件(起)" prop="medicalCase">
               <el-input-number
-                v-model="formData.medicalCase"
+                v-model="reportInfo.medicalCase"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -165,7 +165,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="急救箱事件(起)" prop="firstAidCase">
               <el-input-number
-                v-model="formData.firstAidCase"
+                v-model="reportInfo.firstAidCase"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -175,7 +175,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="交通事故(起)" prop="vehicleAccident">
               <el-input-number
-                v-model="formData.vehicleAccident"
+                v-model="reportInfo.vehicleAccident"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -185,7 +185,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="未遂事件(起)" prop="nearMiss">
               <el-input-number
-                v-model="formData.nearMiss"
+                v-model="reportInfo.nearMiss"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -197,7 +197,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="泄漏事件(起)" prop="spill">
               <el-input-number
-                v-model="formData.spill"
+                v-model="reportInfo.spill"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -207,7 +207,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="违反保命规则的次数(次)" prop="lifeSavingRules">
               <el-input-number
-                v-model="formData.lifeSavingRules"
+                v-model="reportInfo.lifeSavingRules"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -229,7 +229,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="班前会(次)" prop="toolboxTalk">
               <el-input-number
-                v-model="formData.toolboxTalk"
+                v-model="reportInfo.toolboxTalk"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -239,7 +239,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE管理委员会会议(次)" prop="committeeMeeting">
               <el-input-number
-                v-model="formData.committeeMeeting"
+                v-model="reportInfo.committeeMeeting"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -249,7 +249,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE月度例会(次)" prop="monthlyMeeting">
               <el-input-number
-                v-model="formData.monthlyMeeting"
+                v-model="reportInfo.monthlyMeeting"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -259,7 +259,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="公司级隐患排查(次)" prop="companyHazard">
               <el-input-number
-                v-model="formData.companyHazard"
+                v-model="reportInfo.companyHazard"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -271,7 +271,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE检查(次)" prop="qhseInspection">
               <el-input-number
-                v-model="formData.qhseInspection"
+                v-model="reportInfo.qhseInspection"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -281,19 +281,21 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="安全观察卡(张)" prop="socCards">
               <el-input-number
-                v-model="formData.socCards"
+                v-model="reportInfo.socCards"
                 :min="0"
                 :precision="0"
                 controls-position="right"
+                disabled
                 style="width: 100%" />
             </el-form-item>
           </el-col>
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="工作许可审核(份)" prop="ptwAudit">
               <el-input-number
-                v-model="formData.ptwAudit"
+                v-model="reportInfo.ptwAudit"
                 :min="0"
                 :precision="0"
+                disabled
                 controls-position="right"
                 style="width: 100%" />
             </el-form-item>
@@ -301,9 +303,10 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="工作安全分析(次)" prop="jsa">
               <el-input-number
-                v-model="formData.jsa"
+                v-model="reportInfo.jsa"
                 :min="0"
                 :precision="0"
+                disabled
                 controls-position="right"
                 style="width: 100%" />
             </el-form-item>
@@ -313,7 +316,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="演练次数" prop="drills">
               <el-input-number
-                v-model="formData.drills"
+                v-model="reportInfo.drills"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -323,7 +326,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE培训次数" prop="training">
               <el-input-number
-                v-model="formData.training"
+                v-model="reportInfo.training"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -333,7 +336,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE培训人次" prop="participantsTraining">
               <el-input-number
-                v-model="formData.participantsTraining"
+                v-model="reportInfo.participantsTraining"
                 :min="0"
                 :precision="0"
                 controls-position="right"
@@ -343,7 +346,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="QHSE培训学时数(小时)" prop="trainingsHours">
               <el-input-number
-                v-model="formData.trainingsHours"
+                v-model="reportInfo.trainingsHours"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -365,7 +368,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="水消耗(吨)" prop="waterConsumption">
               <el-input-number
-                v-model="formData.waterConsumption"
+                v-model="reportInfo.waterConsumption"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -375,7 +378,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="柴油消耗(升)" prop="dieselConsumption">
               <el-input-number
-                v-model="formData.dieselConsumption"
+                v-model="reportInfo.dieselConsumption"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -385,7 +388,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="用电量(千瓦·小时)" prop="electricityConsumption">
               <el-input-number
-                v-model="formData.electricityConsumption"
+                v-model="reportInfo.electricityConsumption"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -395,7 +398,7 @@
           <el-col :xs="24" :sm="12" :md="6" :lg="6" :xl="6">
             <el-form-item label="天然气消耗量(立方米)" prop="naturalGasConsumption">
               <el-input-number
-                v-model="formData.naturalGasConsumption"
+                v-model="reportInfo.naturalGasConsumption"
                 :min="0"
                 :precision="2"
                 controls-position="right"
@@ -416,15 +419,18 @@
         <el-row :gutter="16">
           <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
             <el-form-item label="工单填报人" prop="dutyPerson">
-              <el-input
-                v-model="dutyPersonName"
+              <el-select
+                v-model="reportInfo.dutyPerson"
+                filterable
+                clearable
                 placeholder="请选择填报人"
-                readonly
-                @click="openUserSelect">
-                <template #suffix>
-                  <Icon icon="ep:search" class="cursor-pointer" />
-                </template>
-              </el-input>
+                style="width: 100%">
+                <el-option
+                  v-for="item in userList"
+                  :key="item.id"
+                  :label="item.nickname"
+                  :value="item.id" />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -432,7 +438,7 @@
           <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
             <el-form-item label="备注" prop="remark">
               <el-input
-                v-model="formData.remark"
+                v-model="reportInfo.remark"
                 type="textarea"
                 :rows="4"
                 placeholder="请输入备注信息" />
@@ -447,39 +453,37 @@
         <el-button type="primary" @click="handleSubmit" :loading="submitLoading"> 提交 </el-button>
       </div>
     </el-form>
-
-    <!-- 部门选择弹窗 -->
-    <DeptSelectForm ref="deptSelectFormRef" :multiple="false" @confirm="handleDeptConfirm" />
-
-    <!-- 用户选择弹窗 -->
-    <UserSelectForm ref="userSelectFormRef" @confirm="handleUserConfirm" />
   </div>
 </template>
 
 <script setup lang="ts">
 import { reactive, ref } from 'vue'
-import { useRouter } from 'vue-router'
+import { useRouter, useRoute } from 'vue-router'
 import { FormInstance, FormRules } from 'element-plus'
 import { QhseMonthReportApi } from '@/api/pms/qhse'
-// import DeptSelectForm from '@/components/DeptSelectForm/qhseDept.vue'
-import UserSelectForm from '@/components/UserSelectForm/index.vue'
 import { handleTree, defaultProps } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
-const deptList2 = ref<Tree[]>([]) // 树形结构
+import * as UserApi from '@/api/system/user'
+import { getUserProfile } from '@/api/system/user/profile'
+import { useTagsViewStore } from '@/store/modules/tagsView'
+const { delView } = useTagsViewStore()
 
 defineOptions({ name: 'MonthlyReportAdd' })
 
 const router = useRouter()
+const route = useRoute()
 const message = useMessage()
+const deptList2 = ref<Tree[]>([]) // 树形结构
+const userList = ref<any[]>([])
 
 // 表单引用
 const formRef = ref<FormInstance>()
 const submitLoading = ref(false)
 
 // 表单数据
-const formData = reactive({
+let reportInfo = reactive({
   title: '',
-  yearMonth: '',
+  yearMonths: '',
   deptId: 0,
   employee: '0',
   subcontractors: '0',
@@ -520,49 +524,43 @@ const formRules = reactive<FormRules>({
   title: [{ required: true, message: '月报标题不能为空', trigger: 'blur' }],
   yearMonth: [{ required: true, message: '年月不能为空', trigger: 'change' }],
   deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
-  dutyPerson: [{ required: true, message: '工单填报人不能为空', trigger: 'change' }]
+  dutyPerson: [{ required: true, message: '工单填报人不能为空', trigger: 'change' }],
+  employee: [{ required: true, message: '员工数不能为空', trigger: 'blur' }],
+  subcontractors: [{ required: true, message: '分包商人数不能为空', trigger: 'blur' }],
+  drivingMileage: [{ required: true, message: '行驶里程不能为空', trigger: 'blur' }],
+  totalManHours: [{ required: true, message: '总工时不能为空', trigger: 'blur' }],
+  withoutAccident: [{ required: true, message: '无事故累计天数不能为空', trigger: 'blur' }],
+  fatality: [{ required: true, message: '死亡不能为空', trigger: 'blur' }],
+  injury: [{ required: true, message: '损失工时事故不能为空', trigger: 'blur' }],
+  restrictedCase: [{ required: true, message: '受限事件不能为空', trigger: 'blur' }],
+  medicalCase: [{ required: true, message: '医疗事件不能为空', trigger: 'blur' }],
+  firstAidCase: [{ required: true, message: '急救事件不能为空', trigger: 'blur' }],
+  vehicleAccident: [{ required: true, message: '车辆事故不能为空', trigger: 'blur' }],
+  nearMiss: [{ required: true, message: '未遂事件次数不能为空', trigger: 'blur' }],
+  spill: [{ required: true, message: '泄漏事件次数不能为空', trigger: 'blur' }],
+  lifeSavingRules: [{ required: true, message: '违反保命规则的次数不能为空', trigger: 'blur' }],
+  toolboxTalk: [{ required: true, message: '班前会次不能为空', trigger: 'blur' }],
+  committeeMeeting: [{ required: true, message: '委员会会议不能为空', trigger: 'blur' }],
+  monthlyMeeting: [{ required: true, message: '月度会议不能为空', trigger: 'blur' }],
+  companyHazard: [{ required: true, message: '隐患排查次数不能为空', trigger: 'blur' }],
+  qhseInspection: [{ required: true, message: '请填写QHSE检查次数', trigger: 'blur' }],
+  socCards: [{ required: true, message: 'SOC 卡片不能为空', trigger: 'blur' }],
+  ptwAudit: [{ required: true, message: 'PTW 审核不能为空', trigger: 'blur' }],
+  jsa: [{ required: true, message: 'JSA 不能为空', trigger: 'blur' }],
+  drills: [{ required: true, message: '演练次数不能为空', trigger: 'blur' }],
+  training: [{ required: true, message: '培训次数不能为空', trigger: 'blur' }],
+  participantsTraining: [{ required: true, message: 'QHSE培训人次不能为空', trigger: 'blur' }],
+  waterConsumption: [{ required: true, message: '水耗不能为空', trigger: 'blur' }],
+  dieselConsumption: [{ required: true, message: '柴油耗能不能为空', trigger: 'blur' }],
+  electricityConsumption: [{ required: true, message: '电耗不能为空', trigger: 'blur' }],
+  naturalGasConsumption: [{ required: true, message: '天然气耗不能为空', trigger: 'blur' }],
+  trainingsHours: [{ required: true, message: '培训课时不能为空', trigger: 'blur' }],
+  yearMonths: [{ required: true, message: '年月不能为空', trigger: 'change' }]
 })
 
 // 部门名称显示
 const deptName = ref('')
 
-// 填报人名称显示
-const dutyPersonName = ref('')
-
-// 部门选择弹窗引用
-const deptSelectFormRef = ref()
-
-// 用户选择弹窗引用
-const userSelectFormRef = ref()
-
-/** 打开部门选择 */
-const openDeptSelect = () => {
-  deptSelectFormRef.value?.open()
-}
-
-/** 部门选择确认 */
-const handleDeptConfirm = async (deptList: any[]) => {
-  if (deptList && deptList.length > 0) {
-    const dept = deptList[0]
-    formData.deptId = dept.id
-    deptName.value = dept.name
-  }
-}
-
-/** 打开用户选择 */
-const openUserSelect = () => {
-  userSelectFormRef.value?.open()
-}
-
-/** 用户选择确认 */
-const handleUserConfirm = (userId: any, userList: any[]) => {
-  if (userList && userList.length > 0) {
-    const user = userList[0]
-    formData.dutyPerson = user.id
-    dutyPersonName.value = user.nickname
-  }
-}
-
 /** 提交表单 */
 const handleSubmit = async () => {
   if (!formRef.value) return
@@ -573,7 +571,7 @@ const handleSubmit = async () => {
 
   submitLoading.value = true
   try {
-    await QhseMonthReportApi.createQhseMonthReport(formData)
+    await QhseMonthReportApi.updateQhseMonthReport(reportInfo)
     message.success('新增成功')
     // 返回列表页或上一页
     router.back()
@@ -586,11 +584,22 @@ const handleSubmit = async () => {
 
 /** 取消 */
 const handleCancel = () => {
-  router.back()
+  delView(unref(router.currentRoute))
+  router.push({ name: 'QhseMonthlyReport', params: {} })
 }
 
+const userInfo = ref<any>({})
 onMounted(async () => {
+  const users = await getUserProfile()
+  userInfo.value = users
   deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
+  userList.value = await UserApi.selectedDeptsEmployee({
+    deptIds: userInfo.value.dept.id
+  })
+  const res = await QhseMonthReportApi.getQhseMonthReport(route.params.id)
+  const data = (res as any)?.data ?? res ?? {}
+
+  Object.assign(reportInfo, data)
 })
 </script>
 <style scoped lang="scss">

+ 0 - 7
src/views/pms/qhse/monthlyReport/MonthlyReportEdit.vue

@@ -1,7 +0,0 @@
-<template>
-  <div>addddd</div>
-</template>
-
-<script setup lang="ts">
-defineOptions({ name: 'MonthlyReportEdit' })
-</script>

+ 73 - 605
src/views/pms/qhse/monthlyReport/index.vue

@@ -5,30 +5,31 @@
       <ContentWrap style="border: 0">
         <!-- 搜索工作栏 -->
         <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
-          <el-form-item label="风险等级" prop="riskGrade">
-            <el-select
-              v-model="queryParams.riskGrade"
-              placeholder="请选择风险等级"
-              clearable
-              style="width: 200px">
-              <el-option
-                v-for="dict in getStrDictOptions(DICT_TYPE.DANGER_GRADE)"
-                :key="dict.value"
-                :label="dict.label"
-                :value="dict.value" />
-            </el-select>
+          <el-form-item label="月报标题" prop="title">
+            <el-input v-model="queryParams.title" placeholder="请输入月报标题" />
+          </el-form-item>
+
+          <el-form-item label="创建日期" prop="createTime">
+            <el-date-picker
+              v-model="queryParams.createTime"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              type="daterange"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+              class="!w-200px" />
           </el-form-item>
 
           <el-form-item>
-            <el-button @click="handleQuery"
+            <el-button @click="handleQuery" v-hasPermi="['rq:qhse-month-report:query']"
               ><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
             >
             <el-button @click="resetQuery"
               ><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button
             >
-            <el-button type="primary" @click="add" color="#626aef">
+            <!-- <el-button type="primary" @click="add" color="#626aef">
               <Icon icon="ep:plus" class="mr-5px" /> 新增
-            </el-button>
+            </el-button> -->
             <el-button type="success" plain @click="handleExport" :loading="exportLoading">
               <Icon icon="ep:download" class="mr-5px" /> 导出
             </el-button>
@@ -37,98 +38,31 @@
       </ContentWrap>
 
       <ContentWrap style="border: 0">
-        <div v-loading="!staticData.length" class="stats-cards">
-          <div
-            v-for="item in statsDisplayCards"
-            :key="item.key"
-            class="stats-card"
-            :style="getStatsCardStyle(item.accent, item.glow)">
-            <div
-              class="stats-card__decor stats-card__decor--left"
-              :style="{ background: item.glow }"></div>
-            <div
-              class="stats-card__decor stats-card__decor--right"
-              :style="{ background: item.glow }"></div>
-            <div class="stats-card__header">
-              <div class="stats-card__icon-wrap">
-                <div class="stats-card__icon" :style="{ color: item.accent }">
-                  <Icon :icon="item.icon" />
-                </div>
-              </div>
-              <div class="stats-card__title">{{ item.label }}</div>
-            </div>
-            <div class="stats-card__body">
-              <CountTo
-                :duration="2600"
-                :end-val="item.count"
-                :start-val="0"
-                class="stats-card__count"
-                :style="{ color: item.accent }" />
-            </div>
-          </div>
-        </div>
         <zm-table
           :data="tableData"
           border
           style="width: 100%"
           :header-cell-style="{ background: '#f5f7fa', color: '#333' }"
           :cell-style="{ padding: '12px 8px' }"
-          height="52.7vh">
-          <!-- 区域/位置 列(已合并) -->
-          <zm-table-column prop="region" label="区域/位置" align="center" fixed="left" />
-
-          <!-- 其他列保持不变 -->
-          <zm-table-column label="序号" width="70" align="center">
-            <template #default="scope">
-              {{ scope.$index + 1 }}
+          height="70.8vh">
+          <zm-table-column
+            prop="title"
+            label="月报标题"
+            align="center"
+            fixed="left"
+            show-overflow-tooltip />
+          <zm-table-column prop="personName" label="工单填报人" align="center" />
+          <zm-table-column label="创建日期" prop="createTime" align="center">
+            <template #default="{ row }">
+              {{ formatDate(row.createTime) }}
             </template>
           </zm-table-column>
-          <zm-table-column prop="elementDescription" label="危害因素描述" align="center" />
-          <zm-table-column prop="maybeResult" label="可导致的后果" align="center" />
-
-          <!-- 风险评价列保持不变 -->
-          <zm-table-column label="风险评价" align="center">
-            <zm-table-column prop="evalKn" label="可能性 (L)" width="80" align="center">
-              <template #default="{ row }">
-                {{ row.evalKn }}
-              </template>
-            </zm-table-column>
-            <zm-table-column prop="evalYz" label="严重性 (S)" width="80" align="center">
-              <template #default="{ row }">
-                {{ row.evalYz }}
-              </template>
-            </zm-table-column>
-            <zm-table-column prop="evalFxz" label="风险值 (R)" width="80" align="center">
-              <template #default="{ row }">
-                {{ row.evalFxz }}
-              </template>
-            </zm-table-column>
-            <zm-table-column prop="riskGrade" label="风险等级" width="100" align="center">
-              <template #default="scope">
-                <dict-tag :type="DICT_TYPE.DANGER_GRADE" :value="scope.row.riskGrade" />
-              </template>
-            </zm-table-column>
-          </zm-table-column>
 
-          <zm-table-column
-            prop="controlMethod"
-            label="控制措施"
-            show-overflow-tooltip
-            align="center" />
-          <zm-table-column prop="charge" label="责任人" align="center" />
           <zm-table-column label="操作" width="150" align="center" fixed="right" action>
             <template #default="{ row }">
-              <div class="flex gap-3 justify-center">
-                <el-link
-                  :underline="false"
-                  size="small"
-                  type="primary"
-                  @click="openForm('edit', row)">
-                  编辑
-                </el-link>
-                <el-link :underline="false" size="small" type="danger" @click="deleteRow(row)">
-                  删除
-                </el-link>
+              <div class="flex gap-1 justify-center">
+                <el-button text type="primary" @click="add(row)"> 填报 </el-button>
+                <el-button text size="small" type="success" @click="detail(row)"> 查看 </el-button>
               </div>
             </template>
           </zm-table-column>
@@ -148,126 +82,17 @@
       </ContentWrap>
     </el-col>
   </el-row>
-  <!-- 新增/编辑弹窗 -->
-  <!-- 新增/编辑弹窗 -->
-  <el-dialog v-model="dialogVisible" :title="dialogTitle" width="50%" @close="resetForm">
-    <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px">
-      <el-row :gutter="20">
-        <!-- 第一行 -->
-        <el-col :span="12">
-          <el-form-item label="区域/位置" prop="region">
-            <el-input v-model="formData.region" placeholder="请输入区域/位置" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="危害因素描述" prop="elementDescription">
-            <el-input v-model="formData.elementDescription" placeholder="请输入危害因素描述" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
-        <!-- 第二行 -->
-        <el-col :span="12">
-          <el-form-item label="可能导致的后果" prop="maybeResult">
-            <el-input
-              v-model="formData.maybeResult"
-              placeholder="请输入可能导致的后果"
-              type="textarea"
-              :rows="1" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="风险评价可能性" prop="evalKn">
-            <el-input-number
-              v-model="formData.evalKn"
-              controls-position="right"
-              style="width: 100%" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
-        <!-- 第三行 -->
-        <el-col :span="12">
-          <el-form-item label="风险评价严重性" prop="evalYz">
-            <el-input-number
-              v-model="formData.evalYz"
-              controls-position="right"
-              style="width: 100%" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="风险评价风险值" prop="evalFxz">
-            <el-input-number v-model="formData.evalFxz" disabled style="width: 100%" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
-        <!-- 第四行 -->
-        <el-col :span="12">
-          <el-form-item label="风险等级" prop="riskGrade">
-            <el-select
-              v-model="formData.riskGrade"
-              placeholder="请选择风险等级"
-              clearable
-              style="width: 100%">
-              <el-option
-                v-for="dict in getStrDictOptions(DICT_TYPE.DANGER_GRADE)"
-                :key="dict.value"
-                :label="dict.label"
-                :value="dict.value" />
-            </el-select>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="责任人" prop="charge">
-            <el-input v-model="formData.charge" placeholder="请输入责任人" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
-        <el-col :span="24">
-          <el-form-item label="备注" prop="remark">
-            <el-input
-              v-model="formData.remark"
-              type="textarea"
-              placeholder="请输入备注"
-              :rows="1" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-
-      <!-- 控制措施单独一行(占满) -->
-      <el-row :gutter="20">
-        <el-col :span="24">
-          <el-form-item label="控制措施" prop="controlMethod">
-            <el-input
-              v-model="formData.controlMethod"
-              type="textarea"
-              :rows="4"
-              placeholder="请输入控制措施" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-
-    <template #footer>
-      <el-button @click="dialogVisible = false">取消</el-button>
-      <el-button type="primary" @click="submitForm">确定</el-button>
-    </template>
-  </el-dialog>
 </template>
 
 <script setup>
 import { ref, reactive, watch, onMounted, computed } from 'vue'
-import { IotDangerApi } from '@/api/pms/qhse/index'
+import { QhseMonthReportApi } from '@/api/pms/qhse'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
-import DeptTree from '@/views/system/user/HazardTree.vue'
+import DeptTree from '@/views/system/user/DeptTree2.vue'
 import { useUserStore } from '@/store/modules/user'
+import { getUserProfile } from '@/api/system/user/profile'
 import { useRouter } from 'vue-router'
+import { formatDate } from '@/utils/formatTime'
 
 defineOptions({ name: 'QhseMonthlyReport' })
 
@@ -275,62 +100,29 @@ const userStore = useUserStore()
 const router = useRouter()
 // 查询参数
 const queryParams = reactive({
-  riskGrade: '',
+  createTime: null,
+  title: '',
   deptId: ''
 })
 
+let queryFormRef = ref(null)
+
 // 表格数据
 const tableData = ref([])
 const isLeftContentCollapsed = ref(false)
-// 弹窗控制
-const dialogVisible = ref(false)
-const dialogTitle = ref('新增')
-const formData = reactive({
-  region: '', // 区域/位置
-  charge: '',
-  elementDescription: '', // 危害因素描述
-  maybeResult: '', // 可能导致的后果
-  evalKn: 1, // 可能性
-  evalYz: 1, // 严重性
-  evalFxz: 1, // 风险值(自动计算)
-  riskGrade: '一般风险', // 风险等级
-  controlMethod: '', // 控制措施
-  remark: '' // 备注
-})
 
-// 表单校验规则
-const rules = {
-  region: [{ required: true, message: '请输入区域/位置', trigger: 'blur' }],
-  charge: [{ required: true, message: '请输入责任人', trigger: 'blur' }],
-  elementDescription: [{ required: true, message: '请输入危害因素描述', trigger: 'blur' }],
-  maybeResult: [{ required: true, message: '请输入可能导致的后果', trigger: 'blur' }],
-  evalKn: [{ required: true, message: '请输入风险评价可能性', trigger: 'change' }],
-  evalYz: [{ required: true, message: '请输入风险评价严重性', trigger: 'change' }],
-  riskGrade: [{ required: true, message: '请选择风险等级', trigger: 'change' }],
-  controlMethod: [{ required: true, message: '请输入控制措施', trigger: 'blur' }]
-}
+const dialogTitle = ref('新增')
 
-watch(
-  () => [formData.evalKn, formData.evalYz],
-  ([kn, yz]) => {
-    if (kn && yz) {
-      formData.evalFxz = kn * yz
-    }
-  },
-  { immediate: true }
-)
 // 搜索
 const handleQuery = () => {
   pagination.pageNo = 1 // 搜索后回到第一页
   loadTableData()
-  getStatic()
 }
 
 const handleDeptNodeClick = async (row) => {
   queryParams.deptId = row.id
   pagination.pageNo = 1
   loadTableData()
-  getStatic()
 }
 
 const downloadFile = (response) => {
@@ -340,7 +132,7 @@ const downloadFile = (response) => {
   })
 
   // 获取文件名
-  let fileName = '危险源.xlsx'
+  let fileName = '月报.xlsx'
   const disposition = response.headers ? response.headers['content-disposition'] : ''
   if (disposition) {
     const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
@@ -369,7 +161,7 @@ const handleExport = async () => {
   try {
     exportLoading.value = true
     // 调用导出接口
-    const response = await IotDangerApi.exportDanger(queryParams)
+    const response = await QhseMonthReportApi.exportQhseMonthReport(queryParams)
 
     // 下载文件
     downloadFile(response)
@@ -383,10 +175,9 @@ const handleExport = async () => {
 
 // 重置查询
 const resetQuery = () => {
-  queryParams.riskGrade = '' // 清空风险等级筛选
   pagination.pageNo = 1 // 重置为第一页
+  queryFormRef.value.resetFields()
   loadTableData()
-  getStatic()
 }
 
 // 删除确认
@@ -398,7 +189,7 @@ const deleteRow = async (row) => {
       type: 'warning'
     })
 
-    await IotDangerApi.deleteDanger(row.id)
+    await QhseMonthReportApi.deleteQhseMonthReport(row.id)
     ElMessage.success('删除成功')
     loadTableData() // 重新加载数据
   } catch (error) {
@@ -416,103 +207,40 @@ const handleSizeChange = (val) => {
   loadTableData()
 }
 
-// 预先计算合并信息
-const spanArr = ref([])
-const pos = ref(0)
-
-// 计算合并信息
-const getSpanArr = (data) => {
-  spanArr.value = []
-  pos.value = 0
-
-  data.forEach((item, index) => {
-    if (index === 0) {
-      spanArr.value.push(1)
-      pos.value = 0
-    } else {
-      if (data[index].region === data[index - 1].region) {
-        spanArr.value[pos.value] += 1
-        spanArr.value.push(0)
-      } else {
-        spanArr.value.push(1)
-        pos.value = index
-      }
-    }
-  })
-}
-
-// 行合并方法
-const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
-  if (columnIndex === 0) {
-    const _row = spanArr.value[rowIndex]
-    const _col = _row > 0 ? 1 : 0
-    return {
-      rowspan: _row,
-      colspan: _col
-    }
-  }
-  return {
-    rowspan: 1,
-    colspan: 1
-  }
-}
-
 // 当前页变化
 const handleCurrentChange = (val) => {
   pagination.pageNo = val
   loadTableData()
 }
 
-const add = () => {
+const add = (row) => {
+  if (row.dutyPerson !== userInfo.value.id) {
+    ElMessage.error('您没有权限进行此操作')
+    return
+  }
   router.push({
-    name: 'MonthlyReportAdd'
+    name: 'MonthlyReportAdd',
+    params: {
+      id: row.id
+    }
   })
 }
-// 打开表单
-const openForm = (type, row = null) => {
-  dialogTitle.value = type === 'create' ? '新增' : '编辑'
-  if (type === 'edit') {
-    Object.assign(formData, row)
-    // 计算风险值 R = L × S
-    formData.riskValue = formData.possibility * formData.severity
-  } else {
-    resetForm()
-  }
-  dialogVisible.value = true
-}
 
-// 重置表单
-const resetForm = () => {
-  Object.keys(formData).forEach((key) => {
-    formData[key] = ''
+const detail = (row) => {
+  if (row.dutyPerson !== userInfo.value.id) {
+    ElMessage.error('您没有权限进行此操作')
+    return
+  }
+  router.push({
+    name: 'MonthlyReportInfo',
+    params: {
+      id: row.id
+    }
   })
 }
 
 // 提交表单
 const formRef = ref(null)
-const submitForm = async () => {
-  await formRef.value.validate()
-  try {
-    const params = {
-      ...formData,
-      evalFxz: formData.evalFxz // 使用已计算的值
-    }
-
-    if (dialogTitle.value === '新增') {
-      await IotDangerApi.createDanger(params)
-      ElMessage.success('新增成功')
-    } else {
-      params.id = formData.id
-      await IotDangerApi.updateDanger(params)
-      ElMessage.success('修改成功')
-    }
-
-    loadTableData()
-    dialogVisible.value = false
-  } catch (error) {
-    ElMessage.error('提交失败')
-  }
-}
 
 // 加载数据
 const exportLoading = ref(false)
@@ -526,110 +254,29 @@ const loadTableData = async () => {
     const params = {
       pageNo: pagination.pageNo,
       pageSize: pagination.pageSize,
-      riskGrade: queryParams.riskGrade, // 添加搜索参数
+      createTime: queryParams.createTime,
+
+      title: queryParams.title,
       deptId: queryParams.deptId
     }
-    const res = await IotDangerApi.getDangerList(params)
+    const res = await QhseMonthReportApi.getQhseMonthReportPage(params)
     tableData.value = res.list || []
     total.value = res.total || 0
-
-    // // 按 region 排序(支持中文)
-    // tableData.value.sort((a, b) => {
-    //   return a.region.localeCompare(b.region, 'zh-CN')
-    // })
-
-    // 计算合并信息
-    getSpanArr(tableData.value)
   } catch (error) {
     console.error('加载失败:', error)
   }
 }
 
-let staticData = ref([])
-const totalRiskCount = computed(() =>
-  staticData.value.reduce((sum, item) => sum + (Number(item.count) || 0), 0)
-)
-
-const getStatsCardMeta = (classify) => {
-  const value = String(classify || '')
-  if (value.includes('重大') || value.includes('閲嶅ぇ')) {
-    return {
-      accent: '#ff5b61',
-      glow: 'radial-gradient(circle, rgba(255, 91, 97, 0.22) 0%, rgba(255, 91, 97, 0) 72%)',
-      icon: 'ep:warning-filled'
-    }
-  }
-  if (value.includes('较大') || value.includes('杈冨ぇ')) {
-    return {
-      accent: '#ff9827',
-      glow: 'radial-gradient(circle, rgba(255, 152, 39, 0.24) 0%, rgba(255, 152, 39, 0) 72%)',
-      icon: 'ep:opportunity'
-    }
-  }
-  if (value.includes('一般') || value.includes('涓€鑸')) {
-    return {
-      accent: '#3d7cff',
-      glow: 'radial-gradient(circle, rgba(61, 124, 255, 0.2) 0%, rgba(61, 124, 255, 0) 72%)',
-      icon: 'ep:info-filled'
-    }
-  }
-  if (value.includes('低') || value.includes('浣')) {
-    return {
-      accent: '#25b36a',
-      glow: 'radial-gradient(circle, rgba(37, 179, 106, 0.22) 0%, rgba(37, 179, 106, 0) 72%)',
-      icon: 'ep:success-filled'
-    }
-  }
-  return {
-    accent: '#5f7da8',
-    glow: 'radial-gradient(circle, rgba(95, 125, 168, 0.18) 0%, rgba(95, 125, 168, 0) 72%)',
-    icon: 'ep:data-analysis'
-  }
-}
-
-const statsDisplayCards = computed(() =>
-  staticData.value.map((item, index) => {
-    const meta = getStatsCardMeta(item.classify)
-    const count = Number(item.count) || 0
-    const rate = totalRiskCount.value ? ((count / totalRiskCount.value) * 100).toFixed(1) : '0.0'
-    return {
-      key: `${item.classify}-${index}`,
-      label: item.classify,
-      count,
-      note: `占比:${rate}%`,
-      ...meta
-    }
-  })
-)
-
-const getStatsCardStyle = (accent, glow) => ({
-  '--stats-accent': accent,
-  '--stats-glow': glow
-})
-
-const getStatsCardClass = (classify) => {
-  const value = String(classify || '')
-  if (value.includes('重大')) return 'stats-card--major'
-  if (value.includes('较大')) return 'stats-card--high'
-  if (value.includes('一般')) return 'stats-card--medium'
-  if (value.includes('低')) return 'stats-card--low'
-  return 'stats-card--default'
-}
-
-async function getStatic() {
-  if (queryParams.deptId) {
-    const res = await IotDangerApi.getDangerStatistics(queryParams.deptId)
-    staticData.value = res.classify
-  } else {
-    const res = await IotDangerApi.getDangerStatistics(userStore.user.deptId)
-    staticData.value = res.classify
-  }
-}
+let userInfo = ref({})
 
 // 页面挂载后加载数据
-onMounted(() => {
+onMounted(async () => {
   loadTableData()
-  getStatic()
+
+  const users = await getUserProfile()
+  userInfo.value = users
+
+  console.log('xxxxxxxxxxxxxxxxxx', userInfo.value)
 })
 </script>
 
@@ -654,183 +301,4 @@ onMounted(() => {
   background-color: #f5f7fa;
   border-bottom: 1px solid #ddd;
 }
-
-.sub-row {
-  padding: 12px 0;
-  text-align: left;
-}
-
-.risk-evaluation {
-  display: flex;
-  flex-direction: column;
-  gap: 4px;
-  align-items: center;
-}
-
-.risk-item {
-  font-size: 12px;
-  padding: 4px 8px;
-  border-radius: 4px;
-  background-color: #f5f7fa;
-  color: #333;
-}
-
-.risk-level {
-  font-weight: bold;
-  color: #333;
-  padding: 6px 12px;
-  border-radius: 4px;
-}
-
-.stats-cards {
-  display: grid;
-  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
-  gap: 12px;
-  margin-bottom: 16px;
-}
-
-.stats-card {
-  position: relative;
-  overflow: hidden;
-  min-height: 132px;
-  padding: 18px 18px 16px;
-  border-radius: 22px;
-  background: radial-gradient(
-      circle at 18% 22%,
-      rgb(255 255 255 / 92%) 0%,
-      rgb(255 255 255 / 0%) 20%
-    ),
-    radial-gradient(circle at 88% 80%, rgb(255 215 158 / 22%) 0%, rgb(255 215 158 / 0%) 16%),
-    linear-gradient(135deg, rgb(239 245 255 / 96%) 0%, rgb(217 230 248 / 88%) 100%);
-  border: 1px solid rgb(255 255 255 / 62%);
-  box-shadow:
-    inset 0 1px 0 rgb(255 255 255 / 86%),
-    0 14px 30px rgb(116 146 191 / 12%);
-}
-
-.stats-card__decor {
-  position: absolute;
-  border-radius: 999px;
-  pointer-events: none;
-  filter: blur(8px);
-  opacity: 0.95;
-}
-
-.stats-card__decor--left {
-  width: 72px;
-  height: 72px;
-  left: -10px;
-  top: -8px;
-}
-
-.stats-card__decor--right {
-  width: 88px;
-  height: 88px;
-  right: -18px;
-  bottom: -24px;
-}
-
-.stats-card__header {
-  position: relative;
-  z-index: 1;
-  display: flex;
-  align-items: center;
-  gap: 14px;
-}
-
-.stats-card__icon-wrap {
-  width: 48px;
-  height: 48px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  border-radius: 14px;
-  box-shadow:
-    inset 0 1px 0 rgb(255 255 255 / 85%),
-    0 10px 24px rgb(118 144 187 / 10%);
-}
-
-.stats-card__icon {
-  font-size: 24px;
-  /* line-height: 1; */
-}
-
-.stats-card__title {
-  font-size: 16px;
-  font-weight: 700;
-  color: #324b72;
-  letter-spacing: 0;
-}
-
-.stats-card__body {
-  position: relative;
-  z-index: 1;
-  display: flex;
-  align-items: flex-end;
-  gap: 8px;
-  margin-top: 14px;
-  padding-left: 62px;
-}
-
-.stats-card__count {
-  display: block;
-  font-size: 38px !important;
-  font-weight: 800;
-  line-height: 0.92;
-  letter-spacing: 1px;
-  font-style: italic;
-  text-shadow: 0 8px 18px rgb(68 110 183 / 10%);
-}
-
-.stats-card__note {
-  padding-bottom: 4px;
-  font-size: 16px;
-  font-weight: 700;
-  line-height: 1;
-}
-
-@media (max-width: 768px) {
-  .stats-cards {
-    grid-template-columns: 1fr;
-  }
-
-  .stats-card {
-    min-height: 160px;
-    padding: 24px 22px 22px;
-    border-radius: 22px;
-  }
-
-  .stats-card__header {
-    gap: 18px;
-  }
-
-  .stats-card__icon-wrap {
-    width: 58px;
-    height: 58px;
-    border-radius: 16px;
-  }
-
-  .stats-card__icon {
-    font-size: 28px;
-  }
-
-  .stats-card__title {
-    font-size: 17px;
-  }
-
-  .stats-card__body {
-    margin-top: 18px;
-    padding-left: 76px;
-    gap: 10px;
-  }
-
-  .stats-card__count {
-    font-size: 46px !important;
-  }
-
-  .stats-card__note {
-    font-size: 18px;
-    padding-bottom: 6px;
-  }
-}
 </style>

+ 86 - 19
src/views/pms/qhse/safety/index.vue

@@ -159,6 +159,8 @@
               <span v-else>-</span>
             </template>
           </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" prop="rectifyDesc" />
 
@@ -178,7 +180,7 @@
 
           <zm-table-column prop="createTime" label="排查时间" align="center" min-width="150">
             <template #default="{ row }">
-              {{ formatDate(row.createTime) }}
+              {{ formatDate(row.checkTime) }}
             </template>
           </zm-table-column>
 
@@ -246,17 +248,6 @@
       :rules="formRules"
       label-width="120px"
       v-loading="formLoading">
-      <el-form-item label="所属队伍" prop="deptId">
-        <el-tree-select
-          clearable
-          v-model="formData.deptId"
-          :data="deptList2"
-          :props="defaultProps"
-          :check-strictly="false"
-          node-key="id"
-          filterable
-          placeholder="请选择所属队伍" />
-      </el-form-item>
       <el-form-item label="隐患排查类型" prop="classify">
         <el-tree-select
           style="width: 500px; overflow: auto"
@@ -269,7 +260,11 @@
       </el-form-item>
 
       <el-form-item label="隐患排查来源" prop="source">
-        <el-select v-model="formData.source" placeholder="请选择隐患排查来源" clearable>
+        <el-select
+          v-model="formData.source"
+          placeholder="请选择隐患排查来源"
+          clearable
+          @change="handleChange">
           <el-option
             v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_HAZARD_SOURCE)"
             :key="dict.value"
@@ -278,6 +273,52 @@
         </el-select>
       </el-form-item>
 
+      <el-form-item label="所属队伍" prop="deptId">
+        <el-tree-select
+          clearable
+          v-model="formData.deptId"
+          :data="deptList2"
+          :props="defaultProps"
+          :check-strictly="
+            formData.source === 'xm' || formData.source === 'zfjf' || formData.source === 'gsjt'
+          "
+          node-key="id"
+          filterable
+          placeholder="请选择所属队伍" />
+      </el-form-item>
+
+      <el-form-item label="排查时间" prop="checkTime">
+        <el-date-picker
+          v-model="formData.checkTime"
+          type="datetime"
+          value-format="x"
+          placeholder="请选择排查时间"
+          style="width: 100%" />
+      </el-form-item>
+
+      <el-form-item label="整改要求" prop="correctStandard">
+        <el-input
+          type="textarea"
+          :rows="2"
+          v-model="formData.correctStandard"
+          placeholder="请输入整改要求" />
+      </el-form-item>
+
+      <el-form-item label="整改人" prop="correctPerson">
+        <el-select
+          v-model="formData.correctPerson"
+          filterable
+          clearable
+          placeholder="请选择整改人"
+          style="width: 100%">
+          <el-option
+            v-for="item in userList"
+            :key="item.id"
+            :label="item.nickname"
+            :value="item.id" />
+        </el-select>
+      </el-form-item>
+
       <el-form-item label="地点" prop="address">
         <el-input v-model="formData.address" placeholder="请输入地点" />
       </el-form-item>
@@ -385,8 +426,9 @@
 import { ref, reactive, watch, nextTick } from 'vue'
 import { IotHiddenApi, IotHiddenTypeApi } from '@/api/pms/qhse/index'
 import DeptTree from '@/views/system/user/DeptTree2.vue'
-
+import { getUserProfile } from '@/api/system/user/profile'
 import * as DeptApi from '@/api/system/dept'
+import { selectedDeptsEmployee } from '@/api/system/user'
 import { ElMessageBox, ElMessage } from 'element-plus'
 const deptList2 = ref<Tree[]>([]) // 树形结构
 import { formatDate } from '@/utils/formatTime'
@@ -456,7 +498,10 @@ const formData = ref({
   rectifyFile: '',
   status: '',
   classify: '',
-  source: ''
+  source: '',
+  checkTime: '',
+  correctStandard: '',
+  correctPerson: ''
 })
 
 // 表单验证规则
@@ -469,7 +514,10 @@ 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' }]
 }
 
 /** 查询列表 */
@@ -518,6 +566,12 @@ const resetQuery = () => {
   handleQuery()
 }
 
+const handleChange = (val) => {
+  console.log('handleChange', val)
+  if (val === 'dw') {
+    formData.value.deptId = ''
+  }
+}
 // 显示新增对话框
 const handleAdd = async () => {
   isEdit.value = false
@@ -529,12 +583,14 @@ const handleAdd = async () => {
 }
 
 // 显示编辑对话框
-const handleEdit = (row) => {
+const handleEdit = async (row) => {
   isEdit.value = true
   dialogTitle.value = '修改'
+  await getTree()
 
   formData.value = {
     ...row,
+    classify: row.classify ? Number(row.classify) : row.classify,
     // 确保日期字段正确处理
     issueDate: row.issueDate ? ensureMillisecondTimestamp(row.issueDate) : null,
     validityPeriod: row.validityPeriod ? ensureMillisecondTimestamp(row.validityPeriod) : null
@@ -811,11 +867,22 @@ const resizePieChart = () => {
 
 let pieChartResizeObserver: ResizeObserver | null = null
 
+let userList = ref([])
 onMounted(async () => {
+  const users = await getUserProfile()
+
+  userList.value = await selectedDeptsEmployee({
+    deptIds: users.dept.id
+  })
   getList()
+
   deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
 
-  getStatic()
+  try {
+    getStatic()
+  } catch (error) {
+    console.error(error)
+  }
 
   window.addEventListener('resize', resizePieChart)
 
@@ -827,7 +894,7 @@ onMounted(async () => {
   }
 })
 
-onUnmounted(() => {
+onUnmounted(async () => {
   if (pieChart) {
     pieChart.dispose()
     pieChart = null