فهرست منبع

Merge remote-tracking branch 'origin/master'

zhangcl 1 ماه پیش
والد
کامیت
e30dd32ae9

+ 6 - 3
src/api/pms/inspect/order/index.ts

@@ -26,9 +26,12 @@ export const IotInspectOrderApi = {
   },
 
   // 查询巡检工单详情
-  getIotInspectOrder: async (id: number):Promise<IotInspectOrderVO> => {
+  getIotInspectOrder: async (id: number): Promise<IotInspectOrderVO> => {
     return await request.get({ url: `/rq/iot-inspect-order/get?id=` + id })
   },
+  orderReason: async (params: {}): Promise<any> => {
+    return await request.post({ url: `/rq/iot-inspect-order/ignore`,params })
+  },
   getIotInspectOrderDetail: async (id: number) => {
     return await request.get({ url: `/rq/iot-inspect-order/get/details?id=` + id })
   },
@@ -53,6 +56,6 @@ export const IotInspectOrderApi = {
   },
   //填写巡检工单
   writeIotInspectOrder: async (data: any, orderId) => {
-    return await request.post({ url: `/rq/iot-inspect-order/write/`+orderId, data })
-  },
+    return await request.post({ url: `/rq/iot-inspect-order/write/` + orderId, data })
+  }
 }

+ 2 - 1
src/locales/en.ts

@@ -1065,7 +1065,8 @@ export default {
     routeDescHolder:'please enter route description',
     generateTime:'GenerateTime',
     executeTime:'ExecuteTime',
-    ignore:'ignore'
+    ignore:'ignore',
+    reason:'ignoreReason'
   },
   route:{
     RouteName:'RouteName',

+ 2 - 1
src/locales/zh-CN.ts

@@ -1060,7 +1060,8 @@ export default {
     routeDescHolder:'请输入路线描述',
     generateTime:'生成时间',
     executeTime:'执行时间',
-    ignore:'忽略'
+    ignore:'忽略',
+    reason:'忽略理由'
   },
   route:{
     RouteName:'路线名称',

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

@@ -435,7 +435,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
           activeMenu: '/device/info'
         }
       },{
-        path: 'tddevice/detail/:id/:ifInline/:time/:name/:code/:dept',
+        path: 'tddevice/detail/:id/:ifInline/:time/:name/:code/:dept/:vehicle?',
         component: () => import('@/views/pms/device/monitor/TdDeviceInfo.vue'),
         name: 'TdDeviceDetail',
         meta: {

+ 1 - 0
src/views/pms/device/index.vue

@@ -153,6 +153,7 @@
           <el-table-column :label="t('deviceForm.mfg')" align="center" prop="manufacturer"  min-width="200"/>
           <el-table-column :label="t('deviceForm.brand')" align="center" prop="brandName" min-width="150"/>
           <el-table-column :label="t('deviceForm.model')" align="center" prop="model" min-width="170"/>
+          <el-table-column :label="t('devicePerson.rp')" align="center" prop="chargeName" min-width="170"/>
           <el-table-column :label="t('operationFill.operation')" align="center" min-width="180px" fixed="right">
             <template #default="scope">
               <el-button

+ 12 - 23
src/views/pms/device/monitor/TdDeviceInfo.vue

@@ -32,13 +32,9 @@
               <template #label>
                 <span class="custom-label">是否在线:</span>
               </template>
-<!--              <span class="custom-label">{{ getDictLabel(DICT_TYPE.IOT_DEVICE_STATUS, formData.ifInline) }}</span>-->
-<!--              <span class="custom-label">-->
-<!--                {{ getDictLabel(DICT_TYPE.IOT_DEVICE_STATUS, formData.ifInline) }}-->
                 <template #default>
                   <dict-tag :type="DICT_TYPE.IOT_DEVICE_STATUS" :value="formData.ifInline" />
                 </template>
-<!--              </span>-->
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -49,6 +45,14 @@
               <span class="custom-label">{{ formData.lastInlineTime }}</span>
             </el-form-item>
           </el-col>
+          <el-col :span="8">
+            <el-form-item v-if="formData.vehicle" prop="vehicle">
+              <template #label>
+                <span class="custom-label">车牌号码:</span>
+              </template>
+              <span class="custom-label">{{ formData.vehicle }}</span>
+            </el-form-item>
+          </el-col>
         </el-row>
       </el-form>
     </ContentWrap>
@@ -61,24 +65,6 @@
     </ContentWrap>
     <ContentWrap>
       <div class="chart-container">
-        <!-- 日期选择区域 -->
-<!--        <div class="date-controls">-->
-<!--          <input-->
-<!--            type="datetime-local"-->
-<!--            v-model="startTime"-->
-<!--            :max="endTime"-->
-<!--            @change="handleDateChange"-->
-<!--          />-->
-<!--          <span class="separator">至</span>-->
-<!--          <input-->
-<!--            type="datetime-local"-->
-<!--            v-model="endTime"-->
-<!--            :min="startTime"-->
-<!--            @change="handleDateChange"-->
-<!--          />-->
-<!--          <button class="query-btn" @click="fetchData">查询</button>-->
-<!--        </div>-->
-
         <!-- 图表容器 -->
         <el-date-picker
           v-model="dateRange"
@@ -116,7 +102,9 @@ const formData = ref({
   deviceCode: '',
   deviceName: '',
   ifInline: undefined,
-  lastInlineTime: ''
+  lastInlineTime: '',
+  dept:'',
+  vehicle:''
 })
 const specs = ref([])
 
@@ -216,6 +204,7 @@ onMounted(async () => {
   formData.value.lastInlineTime = params.time
   formData.value.ifInline = params.ifInline
   formData.value.dept = params.dept
+  formData.value.vehicle = params.vehicle
   await IotDeviceApi.getIotDeviceTds(id).then(res => {
     specs.value = res
     specs.value = specs.value.sort((a, b) => {

+ 6 - 3
src/views/pms/device/monitor/index.vue

@@ -195,7 +195,8 @@
                             item.lastInlineTime,
                             item.deviceName,
                             item.deviceCode,
-                            item.deptName
+                            item.deptName,
+                            item.vehicleName
                           )
                         "
                       >
@@ -261,6 +262,7 @@
                       scope.row.deviceName,
                       scope.row.deviceCode,
                       scope.row.deptName,
+                      scope.row.vehicleName
                     )
                   "
                 >
@@ -377,13 +379,14 @@ const openDetail = (
   time: string,
   name: string,
   code: string,
-  dept: string
+  dept: string,
+  vehicle:string
 ) => {
   if (time === null || time === undefined) {
     message.warning('没有数采数据')
     return
   }
-  push({ name: 'TdDeviceDetail', params: { id, ifInline, time, name, code, dept } })
+  push({ name: 'TdDeviceDetail', params: { id, ifInline, time, name, code, dept,vehicle } })
 }
 
 /** 导出方法 */

+ 18 - 11
src/views/pms/failure/index.vue

@@ -99,17 +99,17 @@
               />
             </el-select>
           </el-form-item>
-<!--          <el-form-item label="创建时间" v-show="ifShow" 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-220px"-->
-<!--            />-->
-<!--          </el-form-item>-->
+          <el-form-item label="创建时间" v-show="ifShow" 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-220px"
+            />
+          </el-form-item>
           <el-form-item>
             <el-button v-if="!ifShow" @click="moreQuery(true)" type="warning"
               ><Icon icon="ep:search" class="mr-5px" />
@@ -179,6 +179,13 @@
               {{ scope.row.dealHour&&scope.row.dealHour>0?scope.row.dealHour+'H':"" }}
             </template>
           </el-table-column>
+          <el-table-column
+            :label="t('table.createTime')"
+            align="center"
+            prop="createTime"
+            :formatter="dateFormatter"
+            min-width="180px"
+          />
           <el-table-column :label="t('fault.operation')" align="center" min-width="120px" fixed="right">
             <template #default="scope">
               <el-button

+ 7 - 1
src/views/pms/inspect/order/InspectOrderDetail.vue

@@ -36,7 +36,12 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="24">
+          <el-col :span="12">
+            <el-form-item :label="t('inspect.reason')" prop="reason">
+              <el-input type="textarea" v-model="formData.reason" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item :label="t('iotMaintain.remark')" prop="remark">
               <el-input type="textarea" v-model="formData.remark" disabled />
             </el-form-item>
@@ -132,6 +137,7 @@ const formData = ref({
   status: undefined,
   remark: undefined,
   deptId: undefined,
+  reason:undefined,
   deviceIds: undefined
 })
 const formRules = reactive({

+ 109 - 11
src/views/pms/inspect/order/index.vue

@@ -48,17 +48,17 @@
               />
             </el-select>
           </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-220px"-->
-<!--            />-->
-<!--          </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-220px"
+            />
+          </el-form-item>
           <el-form-item>
             <el-button @click="handleQuery"
               ><Icon icon="ep:search" class="mr-5px" />
@@ -147,10 +147,41 @@
               >
                 {{ t('operationFill.fill') }}
               </el-button>
+              <el-button link type="warning" v-if="scope.row.status==='todo'" @click="openDialog(scope.row.id)"> {{ t('inspect.ignore') }} </el-button>
 <!--              <el-button link type="primary" @click="openForm(scope.row.id)"> {{ t('inspect.ignore') }} </el-button>-->
             </template>
           </el-table-column>
         </el-table>
+        <el-dialog
+          v-model="dialogVisible"
+          title="忽略理由"
+          :width="600"
+          :before-close="handleClose"
+          append-to-body
+          :close-on-click-modal="false"
+        >
+          <el-form
+            ref="reasonFormRef"
+            :model="form"
+            :rules="rules"
+            label-width="60px"
+          >
+            <el-form-item label="理由" prop="reason">
+              <el-input
+                type="textarea"
+                v-model="form.reason"
+                placeholder="请输入忽略理由"
+                :rows="4"
+                resize="none"
+              />
+            </el-form-item>
+          </el-form>
+
+          <template #footer>
+            <el-button @click="handleCancel">取消</el-button>
+            <el-button type="primary" @click="handleConfirm">确定</el-button>
+          </template>
+        </el-dialog>
         <!-- 分页 -->
         <Pagination
           :total="total"
@@ -187,6 +218,7 @@ const status = params.status
 const deptId= params.deptId;
 const createTime = params.createTime;
 const total = ref(0) // 列表的总页数
+const dialogVisible = ref(false);
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
@@ -228,6 +260,57 @@ const resetQuery = () => {
   handleQuery()
 }
 
+const reasonFormRef = ref(null);
+const form = reactive({
+  id: undefined,
+  reason: '',
+});
+
+// 表单验证规则
+const rules = {
+  reason: [
+    { required: true, message: '请输入忽略理由', trigger: 'blur' },
+    { min: 2, message: '理由长度不能少于2个字符', trigger: 'blur' }
+  ]
+};
+// 打开对话框
+const openDialog = (id:number) => {
+  dialogVisible.value = true;
+  form.id = id;
+  form.reason = '';
+};
+
+// 关闭对话框前的回调
+const handleClose = () => {
+  resetForm();
+};
+
+// 取消按钮处理
+const handleCancel = () => {
+  dialogVisible.value = false;
+  resetForm();
+};
+
+// 确定按钮处理
+const handleConfirm = async () => {
+  // 表单验证
+  try {
+    await reasonFormRef.value.validate();
+    // 验证通过,调用接口
+      await IotInspectOrderApi.orderReason(form)
+      ElMessage.success('操作成功');
+      dialogVisible.value = false;
+      resetForm();
+  } catch (error) {
+    return;
+  }
+};
+
+// 重置表单
+const resetForm = () => {
+  reasonFormRef.value?.resetFields();
+};
+
 /** 添加/修改操作 */
 const formRef = ref()
 const openForm = (id?: number) => {
@@ -286,3 +369,18 @@ onMounted(() => {
   getList()
 })
 </script>
+<style scoped>
+.reason-confirm-container {
+  margin: 20px;
+}
+
+/* 调整文本框样式 */
+:deep(.el-textarea__inner) {
+  font-size: 14px;
+}
+
+/* 调整表单项间距 */
+:deep(.el-form-item) {
+  margin-bottom: 15px;
+}
+</style>

+ 3 - 3
src/views/pms/maintain/IotMaintain.vue

@@ -106,7 +106,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="8" v-if="formData.type === 'out'">
-              <el-form-item :label="t('iotMaintain.supplier')" prop="supplier" :rules="supplierRules">
+              <el-form-item :label="t('iotMaintain.supplier')" prop="supplier" :rules="formData.type==='out'?supplierRules:[]">
                 <el-select
                   v-model="formData.supplier"
                   :placeholder="t('iotMaintain.suppHolder')"
@@ -129,7 +129,7 @@
             </el-col>
             <el-col :span="8" v-if="formData.type === 'out'">
               <el-form-item :label="t('iotMaintain.attachment')" prop="outFiles">
-                <UploadFile v-model="formData.outFiles" class="min-w-80px" multiple :limit="2" />
+                <UploadFile v-model="formData.outFiles" :is-show-tip="false" class="min-w-80px" multiple :limit="2" />
               </el-form-item>
             </el-col>
             <el-col :span="16">
@@ -342,6 +342,7 @@ const formData = ref({
   maintainType: undefined,
 })
 const failureTimeRule = [{ required: true, message: '故障时间不能为空', trigger: 'blur' }]
+const supplierRules = [{ required: true, message: '供应商不能为空', trigger: 'blur' }]
 const startRule = [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]
 const descriptionRule = [{required: true, message:'维修描述不能为空', trigger: 'blur' }]
 const endRule = [{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]
@@ -363,7 +364,6 @@ const formRules = reactive({
 const addFormRules = reactive({
   name: [{ required: true, message: '维修项不能为空', trigger: 'blur' }]
 })
-
 const handleConfirm = () => {
   addFormData.value.bomNodeId = Math.floor(100000 + Math.random() * 900000)
 

+ 47 - 7
src/views/pms/stat/inspect.vue

@@ -194,18 +194,24 @@
           </div>
         </template>
         <el-row class="h-[220px]">
-          <el-col :span="12" class="flex flex-col items-center">
+          <el-col :span="8" class="flex flex-col items-center">
             <div ref="finishedChartRef" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600" style="text-decoration: underline;color: dodgerblue;cursor: pointer" @click="clickStatus('工单已执行')">已执行</span>
             </div>
           </el-col>
-          <el-col :span="12" class="flex flex-col items-center">
+          <el-col :span="8" class="flex flex-col items-center">
             <div ref="writeChartRef" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600" style="text-decoration: underline;color: orangered;cursor: pointer" @click="clickStatus('工单待执行')">待执行</span>
             </div>
           </el-col>
+          <el-col :span="8" class="flex flex-col items-center">
+            <div ref="ignoreChartRef" class="h-[160px] w-full"></div>
+            <div class="text-center mt-2">
+              <span class="text-sm text-gray-600" style="text-decoration: underline;color: purple;cursor: pointer" @click="clickStatus('工单忽略')">忽略</span>
+            </div>
+          </el-col>
         </el-row>
       </el-card>
     </el-col>
@@ -217,18 +223,24 @@
           </div>
         </template>
         <el-row class="h-[220px]">
-          <el-col :span="12" class="flex flex-col items-center">
+          <el-col :span="8" class="flex flex-col items-center">
             <div ref="finishedTodayChartRef" class="h-[160px] w-full"></div>
             <div class="text-center mt-2">
               <span class="text-sm text-gray-600" style="text-decoration: underline;color: dodgerblue;cursor: pointer" @click="clickStatus('设备已执行')">已填写</span>
             </div>
           </el-col>
-          <el-col :span="12" class="flex flex-col items-center">
+          <el-col :span="8" class="flex flex-col items-center">
             <div ref="writeTodayChartRef" class="h-[160px] w-full"></div>
             <div class="text-center mt-2" >
               <span class="text-sm text-gray-600" style="text-decoration: underline;color: orangered;cursor: pointer" @click="clickStatus('设备待执行')">未填写</span>
             </div>
           </el-col>
+          <el-col :span="8" class="flex flex-col items-center">
+            <div ref="ignoreTodayChartRef" class="h-[160px] w-full"></div>
+            <div class="text-center mt-2" >
+              <span class="text-sm text-gray-600" style="text-decoration: underline;color: purple;cursor: pointer" @click="clickStatus('设备忽略')">忽略</span>
+            </div>
+          </el-col>
         </el-row>
       </el-card>
     </el-col>
@@ -328,8 +340,10 @@ const transOrderChartRef = ref() // 待激活设备统计的图表
 const orderFinishChartRef = ref()
 const deviceMessageCountChartRef = ref() // 上下行消息量统计的图表
 const writeChartRef = ref() // 上下行消息量统计的图表
+const ignoreChartRef = ref() // 上下行消息量统计的图表
 const finishedChartRef = ref() // 上下行消息量统计的图表
 const writeTodayChartRef = ref() // 上下行消息量统计的图表
+const ignoreTodayChartRef = ref() // 上下行消息量统计的图表
 const finishedTodayChartRef = ref() // 上下行消息量统计的图表
 const statusChartRef = ref() // 设备数量统计的图表
 // 基础统计数据
@@ -378,9 +392,14 @@ const clickStatus = (type) => {
   } else if (type === '工单已执行') {
     status = 'finished'
     push({name: 'IotInspectOrdere', params:{deptId,status,createTime}})
+  } else if (type === '工单忽略'){
+    status = 'ignore'
+    push({name: 'IotInspectOrdere', params:{deptId,status,createTime}})
+  } else if (type === '设备忽略') {
+    status = 'ignore'
+    push({name:'IotInspectOrderDetailStat', params:{deptId,status,createTime}})
   } else if (type==='设备待执行') {
     status = 'todo'
-    debugger
     push({name:'IotInspectOrderDetailStat', params:{deptId,status,createTime}})
   } else if (type==='设备已执行'){
     status = 'finished'
@@ -407,11 +426,13 @@ const total = ref({
 
 const status = ref({
     finished: 0,
-    todo: 0
+    todo: 0,
+  ignore:0
 })
 const todayStatus = ref({
   finished: 0,
-  todo: 0
+  todo: 0,
+  ignore:0
 })
 const typeData = ref({})
 // 消息统计数据
@@ -562,6 +583,12 @@ const initCharts = () => {
     '#f50',
     '设备待执行'
   )
+  initGaugeChart(
+      ignoreTodayChartRef.value,
+      todayStatus.value.ignore === undefined ? 0 : todayStatus.value.ignore,
+      'purple',
+      '忽略'
+  )
   //已执行
   initGaugeChart(
     finishedTodayChartRef.value,
@@ -576,6 +603,13 @@ const initCharts = () => {
     '#f50',
     '工单待执行'
   )
+  // 忽略
+  initGaugeChart(
+    ignoreChartRef.value,
+    status.value.ignore === undefined ? 0 : status.value.ignore,
+    'purple',
+    '忽略'
+  )
   //工单已执行
   initGaugeChart(
     finishedChartRef.value,
@@ -646,12 +680,18 @@ const initGaugeChart = (el: any, value: number, color: string, type: string) =>
     } else if (params.data.type === '工单已执行') {
       status = 'finished'
       push({name: 'IotInspectOrdere', params:{deptId,status,createTime}})
+    } else if (params.data.type === '工单忽略'){
+      status = 'ignore'
+      push({name: 'IotInspectOrdere', params:{deptId,status,createTime}})
     } else if (params.data.type==='设备待执行') {
       status = 'todo'
       push({name:'IotInspectOrderDetailStat', params:{deptId,status,createTime}})
     } else if (params.data.type==='设备已执行'){
       status = 'finished'
       push({name:'IotInspectOrderDetailStat', params:{deptId,status,createTime}})
+    } else if (params.data.type === '设备忽略') {
+      status = 'ignore'
+      push({name:'IotInspectOrderDetailStat', params:{deptId,status,createTime}})
     }
   });
 }