Kaynağa Gözat

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

yanghao 4 gün önce
ebeveyn
işleme
56d6315daa

+ 27 - 0
src/api/pms/qhse/index.ts

@@ -458,3 +458,30 @@ export const kanbanApi = {
     return await request.get({ url: `/rq/qhse-kanban/get`, params })
   }
 }
+
+// 证书人员
+export const CertPersonApi = {
+  // 获得证书人员分页
+  getCertPersonList: async (params) => {
+    return await request.get({ url: `/rq/qhse-cert-person/page`, params })
+  }, // 删除证书人员
+  deleteCertPerson: async (id) => {
+    return await request.delete({ url: `/rq/qhse-cert-person/delete?id=` + id })
+  },
+  // 添加证书人员
+  createCertPerson: async (data) => {
+    return await request.post({ url: `/rq/qhse-cert-person/create`, data })
+  },
+  // 修改证书人员
+  updateCertPerson: async (data) => {
+    return await request.put({ url: `/rq/qhse-cert-person/update`, data })
+  },
+  // 导出证书人员 Excel
+  exportCertPerson: async (params) => {
+    return await request.download({ url: `/rq/qhse-cert-person/export-excel`, params })
+  },
+  // 获取详情
+  getCertPerson: async (id) => {
+    return await request.get({ url: `/rq/qhse-cert-person/get?id=` + id })
+  }
+}

+ 155 - 0
src/views/pms/qhse/certPerson/CertPersonForm.vue

@@ -0,0 +1,155 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading">
+      <el-form-item label="姓名" prop="nickname">
+        <el-input v-model="formData.nickname" placeholder="请输入姓名" />
+      </el-form-item>
+
+      <el-form-item label="手机号" prop="mobile">
+        <el-input v-model="formData.mobile" placeholder="请输入手机号" />
+      </el-form-item>
+
+      <el-form-item label="岗位" prop="postName">
+        <el-input v-model="formData.postName" placeholder="请输入岗位名称" />
+      </el-form-item>
+
+      <el-form-item label="备注" prop="remark">
+        <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { CertPersonApi } from '@/api/pms/qhse/index'
+import { handleTree } from '@/utils/tree'
+import * as DeptApi from '@/api/system/dept'
+import { useUserStore } from '@/store/modules/user'
+import { ElMessageBox } from 'element-plus'
+/** SOC卡汇总 表单 */
+defineOptions({ name: 'IotSocSummaryForm' })
+
+const userStore = useUserStore()
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+const deptList2 = ref<Tree[]>([]) // 树形结构
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  username: undefined,
+  nickname: undefined,
+  mobile: undefined,
+  postName: undefined,
+
+  remark: undefined,
+  deptId: undefined,
+  deptName: undefined
+})
+const formRules = reactive({
+  nickname: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+
+  mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
+  postName: [{ required: true, message: '请输入岗位名称', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+
+  resetForm()
+  formData.value.deptId = userStore.getUser.deptId
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      const data = await CertPersonApi.getCertPerson(id)
+      formData.value = {
+        ...data
+      }
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+// 手机号格式校验(不阻止提交)
+const validateMobileFormat = () => {
+  if (formData.value.mobile && !/^1[3-9]\d{9}$/.test(formData.value.mobile)) {
+    message.warning('手机号格式不正确,但不影响提交')
+    return false
+  }
+  return true
+}
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 校验手机号格式(仅提示,不阻止提交)
+  // 校验手机号格式,格式不正确时弹出二次确认
+  if (formData.value.mobile && !/^1[3-9]\d{9}$/.test(formData.value.mobile)) {
+    try {
+      await ElMessageBox.confirm('手机号格式不正确,是否继续提交?', '提示', {
+        confirmButtonText: '继续提交',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+    } catch {
+      return // 用户点击取消,终止提交
+    }
+  }
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = { ...formData.value }
+
+    if (formType.value === 'create') {
+      data.deptId = userStore.getUser.deptId
+      await CertPersonApi.createCertPerson(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await CertPersonApi.updateCertPerson(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    username: undefined,
+    nickname: undefined,
+    mobile: undefined,
+    postName: undefined,
+    remark: undefined,
+    deptId: undefined,
+    deptName: undefined
+  }
+  formRef.value?.resetFields()
+}
+
+onMounted(async () => {
+  deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
+})
+</script>

+ 211 - 0
src/views/pms/qhse/certPerson/index.vue

@@ -0,0 +1,211 @@
+<template>
+  <el-row :gutter="20">
+    <!-- 左侧部门树 -->
+    <DeptTree @node-click="handleDeptNodeClick" v-model:collapsed="isLeftContentCollapsed" />
+
+    <el-col :span="isLeftContentCollapsed ? 24 : 20" :xs="24">
+      <div style="overflow-y: hidden !important; border: none" class="bg-white px-2 py-2">
+        <!-- 搜索工作栏 -->
+        <el-form
+          class="-mb-15px"
+          :model="queryParams"
+          ref="queryFormRef"
+          :inline="true"
+          @submit.prevent
+          border>
+          <el-form-item label="人员名称" prop="username">
+            <el-input
+              v-model="queryParams.username"
+              placeholder="请输入人员名称"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-150px" />
+          </el-form-item>
+          <el-form-item label="姓名" prop="nickname">
+            <el-input
+              v-model="queryParams.nickname"
+              placeholder="请输入姓名"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-150px" />
+          </el-form-item>
+
+          <el-form-item label="岗位" prop="postName">
+            <el-input
+              v-model="queryParams.postName"
+              placeholder="请输入岗位名称"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-150px" />
+          </el-form-item>
+
+          <el-form-item>
+            <el-button @click="handleQuery" v-hasPermi="['rq:qhse-cert-person: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"
+              plain
+              @click="openForm('create')"
+              v-hasPermi="['rq:qhse-cert-person:create']">
+              <Icon icon="ep:plus" class="mr-5px" /> 新增
+            </el-button>
+            <el-button
+              type="success"
+              plain
+              @click="handleExport"
+              :loading="exportLoading"
+              v-hasPermi="['rq:qhse-cert-person:export']">
+              <Icon icon="ep:download" class="mr-5px" /> 导出
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <!-- 列表 -->
+      <ContentWrap style="border: none; margin-top: 10px">
+        <zm-table :loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+          <el-table-column :label="t('monitor.serial')" width="70" align="center">
+            <template #default="scope">
+              {{ scope.$index + 1 }}
+            </template>
+          </el-table-column>
+
+          <zm-table-column label="人员名称" align="center" prop="username" />
+          <zm-table-column label="姓名" align="center" prop="nickname" />
+          <zm-table-column label="岗位" align="center" prop="postName" />
+          <zm-table-column label="手机号" align="center" prop="mobile" />
+          <zm-table-column label="部门名称" align="center" prop="deptName" />
+
+          <zm-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
+
+          <zm-table-column label="操作" align="center" min-width="120px" action fixed="right">
+            <template #default="scope">
+              <el-button
+                link
+                type="primary"
+                @click="openForm('update', scope.row.id)"
+                v-hasPermi="['rq:qhse-cert-person:update']">
+                编辑
+              </el-button>
+              <el-button
+                link
+                type="danger"
+                @click="handleDelete(scope.row.id)"
+                v-hasPermi="['rq:qhse-cert-person:delete']">
+                删除
+              </el-button>
+            </template>
+          </zm-table-column>
+        </zm-table>
+        <!-- 分页 -->
+        <Pagination
+          :total="total"
+          v-model:page="queryParams.pageNo"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList" />
+      </ContentWrap>
+    </el-col>
+  </el-row>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <CertPersonForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import download from '@/utils/download'
+import { CertPersonApi } from '@/api/pms/qhse/index'
+import CertPersonForm from './CertPersonForm.vue'
+import DeptTree from '@/views/system/user/DeptTree2.vue'
+
+defineOptions({ name: 'CertPerson' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const isLeftContentCollapsed = ref(false)
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  username: undefined,
+  nickname: undefined,
+  postName: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await CertPersonApi.getCertPersonList(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+const handleDeptNodeClick = async (row) => {
+  queryParams.deptId = row.id
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await CertPersonApi.deleteCertPerson(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await CertPersonApi.exportCertPerson(queryParams)
+    download.excel(data, 'certPerson.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 1 - 1
src/views/pms/qhse/faultReport/index.vue

@@ -96,7 +96,7 @@
           style="width: 100%"
           :header-cell-style="{ background: '#f5f7fa', color: '#333', height: '50px' }"
           :cell-style="{ padding: '12px 8px' }"
-          height="calc(70vh - 118px)"
+          height="calc(60vh - 130px)"
           :max-height="tableHeight">
           <zm-table-column prop="actualTime" label="事件时间" align="center" min-width="150">
             <template #default="{ row }">

+ 22 - 13
src/views/pms/qhse/jsa/IotSocSummaryForm.vue

@@ -5,16 +5,25 @@
       :model="formData"
       :rules="formRules"
       label-width="100px"
-      v-loading="formLoading"
-    >
+      v-loading="formLoading">
+      <el-form-item label="所属队伍" prop="deptId">
+        <el-tree-select
+          clearable
+          v-model="formData.deptId"
+          :data="deptList2"
+          :props="defaultProps"
+          check-strictly
+          node-key="id"
+          filterable
+          placeholder="请选择所在部门" />
+      </el-form-item>
       <el-form-item label="日期" prop="jsaTime">
         <el-date-picker
           v-model="formData.jsaTime"
           type="date"
           value-format="x"
           placeholder="选择日期"
-          style="width: 100%"
-        />
+          style="width: 100%" />
       </el-form-item>
 
       <el-form-item label="序号" prop="jsaXh">
@@ -39,8 +48,7 @@
           :file-type="['doc', 'docx', 'pdf', 'jpg', 'png', 'jpeg']"
           :limit="3"
           :file-size="100"
-          class="min-w-80px"
-        />
+          class="min-w-80px" />
       </el-form-item>
 
       <el-form-item label="备注" prop="remark">
@@ -55,7 +63,7 @@
 </template>
 <script setup lang="ts">
 import { QHSEJsaApi } from '@/api/pms/qhse/index'
-import { handleTree } from '@/utils/tree'
+import { handleTree, defaultProps } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
 import { useUserStore } from '@/store/modules/user'
 /** SOC卡汇总 表单 */
@@ -85,6 +93,7 @@ const formRules = reactive({
   jsaTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
   jsaXh: [{ required: true, message: '请输入序号', trigger: 'blur' }],
   jobTask: [{ required: true, message: '请输入工作任务', trigger: 'blur' }],
+  deptId: [{ required: true, message: '请选择所属队伍', trigger: 'blur' }],
 
   jsaFile: [{ required: true, message: '请上传附件', trigger: 'blur' }]
 })
@@ -95,7 +104,11 @@ const open = async (type: string, id?: number) => {
   dialogVisible.value = true
   dialogTitle.value = t('action.' + type)
   formType.value = type
+
   resetForm()
+  formData.value.deptId = userStore.getUser.deptId
+
+  console.log('id>>>>>>>>>>>>>', formData.value)
   // 修改时,设置数据
   if (id) {
     formLoading.value = true
@@ -106,9 +119,7 @@ const open = async (type: string, id?: number) => {
         jsaFile: Array.isArray(data.jsaFile)
           ? data.jsaFile
           : data.jsaFile
-            ? String(data.jsaFile)
-                .split(',')
-                .filter(Boolean)
+            ? String(data.jsaFile).split(',').filter(Boolean)
             : []
       }
     } finally {
@@ -127,9 +138,7 @@ const submitForm = async () => {
   formLoading.value = true
   try {
     const data = { ...formData.value }
-    data.jsaFile = Array.isArray(data.jsaFile)
-      ? data.jsaFile.join(',')
-      : data.jsaFile || ''
+    data.jsaFile = Array.isArray(data.jsaFile) ? data.jsaFile.join(',') : data.jsaFile || ''
     if (formType.value === 'create') {
       data.deptId = userStore.getUser.deptId
       await QHSEJsaApi.createJsa(data)

+ 73 - 70
src/views/pms/qhse/ptw/index.vue

@@ -15,16 +15,21 @@
           </el-form-item>
 
           <el-form-item>
-            <el-button @click="handleAdd" type="primary"
+            <el-button @click="handleAdd" type="primary" v-hasPermi="['rq:qhse-ptw:create']"
               ><Icon icon="ep:plus" class="mr-5px" />新增</el-button
             >
-            <el-button @click="handleQuery"
+            <el-button @click="handleQuery" v-hasPermi="['rq:qhse-ptw:query']"
               ><Icon icon="ep:search" class="mr-5px" /> {{ t('devicePerson.search') }}</el-button
             >
             <el-button @click="resetQuery"
               ><Icon icon="ep:refresh" class="mr-5px" /> {{ t('devicePerson.reset') }}</el-button
             >
-            <el-button @click="handleExport" type="success" plain :loading="exportLoading"
+            <el-button
+              @click="handleExport"
+              type="success"
+              plain
+              :loading="exportLoading"
+              v-hasPermi="['rq:qhse-ptw:export']"
               ><Icon icon="ep:download" class="mr-5px" /> 导出</el-button
             >
           </el-form-item>
@@ -38,8 +43,7 @@
           :data="list"
           :stripe="true"
           height="calc(85vh - 130px)"
-          :show-overflow-tooltip="true"
-        >
+          :show-overflow-tooltip="true">
           <zm-table-column :label="t('monitor.serial')" width="70" align="center" fixed="left">
             <template #default="scope">
               {{ scope.$index + 1 }}
@@ -71,29 +75,25 @@
             label="作业地点"
             align="center"
             prop="workLocation"
-            show-overflow-tooltip
-          />
+            show-overflow-tooltip />
           <zm-table-column
             label="作业内容"
             align="center"
             prop="workContent"
-            show-overflow-tooltip
-          />
+            show-overflow-tooltip />
 
           <zm-table-column
             label="作业人员"
             align="center"
             prop="workPerson"
-            show-overflow-tooltip
-          />
+            show-overflow-tooltip />
 
           <zm-table-column label="监护人" align="center" prop="guardian" show-overflow-tooltip />
           <zm-table-column
             label="作业负责人"
             align="center"
             prop="workDuty"
-            show-overflow-tooltip
-          />
+            show-overflow-tooltip />
           <zm-table-column label="部门" align="center" prop="deptName" show-overflow-tooltip />
 
           <zm-table-column label="附件" align="center" min-width="90">
@@ -120,19 +120,29 @@
             label="备注"
             align="center"
             prop="remark"
-            :show-overflow-tooltip="true"
-          />
+            :show-overflow-tooltip="true" />
 
           <zm-table-column
             :label="t('devicePerson.operation')"
             align="center"
             fixed="right"
             min-width="120px"
-            action
-          >
+            action>
             <template #default="scope">
-              <el-button link type="primary" @click="handleEdit(scope.row)"> 编辑 </el-button>
-              <el-button link type="danger" @click="handleDelete(scope.row.id)"> 删除 </el-button>
+              <el-button
+                v-hasPermi="['rq:qhse-ptw:update']"
+                link
+                type="primary"
+                @click="handleEdit(scope.row)">
+                编辑
+              </el-button>
+              <el-button
+                v-hasPermi="['rq:qhse-ptw:delete']"
+                link
+                type="danger"
+                @click="handleDelete(scope.row.id)">
+                删除
+              </el-button>
             </template>
           </zm-table-column>
         </zm-table>
@@ -142,8 +152,7 @@
           :total="total"
           v-model:page="queryParams.pageNo"
           v-model:limit="queryParams.pageSize"
-          @pagination="getList"
-        />
+          @pagination="getList" />
       </ContentWrap>
     </el-col>
   </el-row>
@@ -154,15 +163,24 @@
     v-model="dialogVisible"
     width="600px"
     destroy-on-close
-    @close="closeDialog"
-  >
+    @close="closeDialog">
     <el-form
       ref="formRef"
       :model="formData"
       :rules="formRules"
       label-width="120px"
-      v-loading="formLoading"
-    >
+      v-loading="formLoading">
+      <el-form-item label="所属队伍" prop="deptId">
+        <el-tree-select
+          clearable
+          v-model="formData.deptId"
+          :data="deptList2"
+          :props="defaultProps"
+          check-strictly
+          node-key="id"
+          filterable
+          placeholder="请选择所在部门" />
+      </el-form-item>
       <el-form-item label="JSA编号" prop="ptwNo">
         <el-input v-model="formData.ptwNo" disabled placeholder="选择JSA编号" style="width: 300px">
           <template #append>
@@ -179,8 +197,7 @@
           type="textarea"
           :rows="2"
           v-model="formData.workContent"
-          placeholder="请输入作业内容"
-        />
+          placeholder="请输入作业内容" />
       </el-form-item>
 
       <!-- 作业票类型 -->
@@ -190,27 +207,28 @@
             v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_TYPE)"
             :key="item.value"
             :label="item.label"
-            :value="item.value"
-          />
+            :value="item.value" />
         </el-select>
       </el-form-item>
 
       <el-form-item
         label="作业分级"
         prop="ptwGrade"
-        v-if="formData.ptwType === '1' || formData.ptwType === '4' || formData.ptwType === '3'"
-      >
+        v-if="
+          formData.ptwType === 'donghuo' ||
+          formData.ptwType === 'gaochu' ||
+          formData.ptwType === 'diaozhuang'
+        ">
         <el-select v-model="formData.ptwGrade" placeholder="请选择作业分级">
           <el-option
             v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_GRADE)"
             :key="item.value"
             :label="item.label"
-            :value="item.value"
-          />
+            :value="item.value" />
         </el-select>
       </el-form-item>
 
-      <el-form-item label="作业地点" prop="ptwXh">
+      <el-form-item label="作业地点" prop="workLocation">
         <el-input v-model="formData.workLocation" placeholder="请输入作业地点" />
       </el-form-item>
 
@@ -220,8 +238,7 @@
           type="date"
           value-format="x"
           placeholder="请选择作业时间"
-          style="width: 100%"
-        />
+          style="width: 100%" />
       </el-form-item>
 
       <el-form-item label="作业人员" prop="workPerson">
@@ -229,8 +246,7 @@
           v-model="formData.workPerson"
           disabled
           placeholder="请选择作业人员"
-          style="width: 300px"
-        >
+          style="width: 300px">
           <template #append>
             <el-link @click="selectworkPerson('workPerson')" :underline="false">选择</el-link>
           </template>
@@ -242,8 +258,7 @@
           v-model="formData.guardian"
           disabled
           placeholder="请选择监护人"
-          style="width: 300px"
-        >
+          style="width: 300px">
           <template #append>
             <el-link @click="selectworkPerson('guardian')" :underline="false">选择</el-link>
           </template>
@@ -255,8 +270,7 @@
           v-model="formData.workDuty"
           disabled
           placeholder="请选择作业负责人"
-          style="width: 300px"
-        >
+          style="width: 300px">
           <template #append>
             <el-link @click="selectworkPerson('workDuty')" :underline="false">选择</el-link>
           </template>
@@ -269,8 +283,7 @@
           :file-type="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'jpg', 'png', 'jpeg']"
           :limit="3"
           :file-size="100"
-          class="min-w-80px"
-        />
+          class="min-w-80px" />
       </el-form-item>
 
       <el-form-item label="备注" prop="remark">
@@ -279,8 +292,7 @@
           v-model="formData.remark"
           :rows="2"
           placeholder="请输入备注"
-          style="width: 100%"
-        />
+          style="width: 100%" />
       </el-form-item>
     </el-form>
 
@@ -295,8 +307,7 @@
     <div
       v-for="(file, index) in fileList"
       :key="index"
-      class="flex items-center justify-between mt-5"
-    >
+      class="flex items-center justify-between mt-5">
       <span class="file-name-text">{{ extractFileName(file) }}</span>
       <div>
         <el-button link type="primary" @click="viewFileInfo(file)">
@@ -326,8 +337,7 @@
             placeholder="请输入所属人员"
             clearable
             @keyup.enter="handleQuery2"
-            class="!w-200px"
-          />
+            class="!w-200px" />
         </el-form-item>
         <el-form-item>
           <el-button @click="handleQuery2"
@@ -345,15 +355,13 @@
         :data="certList"
         :stripe="true"
         :show-overflow-tooltip="true"
-        ref="measureTableRef"
-      >
+        ref="measureTableRef">
         <el-table-column width="50" align="center">
           <template #default="scope">
             <el-radio
               :model-value="selectedPerson"
               :label="scope.row.userName"
-              @change="handleRadioChange(scope.row)"
-            >
+              @change="handleRadioChange(scope.row)">
               &nbsp;
             </el-radio>
           </template>
@@ -374,8 +382,7 @@
             <dict-tag
               v-if="scope.row.type === 'organization'"
               :type="DICT_TYPE.ORG_CERT"
-              :value="scope.row.classify"
-            />
+              :value="scope.row.classify" />
             <dict-tag v-else :type="DICT_TYPE.PERSON_CERT" :value="scope.row.classify" />
           </template>
         </el-table-column>
@@ -384,8 +391,7 @@
           width="150"
           align="center"
           prop="certName"
-          show-overflow-tooltip
-        />
+          show-overflow-tooltip />
 
         <el-table-column label="所属人" align="center" prop="userName" />
         <el-table-column label="所在部门" align="center" prop="deptName" />
@@ -417,8 +423,7 @@
         :total="total2"
         v-model:page="queryParams2.pageNo"
         v-model:limit="queryParams2.pageSize"
-        @pagination="getCertList"
-      />
+        @pagination="getCertList" />
     </div>
 
     <template #footer>
@@ -440,8 +445,7 @@
             placeholder="请输入JSA序号"
             clearable
             @keyup.enter="handleQuery3"
-            class="!w-200px"
-          />
+            class="!w-200px" />
         </el-form-item>
         <el-form-item>
           <el-button @click="handleQuery3"
@@ -460,8 +464,7 @@
             <el-radio
               :model-value="selectedJSA"
               :label="scope.row.jsaNo"
-              @change="handleRadioChange2(scope.row)"
-            >
+              @change="handleRadioChange2(scope.row)">
               &nbsp;
             </el-radio>
           </template>
@@ -501,8 +504,7 @@
         :total="total3"
         v-model:page="queryParams3.pageNo"
         v-model:limit="queryParams3.pageSize"
-        @pagination="getJSAList"
-      />
+        @pagination="getJSAList" />
     </div>
 
     <template #footer>
@@ -514,14 +516,13 @@
   <FilePreviewDialog
     v-model="filePreviewVisible"
     :title="filePreviewTitle"
-    :urls="filePreviewUrls"
-  />
+    :urls="filePreviewUrls" />
 </template>
 
 <script setup lang="ts">
 import { QHSEPtwApi, IotMeasureCertApi, QHSEJsaApi } from '@/api/pms/qhse/index'
 import DeptTree from '@/views/system/user/DeptTree2.vue'
-import { handleTree } from '@/utils/tree'
+import { handleTree, defaultProps } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
 import { ElMessageBox, ElMessage } from 'element-plus'
 const deptList2 = ref<Tree[]>([]) // 树形结构
@@ -601,7 +602,8 @@ const formRules = {
   guardian: [{ required: true, message: '监护人不能为空', trigger: 'blur' }],
   workLocation: [{ required: true, message: '作业地点不能为空', trigger: 'blur' }],
   workContent: [{ required: true, message: '作业内容不能为空', trigger: 'blur' }],
-  ptwXh: [{ required: true, message: '作业票编号不能为空', trigger: 'blur' }],
+  ptwXh: [{ required: true, message: '序号不能为空', trigger: 'blur' }],
+  ptwNo: [{ required: true, message: '作业票编号不能为空', trigger: 'blur' }],
   ptwGrade: [{ required: true, message: '作业票等级不能为空', trigger: 'blur' }],
   ptwType: [{ required: true, message: '作业票类型不能为空', trigger: 'blur' }],
   file: [{ required: true, message: '附件不能为空', trigger: 'blur' }],
@@ -690,6 +692,7 @@ const handleAdd = () => {
   isEdit.value = false
   dialogTitle.value = '新增'
   resetForm()
+  formData.value.deptId = userStore.getUser.deptId
   dialogVisible.value = true
 }
 

+ 16 - 4
src/views/pms/qhse/safety/index.vue

@@ -39,16 +39,21 @@
           </el-form-item>
 
           <el-form-item>
-            <el-button @click="handleAdd" type="primary"
+            <el-button @click="handleAdd" type="primary" v-hasPermi="['rq:iot-hazard:create']"
               ><Icon icon="ep:plus" class="mr-5px" />新增</el-button
             >
-            <el-button @click="handleQuery"
+            <el-button @click="handleQuery" v-hasPermi="['rq:iot-hazard:query']"
               ><Icon icon="ep:search" class="mr-5px" /> {{ t('devicePerson.search') }}</el-button
             >
             <el-button @click="resetQuery"
               ><Icon icon="ep:refresh" class="mr-5px" /> {{ t('devicePerson.reset') }}</el-button
             >
-            <el-button @click="handleExport" type="success" plain :loading="exportLoading"
+            <el-button
+              @click="handleExport"
+              type="success"
+              plain
+              :loading="exportLoading"
+              v-hasPermi="['rq:iot-hazard:export']"
               ><Icon icon="ep:download" class="mr-5px" /> 导出</el-button
             >
           </el-form-item>
@@ -203,10 +208,17 @@
                 v-if="scope.row.status === 'todo'"
                 link
                 type="primary"
+                v-hasPermi="['rq:iot-hazard:update']"
                 @click="handleEdit(scope.row)">
                 编辑
               </el-button>
-              <el-button link type="danger" @click="handleDelete(scope.row.id)"> 删除 </el-button>
+              <el-button
+                v-hasPermi="['rq:iot-hazard:delete']"
+                link
+                type="danger"
+                @click="handleDelete(scope.row.id)">
+                删除
+              </el-button>
             </template>
           </zm-table-column>
         </zm-table>