yanghao 18 uur geleden
bovenliggende
commit
a9ceffb963
2 gewijzigde bestanden met toevoegingen van 408 en 21 verwijderingen
  1. 10 2
      src/views/pms/qhse/faultReport/index.vue
  2. 398 19
      src/views/pms/qhse/ptw/index.vue

+ 10 - 2
src/views/pms/qhse/faultReport/index.vue

@@ -3,7 +3,15 @@
     <DeptTree @node-click="handleDeptNodeClick" v-model:collapsed="isLeftContentCollapsed" />
 
     <el-col :xs="24" :span="isLeftContentCollapsed ? 24 : 20">
-      <ContentWrap style="border: 0">
+      <el-alert
+        title=""
+        type="warning"
+        :closable="false"
+        description="发生C级事故,应1小时内上报到专业公司,24小时内上报到集团运营共享中心及总裁;
+发生B级事故,应半小时内上报到专业公司,12小时内上报到集团运营共享中心及总裁;发生A级事故,应立即上报到专业公司,2小时内上报到集团运营共享中心及总裁;严谨迟报、漏报、瞒报!!!"
+      />
+
+      <ContentWrap style="border: 0; margin-top: 10px">
         <el-form
           class="-mb-15px"
           :model="queryParams"
@@ -63,7 +71,7 @@
           style="width: 100%"
           :header-cell-style="{ background: '#f5f7fa', color: '#333', height: '50px' }"
           :cell-style="{ padding: '12px 8px' }"
-          height="calc(85vh - 115px)"
+          height="calc(80vh - 115px)"
           :max-height="tableHeight"
         >
           <el-table-column prop="actualTime" label="事件时间" align="center" min-width="150">

+ 398 - 19
src/views/pms/qhse/ptw/index.vue

@@ -160,7 +160,7 @@
   </el-row>
 
   <!-- 新增/编辑证书对话框 -->
-  <el-dialog
+  <Dialog
     :title="dialogTitle"
     v-model="dialogVisible"
     width="600px"
@@ -174,6 +174,13 @@
       label-width="120px"
       v-loading="formLoading"
     >
+      <el-form-item label="JSA序号" prop="ptwNo">
+        <el-input v-model="formData.ptwNo" disabled placeholder="选择JSA序号" style="width: 300px">
+          <template #append>
+            <el-link @click="selectJSA" :underline="false">选择</el-link>
+          </template>
+        </el-input>
+      </el-form-item>
       <el-form-item label="序号" prop="ptwXh">
         <el-input v-model="formData.ptwXh" placeholder="请输入序号" />
       </el-form-item>
@@ -187,10 +194,11 @@
         />
       </el-form-item>
 
-      <el-form-item label="作业分级" prop="ptwGrade">
-        <el-select v-model="formData.ptwGrade" placeholder="请选择作业分级">
+      <!-- 作业票类型 -->
+      <el-form-item label="作业票类型" prop="ptwType">
+        <el-select v-model="formData.ptwType" placeholder="请选择作业票类型">
           <el-option
-            v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_GRADE)"
+            v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_TYPE)"
             :key="item.value"
             :label="item.label"
             :value="item.value"
@@ -198,11 +206,10 @@
         </el-select>
       </el-form-item>
 
-      <!-- 作业票类型 -->
-      <el-form-item label="作业票类型" prop="ptwType">
-        <el-select v-model="formData.ptwType" placeholder="请选择作业票类型">
+      <el-form-item label="作业分级" prop="ptwGrade">
+        <el-select v-model="formData.ptwGrade" placeholder="请选择作业分级">
           <el-option
-            v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_TYPE)"
+            v-for="item in getDictOptions(DICT_TYPE.QHSE_PTW_GRADE)"
             :key="item.value"
             :label="item.label"
             :value="item.value"
@@ -214,8 +221,27 @@
         <el-input v-model="formData.workLocation" placeholder="请输入作业地点" />
       </el-form-item>
 
+      <el-form-item label="作业时间" prop="ptwTime">
+        <el-date-picker
+          v-model="formData.ptwTime"
+          type="date"
+          value-format="x"
+          placeholder="请选择作业时间"
+          style="width: 100%"
+        />
+      </el-form-item>
+
       <el-form-item label="作业人员" prop="workPerson">
-        <el-input v-model="formData.workPerson" placeholder="请输入作业人员" />
+        <el-input
+          v-model="formData.workPerson"
+          disabled
+          placeholder="作业人员"
+          style="width: 300px"
+        >
+          <template #append>
+            <el-link @click="selectworkPerson" :underline="false">选择</el-link>
+          </template>
+        </el-input>
       </el-form-item>
 
       <el-form-item label="监护人" prop="guardian">
@@ -251,9 +277,10 @@
       <el-button @click="closeDialog">取 消</el-button>
       <el-button type="primary" @click="submitForm" :loading="submitLoading">确 定</el-button>
     </template>
-  </el-dialog>
+  </Dialog>
 
-  <el-dialog v-model="dialogFileView" title="附件" width="500">
+  <!-- 文件查看对话框 -->
+  <Dialog v-model="dialogFileView" title="附件" width="500">
     <div
       v-for="(file, index) in fileList"
       :key="index"
@@ -275,7 +302,203 @@
         <el-button type="primary" @click="dialogFileView = false"> 确认 </el-button>
       </div>
     </template>
-  </el-dialog>
+  </Dialog>
+
+  <!-- 选择作业人员对话框 -->
+  <Dialog title="选择作业人员" v-model="personDialogVisible" width="60%">
+    <ContentWrap>
+      <!-- 搜索工作栏 -->
+      <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
+        <el-form-item label="所属人员" prop="userName">
+          <el-input
+            v-model="queryParams2.userName"
+            placeholder="请输入所属人员"
+            clearable
+            @keyup.enter="handleQuery2"
+            class="!w-200px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="handleQuery2"
+            ><Icon icon="ep:search" class="mr-5px" /> {{ t('devicePerson.search') }}</el-button
+          >
+          <el-button @click="resetQuery2"
+            ><Icon icon="ep:refresh" class="mr-5px" /> {{ t('devicePerson.reset') }}</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </ContentWrap>
+    <div class="pb-10">
+      <el-table
+        v-loading="loading"
+        :data="certList"
+        :stripe="true"
+        :show-overflow-tooltip="true"
+        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)"
+            >
+              &nbsp;
+            </el-radio>
+          </template>
+        </el-table-column>
+        <el-table-column :label="t('monitor.serial')" width="70" align="center">
+          <template #default="scope">
+            {{ scope.$index + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column label="证书类型" align="center" prop="type">
+          <template #default="scope">
+            {{ getCertificateTypeText(scope.row.type) }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="证书类别" align="center" width="150" prop="classify">
+          <template #default="scope">
+            <dict-tag
+              v-if="scope.row.type === 'organization'"
+              :type="DICT_TYPE.ORG_CERT"
+              :value="scope.row.classify"
+            />
+            <dict-tag v-else :type="DICT_TYPE.PERSON_CERT" :value="scope.row.classify" />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="证书名称"
+          width="150"
+          align="center"
+          prop="certName"
+          show-overflow-tooltip
+        />
+
+        <el-table-column label="所属人" align="center" prop="userName" />
+        <el-table-column label="所在部门" align="center" prop="deptName" />
+
+        <el-table-column label="颁发机构" align="center" prop="certOrg" width="120" />
+
+        <el-table-column label="证书标准" align="center" prop="certStandard" width="120" />
+
+        <el-table-column label="颁发时间" align="center" prop="certIssue">
+          <template #default="scope">
+            {{ formatDateCorrectly(scope.row.certIssue) }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="有效期" align="center">
+          <template #default="scope">
+            {{ formatDateCorrectly(scope.row.certExpire) }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="到期提醒" align="center">
+          <template #default="scope"> {{ scope.row.noticeBefore }}天前提醒 </template>
+        </el-table-column>
+
+        <el-table-column label="备注" align="center" prop="remark" />
+      </el-table>
+      <!-- 分页 -->
+      <Pagination
+        :total="total2"
+        v-model:page="queryParams2.pageNo"
+        v-model:limit="queryParams2.pageSize"
+        @pagination="getCertList"
+      />
+    </div>
+
+    <template #footer>
+      <el-button @click="confirmSelectMeasure" type="primary">确 定</el-button>
+      <el-button @click="((personDialogVisible = false), (selectedPerson = undefined))"
+        >取 消</el-button
+      >
+    </template>
+  </Dialog>
+
+  <!-- 选择JSA 对话框 -->
+  <Dialog title="选择JSA序号" v-model="dialogJSA" width="60%">
+    <ContentWrap>
+      <!-- 搜索工作栏 -->
+      <el-form class="-mb-15px" :model="queryParams3" ref="queryFormRef" :inline="true">
+        <el-form-item label="JSA序号" prop="jsaXh">
+          <el-input
+            v-model="queryParams3.jsaXh"
+            placeholder="请输入JSA序号"
+            clearable
+            @keyup.enter="handleQuery3"
+            class="!w-200px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="handleQuery3"
+            ><Icon icon="ep:search" class="mr-5px" /> {{ t('devicePerson.search') }}</el-button
+          >
+          <el-button @click="resetQuery3"
+            ><Icon icon="ep:refresh" class="mr-5px" /> {{ t('devicePerson.reset') }}</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </ContentWrap>
+    <div class="pb-10">
+      <el-table v-loading="loading" :data="JSAList" :stripe="true" :show-overflow-tooltip="true">
+        <el-table-column width="50" align="center">
+          <template #default="scope">
+            <el-radio
+              :model-value="selectedJSA"
+              :label="scope.row.jsaNo"
+              @change="handleRadioChange2(scope.row)"
+            >
+              &nbsp;
+            </el-radio>
+          </template>
+        </el-table-column>
+        <el-table-column label="JSA序号" align="center" prop="jsaXh" />
+        <el-table-column label="编号" align="center" prop="jsaNo" />
+
+        <el-table-column label="日期" align="center" prop="jsaTime">
+          <template #default="{ row }">
+            {{ formatDate(row.jsaTime).substring(0, 10) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="工作任务" align="center" prop="jobTask" />
+
+        <el-table-column label="工作地点" align="center" prop="jobAddress" />
+
+        <el-table-column label="工作负责人" align="center" prop="jobDuty" />
+
+        <el-table-column label="附件" align="center" prop="jsaFile">
+          <template #default="{ row }">
+            <el-link
+              v-if="row.jsaFile"
+              :underline="false"
+              type="primary"
+              size="small"
+              @click="viewFile(row.jsaFile)"
+              >查看</el-link
+            >
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
+      </el-table>
+      <!-- 分页 -->
+      <Pagination
+        :total="total3"
+        v-model:page="queryParams3.pageNo"
+        v-model:limit="queryParams3.pageSize"
+        @pagination="getJSAList"
+      />
+    </div>
+
+    <template #footer>
+      <el-button @click="confirmSelectJSA" type="primary">确 定</el-button>
+      <el-button @click="((dialogJSA = false), (selectedJSA = undefined))">取 消</el-button>
+    </template>
+  </Dialog>
 
   <FilePreviewDialog
     v-model="filePreviewVisible"
@@ -285,18 +508,19 @@
 </template>
 
 <script setup lang="ts">
-import { QHSEPtwApi } from '@/api/pms/qhse/index'
+import { QHSEPtwApi, IotMeasureCertApi, QHSEJsaApi } from '@/api/pms/qhse/index'
 import DeptTree from '@/views/system/user/DeptTree2.vue'
 import { handleTree } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
 import { ElMessageBox, ElMessage } from 'element-plus'
 const deptList2 = ref<Tree[]>([]) // 树形结构
 import { formatDate } from '@/utils/formatTime'
-
+import { useUserStore } from '@/store/modules/user'
 import UploadFile from '@/components/UploadFile/src/UploadFile.vue'
 import FilePreviewDialog from '@/components/FilePreview/src/FilePreviewDialog.vue'
 import { DICT_TYPE, getStrDictOptions, getDictOptions } from '@/utils/dict'
-
+import { getUserProfile } from '@/api/system/user/profile'
+const userStore = useUserStore()
 defineOptions({ name: 'IotQHSEPTW' })
 
 const loading = ref(true) // 列表的加载中
@@ -315,6 +539,18 @@ const queryParams = reactive({
   deptId: '',
   address: ''
 })
+
+const queryParams2 = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  userName: ''
+})
+
+const queryParams3 = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  jsaXh: ''
+})
 const queryFormRef = ref(null) // 搜索的表单
 
 // 对话框相关
@@ -337,10 +573,13 @@ const formData = ref({
   workLocation: '',
   workContent: '',
   ptwXh: '',
+  ptwNo: '',
   ptwGrade: '',
   ptwType: '',
   file: '',
-  remark: ''
+  remark: '',
+  ptwTime: '',
+  jsaId: ''
 })
 
 // 表单验证规则
@@ -354,7 +593,8 @@ const formRules = {
   ptwXh: [{ required: true, message: '作业票编号不能为空', trigger: 'blur' }],
   ptwGrade: [{ required: true, message: '作业票等级不能为空', trigger: 'blur' }],
   ptwType: [{ required: true, message: '作业票类型不能为空', trigger: 'blur' }],
-  file: [{ required: true, message: '附件不能为空', trigger: 'blur' }]
+  file: [{ required: true, message: '附件不能为空', trigger: 'blur' }],
+  ptwTime: [{ required: true, message: '作业票时间不能为空', trigger: 'blur' }]
 }
 
 /** 查询列表 */
@@ -501,7 +741,8 @@ const resetForm = () => {
     ptwGrade: '',
     ptwType: '',
     file: '',
-    remark: ''
+    remark: '',
+    jsaId: ''
   }
   formRef.value?.clearValidate()
 }
@@ -511,7 +752,7 @@ const closeDialog = () => {
   dialogVisible.value = false
   resetForm()
 }
-
+let userInfo = ref()
 // 提交表单
 const submitForm = async () => {
   if (!formRef.value) return
@@ -525,12 +766,16 @@ const submitForm = async () => {
       ...formData.value
     }
 
+    // submitData.deptName = userInfo.value.dept.name
+
     if (isEdit.value) {
       // 编辑
       await QHSEPtwApi.updatePtw(submitData)
       ElMessage.success('编辑成功')
     } else {
       // 新增
+      submitData.deptId = userStore.getUser.deptId
+
       await QHSEPtwApi.createPtw(submitData)
       ElMessage.success('新增成功')
     }
@@ -594,7 +839,141 @@ const extractFileName = (url: string): string => {
 onMounted(async () => {
   getList()
   deptList2.value = handleTree(await DeptApi.getSimpleDeptList())
+
+  const users = await getUserProfile()
+  userInfo.value = users
+  console.log('xxxxxxxxxxxxxxxxxx', userInfo.value)
 })
+
+let personDialogVisible = ref(false)
+let certList = ref([])
+const selectedPerson = ref<string | undefined>(undefined)
+
+const getCertificateTypeText = (type: string) => {
+  const map: Record<string, string> = {
+    personal: '个人证书',
+    organization: '组织证书',
+    other: '其他'
+  }
+  return map[type] || type
+}
+
+// 正确格式化日期的函数
+const formatDateCorrectly = (timestamp) => {
+  if (!timestamp) return ''
+
+  // 如果是秒级时间戳,转换为毫秒级
+  let time = Number(timestamp)
+  if (time < 10000000000) {
+    // 小于这个数通常表示秒级时间戳
+    time = time * 1000
+  }
+
+  return formatDate(time).substring(0, 10)
+}
+
+let total2 = ref(0)
+const getCertList = async () => {
+  loading.value = true
+  try {
+    const data = await IotMeasureCertApi.getIotMeasureCertPage(queryParams2)
+    certList.value = data.list
+    total2.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+const confirmSelectMeasure = () => {
+  if (!selectedPerson.value) {
+    ElMessage.warning('请先选择一个计量器具')
+    return
+  }
+
+  // 将选中的仪器信息填入表单
+  formData.value.workPerson = selectedPerson.value
+
+  // 关闭选择仪器对话框
+  personDialogVisible.value = false
+  selectedPerson.value = undefined
+}
+const selectworkPerson = () => {
+  personDialogVisible.value = true
+  getCertList()
+}
+
+const handleRadioChange = (row: any) => {
+  selectedPerson.value = row.userName
+  // selectedMeasure.value = row
+}
+
+/** 搜索按钮操作 */
+const handleQuery2 = () => {
+  queryParams2.pageNo = 1
+  getCertList()
+}
+
+/** 重置按钮操作 */
+const resetQuery2 = () => {
+  queryParams2.userName = ''
+  queryFormRef.value?.resetFields()
+  handleQuery2()
+}
+
+// JSA序号***********************************88
+let dialogJSA = ref(false)
+let JSAList = ref([])
+let total3 = ref(0)
+const getJSAList = async () => {
+  loading.value = true
+  try {
+    const data = await QHSEJsaApi.getJsaList(queryParams3)
+    JSAList.value = data.list
+    total3.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+// 选择JSA序号
+const selectJSA = () => {
+  dialogJSA.value = true
+  getJSAList()
+}
+
+/** 搜索按钮操作 */
+const handleQuery3 = () => {
+  queryParams3.pageNo = 1
+  getJSAList()
+}
+
+/** 重置按钮操作 */
+const resetQuery3 = () => {
+  queryParams3.jsaXh = ''
+  queryFormRef.value?.resetFields()
+  handleQuery3()
+}
+
+let selectedJSA = ref<string | undefined>(undefined)
+const confirmSelectJSA = () => {
+  if (!selectedJSA.value) {
+    ElMessage.warning('请先选择一个JSA')
+    return
+  }
+
+  // 将选中的仪器信息填入表单
+  formData.value.ptwNo = selectedJSA.value
+  formData.value.jsaId = jsaId.value
+
+  // 关闭选择仪器对话框
+  dialogJSA.value = false
+  selectedJSA.value = undefined
+}
+let jsaId = ref(0)
+const handleRadioChange2 = (row: any) => {
+  console.log('row', row)
+  selectedJSA.value = row.jsaNo
+  jsaId.value = row.id
+}
 </script>
 
 <style scoped>