Просмотр исходного кода

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

yanghao 1 день назад
Родитель
Сommit
b28936c5d4

+ 4 - 4
src/views/pms/qhse/certificate.vue

@@ -212,9 +212,9 @@
                 </template>
               </zm-table-column>
 
-              <zm-table-column label="到期提醒" align="center">
+              <!-- <zm-table-column label="到期提醒" align="center">
                 <template #default="scope"> {{ scope.row.noticeBefore }}天前提醒 </template>
-              </zm-table-column>
+              </zm-table-column> -->
 
               <zm-table-column label="备注" align="center" prop="remark" />
               <zm-table-column
@@ -348,14 +348,14 @@
           style="width: 100%" />
       </el-form-item>
 
-      <el-form-item label="到期前提醒" prop="noticeBefore">
+      <!-- <el-form-item label="到期前提醒" prop="noticeBefore">
         <el-input-number
           v-model="formData.noticeBefore"
           :min="0"
           :max="365"
           placeholder="请输入提前多少天提醒"
           style="width: 100%" />
-      </el-form-item>
+      </el-form-item> -->
 
       <el-form-item label="备注" prop="remark">
         <el-input

+ 2 - 2
src/views/pms/qhse/deviceCert/DeviceCertForm.vue

@@ -10,7 +10,7 @@
         <el-col :span="12">
           <el-form-item label="关联设备" prop="deviceId">
             <el-input
-              v-model="formData.deviceName"
+              v-model="formData.deviceCode"
               disabled
               placeholder="请选择关联设备"
               style="width: 100%">
@@ -260,7 +260,7 @@ const createDefaultFormData = () => ({
 const formData = ref(createDefaultFormData())
 
 const formRules = reactive({
-  // deviceId: [{ required: true, message: '关联设备不能为空', trigger: 'blur' }],
+  deviceId: [{ required: true, message: '关联设备不能为空', trigger: 'blur' }],
   deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
   deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
   certNo: [{ required: true, message: '证书编号不能为空', trigger: 'blur' }],

+ 1 - 0
src/views/pms/qhse/deviceCert/index.vue

@@ -120,6 +120,7 @@
                   {{ scope.$index + 1 }}
                 </template>
               </zm-table-column>
+              <zm-table-column label="设备编码" align="center" prop="deviceCode" />
               <zm-table-column label="设备名称" align="center" prop="deviceName" />
               <zm-table-column label="检测类型" align="center" width="100">
                 <template #default="scope">

+ 39 - 8
src/views/pms/qhse/emergencyDrill/EmergencyDrillForm.vue

@@ -22,37 +22,50 @@
       </el-row>
 
       <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="是否录入证书" prop="ifCert">
+            <el-radio-group v-model="formData.ifCert">
+              <el-radio
+                v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                :key="dict.value"
+                :value="dict.value">
+                {{ dict.label }}
+              </el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="数量" prop="emergencyNumber">
             <el-input-number
               v-model="formData.emergencyNumber"
+              :disabled="isCertEntered"
               :min="0"
               :precision="0"
               controls-position="right"
               class="!w-full" />
           </el-form-item>
         </el-col>
+      </el-row>
+
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="存放位置" prop="emergencyLocation">
             <el-input v-model="formData.emergencyLocation" placeholder="请输入存放位置" />
           </el-form-item>
         </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="责任人" prop="dutyPerson">
             <el-input v-model="formData.dutyPerson" placeholder="请输入责任人" />
           </el-form-item>
         </el-col>
+      </el-row>
+
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="联系电话" prop="mobile">
             <el-input v-model="formData.mobile" placeholder="请输入联系电话" />
           </el-form-item>
         </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="部门" prop="deptId">
             <el-tree-select
@@ -67,6 +80,9 @@
               style="width: 100%" />
           </el-form-item>
         </el-col>
+      </el-row>
+
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="附件" prop="file">
             <UploadFile
@@ -105,6 +121,7 @@ import { defaultProps, handleTree } from '@/utils/tree'
 import * as DeptApi from '@/api/system/dept'
 import { useUserStore } from '@/store/modules/user'
 import { getUserProfile } from '@/api/system/user/profile'
+import { DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
 
 defineOptions({ name: 'QHSEEmergencyDrillForm' })
 
@@ -128,16 +145,21 @@ const createDefaultFormData = () => ({
   mobile: '',
   file: '',
   deptId: undefined,
-  remark: ''
+  remark: '',
+  ifCert: ''
 })
 
 const formData = ref(createDefaultFormData())
 
+const isCertEntered = computed(() => formData.value.ifCert === true)
+
 const formRules = reactive({
   emergencyName: [{ required: true, message: '应急物资名称不能为空', trigger: 'blur' }],
   emergencyUnit: [{ required: true, message: '应急物资单位不能为空', trigger: 'blur' }],
   dutyPerson: [{ required: true, message: '责任人不能为空', trigger: 'blur' }],
-  deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }]
+  deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
+  ifCert: [{ required: true, message: '请选择是否录入证书', trigger: 'change' }],
+  emergencyNumber: [{ required: true, message: '数量不能为空', trigger: 'blur' }]
 })
 
 const emit = defineEmits(['success'])
@@ -147,6 +169,15 @@ const resetForm = () => {
   formRef.value?.resetFields()
 }
 
+watch(
+  () => formData.value.ifCert,
+  (value) => {
+    if (value === true) {
+      formData.value.emergencyNumber = 1
+    }
+  }
+)
+
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
   dialogTitle.value = t('action.' + type)

+ 13 - 1
src/views/pms/qhse/iotmeasuredetect/IotMeasureDetectForm.vue

@@ -117,6 +117,15 @@
             class="!w-200px" />
         </el-form-item>
 
+        <el-form-item label="序列号" prop="serialNo">
+          <el-input
+            v-model="queryParams.serialNo"
+            placeholder="请输入序列号"
+            clearable
+            @keyup.enter="handleQuery"
+            class="!w-200px" />
+        </el-form-item>
+
         <el-form-item label="计量器具编码" prop="measureName">
           <el-input
             v-model="queryParams.measureCode"
@@ -167,6 +176,7 @@
           </template>
         </zm-table-column>
         <zm-table-column label="计量器具编码" align="center" prop="measureCode" />
+        <zm-table-column label="序列号" align="center" prop="serialNo" />
         <zm-table-column label="计量器具名称" align="center" prop="measureName" />
         <zm-table-column label="计量单位" align="center" prop="measureUnit" />
 
@@ -380,7 +390,8 @@ const queryParams = reactive({
   measureName: undefined,
   measureCode: undefined,
   deptId: undefined,
-  dutyPerson: undefined
+  dutyPerson: undefined,
+  serialNo: undefined
 })
 
 const handleQuery = () => {
@@ -392,6 +403,7 @@ const resetQuery = () => {
   queryParams.measureCode = undefined
   queryParams.deptId = undefined
   queryParams.dutyPerson = undefined
+  queryParams.serialNo = undefined
   handleQuery()
 }
 // 仪器选择相关

+ 113 - 2
src/views/pms/qhse/iotmeasuredetect/index.vue

@@ -89,6 +89,7 @@
                 </template>
               </zm-table-column>
               <zm-table-column label="计量器具编码" align="center" prop="measureCode" />
+              <zm-table-column label="序列号" align="center" prop="serialNo" />
               <zm-table-column label="计量器具名称" align="center" prop="measureName" />
               <zm-table-column label="证书编码" align="center" prop="measureCertNo" />
               <zm-table-column label="检测/校准日期" align="center" prop="detectDate" width="140">
@@ -98,9 +99,19 @@
               </zm-table-column>
               <zm-table-column label="检测/校准机构" align="center" prop="detectOrg" />
               <zm-table-column label="检测/校准标准" align="center" prop="detectStandard" />
-              <zm-table-column label="检测/校准内容" align="center" prop="detectContent">
+              <zm-table-column
+                label="检测/校准内容"
+                align="center"
+                prop="detectContent"
+                width="140">
                 <template #default="scope">
-                  <div class="detect-content" v-html="scope.row.detectContent"></div>
+                  <el-button
+                    v-if="getDetectContentText(scope.row.detectContent) !== '-'"
+                    link
+                    type="primary"
+                    @click="openDetectContentDialog(scope.row.detectContent)">
+                    查看详情
+                  </el-button>
                 </template>
               </zm-table-column>
               <zm-table-column
@@ -175,6 +186,14 @@
   </Dialog>
 
   <!-- 表单弹窗:添加/修改 -->
+  <Dialog v-model="detectContentDialogVisible" title="检测/校准内容" width="720">
+    <div
+      v-if="detectContentDialogHtml"
+      class="detect-content-rich"
+      v-html="detectContentDialogHtml"></div>
+    <el-empty v-else description="暂无内容" />
+  </Dialog>
+
   <IotMeasureDetectForm ref="formRef" @success="getList" />
 </template>
 
@@ -269,6 +288,33 @@ const formatDateCorrectly = (timestamp) => {
   return formatDate(time).substring(0, 10)
 }
 /** 重置按钮操作 */
+const stripHtml = (html?: string) => {
+  if (!html) return ''
+  if (typeof window === 'undefined') {
+    return html
+      .replace(/<[^>]+>/g, ' ')
+      .replace(/\s+/g, ' ')
+      .trim()
+  }
+
+  const div = document.createElement('div')
+  div.innerHTML = html
+  return (div.textContent || div.innerText || '')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\s+/g, ' ')
+    .trim()
+}
+
+const getDetectContentText = (html?: string) => {
+  return stripHtml(html) || '-'
+}
+
+const getDetectContentSummary = (html?: string, maxLength = 36) => {
+  const text = getDetectContentText(html)
+  if (text === '-' || text.length <= maxLength) return text
+  return `${text.slice(0, maxLength)}...`
+}
+
 const resetQuery = () => {
   queryFormRef.value.resetFields()
   handleQuery()
@@ -310,6 +356,14 @@ const handleExport = async () => {
 
 let dialogFileView = ref(false)
 let fileList = ref([])
+const detectContentDialogVisible = ref(false)
+const detectContentDialogHtml = ref('')
+
+const openDetectContentDialog = (html?: string) => {
+  detectContentDialogHtml.value = html || ''
+  detectContentDialogVisible.value = true
+}
+
 const viewFile = (file) => {
   fileList.value = file.split(',')
   dialogFileView.value = true
@@ -368,4 +422,61 @@ onMounted(() => {
   margin-right: 12px;
   color: var(--el-text-color-primary);
 }
+
+.detect-content-text {
+  display: block;
+  width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  color: var(--el-text-color-primary);
+  cursor: default;
+}
+
+.detect-content-cell {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 8px;
+  width: 100%;
+}
+
+.detect-content-rich {
+  max-height: 60vh;
+  overflow-y: auto;
+  padding: 4px 2px;
+  line-height: 1.75;
+  color: var(--el-text-color-primary);
+  word-break: break-word;
+}
+
+.detect-content-rich :deep(p) {
+  margin: 0 0 12px;
+}
+
+.detect-content-rich :deep(ul),
+.detect-content-rich :deep(ol) {
+  margin: 0 0 12px;
+  padding-left: 20px;
+}
+
+.detect-content-rich :deep(li) {
+  margin-bottom: 6px;
+}
+
+.detect-content-rich :deep(img) {
+  max-width: 100%;
+  height: auto;
+}
+
+.detect-content-rich :deep(table) {
+  width: 100%;
+  border-collapse: collapse;
+}
+
+.detect-content-rich :deep(td),
+.detect-content-rich :deep(th) {
+  border: 1px solid var(--el-border-color-lighter);
+  padding: 8px;
+}
 </style>