Przeglądaj źródła

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

yanghao 5 dni temu
rodzic
commit
a805f6dacb

+ 2 - 1
src/utils/dict.ts

@@ -327,7 +327,8 @@ export enum DICT_TYPE {
   QHSE_HAZARD_STATUS = 'qhse_hazard_status',
   QHSE_PTW_TYPE = 'qhse_ptw_type',
   QHSE_PTW_GRADE = 'qhse_ptw_grade',
-  QHSE_HAZARD_SOURCE = 'hazard_soure'
+  QHSE_HAZARD_SOURCE = 'hazard_soure',
+  QHSE_DEVICE_CERT_TYPE = 'qhse_device_cert_type'
 }
 
 export function realValue(type: any, value: string) {

+ 24 - 15
src/views/pms/qhse/deviceCert/DeviceCertForm.vue

@@ -34,11 +34,6 @@
       </el-row>
 
       <el-row :gutter="20">
-        <!-- <el-col :span="12">
-          <el-form-item label="设备编码" prop="deviceCode">
-            <el-input v-model="formData.deviceCode" placeholder="请输入设备编码" />
-          </el-form-item>
-        </el-col> -->
         <el-col :span="12">
           <el-form-item label="设备名称" prop="deviceName">
             <el-input v-model="formData.deviceName" placeholder="请输入设备名称" />
@@ -46,19 +41,34 @@
         </el-col>
 
         <el-col :span="12">
-          <el-form-item label="证书编号" prop="certNo">
-            <el-input v-model="formData.certNo" placeholder="请输入证书编号" />
+          <el-form-item label="检测类型" prop="certType">
+            <!-- <el-input v-model="formData.certType" placeholder="请输入设备名称" /> -->
+
+            <el-select v-model="formData.certType" placeholder="请选择检测类型" clearable>
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_DEVICE_CERT_TYPE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value" />
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
 
       <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="证书编号" prop="certNo">
+            <el-input v-model="formData.certNo" placeholder="请输入证书编号" />
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="检测单位" prop="certOrg">
             <el-input v-model="formData.certOrg" placeholder="请输入检测单位" />
           </el-form-item>
         </el-col>
+      </el-row>
 
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="检测日期" prop="certTime">
             <el-date-picker
@@ -69,9 +79,6 @@
               style="width: 100%" />
           </el-form-item>
         </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="有效期至" prop="certExpire">
             <el-date-picker
@@ -82,7 +89,9 @@
               style="width: 100%" />
           </el-form-item>
         </el-col>
+      </el-row>
 
+      <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="部门" prop="deptId">
             <el-tree-select
@@ -97,9 +106,6 @@
               style="width: 100%" />
           </el-form-item>
         </el-col>
-      </el-row>
-
-      <el-row :gutter="20">
         <el-col :span="24">
           <el-form-item label="附件" prop="file">
             <UploadFile
@@ -223,6 +229,7 @@ import { defaultProps, handleTree } from '@/utils/tree'
 import { onMounted, reactive, ref } from 'vue'
 import * as DeptApi from '@/api/system/dept'
 import { useUserStore } from '@/store/modules/user'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 defineOptions({ name: 'QHSEDeviceCertForm' })
 
 const { t } = useI18n()
@@ -246,7 +253,8 @@ const createDefaultFormData = () => ({
   certExpire: undefined,
   file: '',
   remark: '',
-  deviceCode: ''
+  deviceCode: '',
+  certType: ''
 })
 
 const formData = ref(createDefaultFormData())
@@ -260,7 +268,8 @@ const formRules = reactive({
   certTime: [{ required: true, message: '检测日期不能为空', trigger: 'blur' }],
   certExpire: [{ required: true, message: '有效期不能为空', trigger: 'blur' }],
   file: [{ required: true, message: '请上传附件', trigger: 'blur' }],
-  deptId: [{ required: true, message: '所在部门不能为空', trigger: 'blur' }]
+  deptId: [{ required: true, message: '所在部门不能为空', trigger: 'blur' }],
+  certType: [{ required: true, message: '检测类型不能为空', trigger: 'blur' }]
 })
 
 const emit = defineEmits(['success'])

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

@@ -24,6 +24,20 @@
               clearable
               class="!w-150px" />
           </el-form-item>
+
+          <el-form-item label="检测类型" prop="certType">
+            <el-select
+              v-model="queryParams.certType"
+              placeholder="请选择检测类型"
+              clearable
+              style="width: 150px">
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.QHSE_DEVICE_CERT_TYPE)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value" />
+            </el-select>
+          </el-form-item>
           <el-form-item label="证书编号" prop="certNo">
             <el-input
               v-model="queryParams.certNo"
@@ -107,6 +121,11 @@
                 </template>
               </zm-table-column>
               <zm-table-column label="设备名称" align="center" prop="deviceName" />
+              <zm-table-column label="检测类型" align="center" width="100">
+                <template #default="scope">
+                  <dict-tag :type="DICT_TYPE.QHSE_DEVICE_CERT_TYPE" :value="scope.row.certType" />
+                </template>
+              </zm-table-column>
               <zm-table-column label="证书编号" align="center" prop="certNo" />
               <zm-table-column label="检测日期" align="center" prop="certTime" width="140">
                 <template #default="scope">
@@ -218,6 +237,7 @@ import DeptTreeSelect from '@/components/DeptTreeSelect/index.vue'
 import { useTableComponents } from '@/components/ZmTable/useTableComponents'
 const { ZmTable, ZmTableColumn } = useTableComponents()
 import { useUserStore } from '@/store/modules/user'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 
 /** 应检设备证书 列表 */
 defineOptions({ name: 'QHSEDeviceCert' })
@@ -241,7 +261,8 @@ const queryParams = reactive({
   certTime: [],
   certExpire: undefined,
   createTime: [],
-  deptId: undefined
+  deptId: undefined,
+  certType: undefined
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中

+ 80 - 59
src/views/report-statistics/fault_report/index.vue

@@ -5,7 +5,7 @@
       <!-- 统计卡片 -->
       <el-row :gutter="18" class="mb-4">
         <el-col :span="4">
-          <div style="background-color: #fff; border-radius: 10px; cursor: pointer">
+          <div style="background-color: transparent; border-radius: 10px; cursor: pointer">
             <div
               class="stat-card bg-blue-gradient"
               :class="{ 'stat-card-selected': statusList.all }"
@@ -14,21 +14,19 @@
                   queryParams.pageNo = 1
                   getList('all')
                 }
-              "
-            >
-              <Icon icon="ep:histogram" :size="40" />
+              ">
+              <Icon icon="ep:histogram" class="text-[#409eff]" :size="40" />
               <div class="card-title">故障总数</div>
               <div class="card-value pt-5">
                 <CountTo
-                  class="text-3xl"
+                  class="text-3xl text-[#409eff]!"
                   :end-val="
                     statusCount.finished +
                       statusCount.trans +
                       statusCount.reporting +
                       statusCount.close || 0
                   "
-                  :decimals="0"
-                />
+                  :decimals="0" />
               </div>
             </div>
           </div>
@@ -44,12 +42,14 @@
                   queryParams.pageNo = 1
                   getList('finished')
                 }
-              "
-            >
-              <Icon icon="ep:finished" :size="40" />
+              ">
+              <Icon icon="ep:finished" class="text-[#239443]" :size="40" />
               <div class="card-title">维修完成</div>
               <div class="card-value pt-5">
-                <CountTo class="text-3xl" :end-val="statusCount.finished || 0" :decimals="0" />
+                <CountTo
+                  class="text-3xl text-[#239443]!"
+                  :end-val="statusCount.finished || 0"
+                  :decimals="0" />
               </div>
             </div>
           </div>
@@ -65,12 +65,14 @@
                   queryParams.pageNo = 1
                   getList('trans')
                 }
-              "
-            >
-              <Icon icon="ep:more-filled" :size="40" />
+              ">
+              <Icon icon="ep:more-filled" class="text-[#e8a748]" :size="40" />
               <div class="card-title">转工单</div>
               <div class="card-value pt-5">
-                <CountTo class="text-3xl" :end-val="statusCount.trans || 0" :decimals="0" />
+                <CountTo
+                  class="text-3xl text-[#e8a748]!"
+                  :end-val="statusCount.trans || 0"
+                  :decimals="0" />
               </div>
             </div>
           </div>
@@ -79,19 +81,21 @@
         <el-col :span="4">
           <div style="background-color: #fff; border-radius: 10px">
             <div
-              class="stat-card bg-red-gradient"
+              class="stat-card bg-blue-gradient2"
               :class="{ 'stat-card-selected': statusList.reporting }"
               @click="
                 () => {
                   queryParams.pageNo = 1
                   getList('reporting')
                 }
-              "
-            >
-              <Icon icon="ep:promotion" :size="40" />
+              ">
+              <Icon icon="ep:promotion" class="text-[#0881d9]" :size="40" />
               <div class="card-title">上报中</div>
               <div class="card-value pt-5">
-                <CountTo class="text-3xl" :end-val="statusCount.reporting || 0" :decimals="0" />
+                <CountTo
+                  class="text-3xl text-[#0881d9]!"
+                  :end-val="statusCount.reporting || 0"
+                  :decimals="0" />
               </div>
             </div>
           </div>
@@ -107,12 +111,14 @@
                   queryParams.pageNo = 1
                   getList('close')
                 }
-              "
-            >
-              <Icon icon="ep:close" :size="40" />
+              ">
+              <Icon icon="ep:close" class="text-[#f56d6d]" :size="40" />
               <div class="card-title">关闭</div>
               <div class="card-value pt-5">
-                <CountTo class="text-3xl" :end-val="statusCount.close || 0" :decimals="0" />
+                <CountTo
+                  class="text-3xl text-[#f56d6d]!"
+                  :end-val="statusCount.close || 0"
+                  :decimals="0" />
               </div>
             </div>
           </div>
@@ -175,8 +181,7 @@
           :data="list"
           height="48vh"
           :stripe="true"
-          :show-overflow-tooltip="true"
-        >
+          :show-overflow-tooltip="true">
           <zm-table-column :label="t('fault.serial')" width="70" align="center">
             <template #default="scope">
               {{ scope.$index + 1 }}
@@ -195,8 +200,7 @@
             :label="t('faultForm.failureType')"
             align="center"
             prop="failureType"
-            min-width="110"
-          >
+            min-width="110">
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.FAILURE_TYPE" :value="scope.row.failureType" />
             </template>
@@ -209,8 +213,7 @@
             :label="t('fault.approvalStatus')"
             align="center"
             prop="auditStatus"
-            min-width="130"
-          >
+            min-width="130">
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
             </template>
@@ -225,8 +228,7 @@
             align="center"
             prop="failureTime"
             :formatter="dateFormatter"
-            min-width="180px"
-          />
+            min-width="180px" />
           <zm-table-column :label="t('fault.solveTime')" align="center" prop="dealHour">
             <template #default="scope">
               {{ scope.row.dealHour && scope.row.dealHour > 0 ? scope.row.dealHour + 'H' : '' }}
@@ -238,8 +240,7 @@
             prop="createTime"
             :formatter="dateFormatter"
             min-width="180px"
-            action
-          />
+            action />
         </zm-table>
 
         <!-- 分页 -->
@@ -247,8 +248,7 @@
           :total="total"
           v-model:page="queryParams.pageNo"
           v-model:limit="queryParams.pageSize"
-          @pagination="getAllList"
-        />
+          @pagination="getAllList" />
       </ContentWrap>
     </el-col>
   </el-row>
@@ -484,35 +484,37 @@ watch(
 }
 
 .stat-card {
-  padding: 20px;
+  padding: 14px 16px;
   border-radius: 10px;
-  color: white;
   text-align: center;
   font-size: 14px;
-  /* box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); */
   transition:
     transform 0.3s ease,
-    box-shadow 0.3s ease;
-  backdrop-filter: blur(12px);
+    box-shadow 0.3s ease,
+    border-color 0.3s ease;
   height: 170px;
   cursor: pointer;
   overflow: hidden; /* 防止闪光效果溢出 */
-}
-.stat-card::before {
-  position: absolute;
-  filter: blur(20px);
-  z-index: -1;
+  background: linear-gradient(180deg, #ffffff 0%, #f7faff 100%);
+
+  box-shadow: 0 4px 12px rgb(31 91 184 / 8%);
+  color: #6b7280;
 }
 
 .card-title {
   margin: 8px 0;
-  font-size: 16px;
+  font-size: 14px;
+  font-weight: 600;
+  color: #6b7280;
+  line-height: 1.4;
 }
 
 .card-value {
-  font-size: 28px;
-  font-weight: bold;
   margin: 8px 0;
+  font-size: 28px;
+  font-weight: 700;
+  line-height: 1;
+  color: #1f5bb8;
 }
 
 .card-trend {
@@ -522,23 +524,43 @@ watch(
 
 /* 毛玻璃渐变背景 —— 不再使用 background-image */
 .bg-blue-gradient {
-  background: linear-gradient(135deg, rgba(77, 147, 255, 0.5), rgba(75, 132, 254));
+  background: linear-gradient(180deg, #ffffff 0%, #f7faff 100%);
+  border-color: #e4ecf7;
+}
+.bg-blue-gradient2 {
+  background: linear-gradient(180deg, #ffffff 0%, #a5d1ff 100%);
+  border-color: #e4ecf7;
+}
+
+.bg-blue-gradient .card-value {
+  color: #2563eb;
 }
 
 .bg-green-gradient {
-  background: linear-gradient(135deg, rgba(101, 226, 136, 0.3), #52d7a2);
+  background: linear-gradient(180deg, #f7fcf8 0%, #edf8f1 100%);
+  border-color: #d6efdc;
+}
+
+.bg-green-gradient .card-value {
+  color: #16a34a;
 }
 
 .bg-orange-gradient {
-  background: linear-gradient(135deg, rgba(152, 82, 4, 0.5), rgba(255, 152, 4, 0.6));
+  background: linear-gradient(180deg, #fff8ef 0%, #ffeed9 100%);
+  border-color: #ffd7a1;
+}
+
+.bg-orange-gradient .card-value {
+  color: #d97706;
 }
 
 .bg-red-gradient {
-  background: linear-gradient(135deg, rgba(232, 65, 51), rgba(252, 242, 236));
+  background: linear-gradient(180deg, #fff4f4 0%, #ffe8e8 100%);
+  border-color: #ffcfcf;
 }
 
-.bg-warn-gradient {
-  background: linear-gradient(135deg, rgba(255, 201, 103), rgba(243, 162, 152));
+.bg-red-gradient .card-value {
+  color: #de3b3b;
 }
 
 /* 确保内容不溢出 */
@@ -561,10 +583,9 @@ watch(
 
 .stat-card-selected {
   position: relative;
-  transform: scale(1.06);
+  transform: translateY(-2px);
   transition: all 0.2s;
-  box-shadow:
-    0 10px 10px rgba(0, 80, 179, 0.5),
-    0 0 10px rgba(0, 120, 255, 0.4) inset;
+  box-shadow: 0 10px 20px rgb(31 91 184 / 12%);
+  border-color: #bfd5ee;
 }
 </style>

+ 1 - 1
src/views/report-statistics/inspection_order/index.vue

@@ -691,7 +691,7 @@ onMounted(() => {
 .stat-card {
   padding: 14px 16px;
   background: linear-gradient(180deg, #ffffff 0%, #f7faff 100%);
-  border: 1px solid #e4ecf7;
+  /* border: 1px solid #e4ecf7; */
   border-radius: 10px;
   box-shadow: 0 4px 12px rgb(31 91 184 / 8%);
   text-align: center;