Ver código fonte

Merge remote-tracking branch 'origin/master'

zhangcl 2 meses atrás
pai
commit
b92ed6dd6f

+ 12 - 0
src/router/modules/remaining.ts

@@ -133,6 +133,18 @@ const remainingRouter: AppRouteRecordRaw[] = [
           canTo: true,
           activeMenu: '/template/info'
         }
+      },
+      {
+        path: 'template/detail/:id/:deviceid/:status/:deptid/:createtime',
+        component: () => import('@/views/pms/device/RecordInfo.vue'),
+        name: 'FillOrderInfoDevice',
+        meta: {
+          title: '详情',
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          activeMenu: '/template/info'
+        }
       }
     ]
   },

+ 12 - 0
src/views/pms/device/DeviceInfo.vue

@@ -149,6 +149,9 @@
       <el-tab-pane label="设备BOM" name="bom">
         <BomInfo ref="bomRef" v-model:activeName="activeName" />
       </el-tab-pane>
+      <el-tab-pane label="运行记录" name="record">
+        <RecordList ref="recordRef" v-model:activeName="activeName" :deviceId="id" />
+      </el-tab-pane>
       <el-tab-pane label="故障记录" name="failure">
         <FailureList ref="failureRef" v-model:activeName="activeName" :deviceId="id" />
       </el-tab-pane>
@@ -183,6 +186,13 @@
           :deviceId = "id"
         />
       </el-tab-pane>
+      <el-tab-pane label="责任人调整记录" name="person">
+        <PersonList
+          ref="personRef"
+          v-model:activeName="activeName"
+          :deviceId = "id"
+        />
+      </el-tab-pane>
     </el-tabs>
   </ContentWrap>
 </template>
@@ -198,6 +208,8 @@ import InspectList from '@/views/pms/device/InspectList.vue'
 import MaintenanceList from '@/views/pms/device/MaintenanceList.vue'
 import AllotLogList from '@/views/pms/device/AllotLogList.vue'
 import DeviceStatusLogList from "@/views/pms/device/DeviceStatusLogList.vue";
+import PersonList from '@/views/pms/device/PersonList.vue'
+import RecordList from '@/views/pms/device/RecordList.vue'
 import { createImageViewer } from '@/components/ImageViewer'
 
 const defaultPicUrl = ref(

+ 76 - 0
src/views/pms/device/PersonList.vue

@@ -0,0 +1,76 @@
+<template>
+    <div v-loading="loading" style="height: 100%">
+      <el-table :data="devicePersons" style="width: 100%">
+        <el-table-column prop="deviceName" label="设备名称" />
+        <el-table-column prop="deviceCode" label="设备编码" />
+        <el-table-column prop="oldPersonNames" label="调整前责任人" />
+        <el-table-column prop="newPersonNames" label="调用后责任人" />
+        <el-table-column prop="reason" label="调整原因" />
+        <el-table-column prop="creatorName" label="调整人" />
+        <el-table-column
+          label="调整时间"
+          align="center"
+          prop="createTime"
+          width="180"
+          :formatter="dateFormatter"
+        />
+      </el-table>
+      <!-- 分页 -->
+      <Pagination
+        :total="total"
+        v-model:page="queryParams.pageNo"
+        v-model:limit="queryParams.pageSize"
+        @pagination="loadDeviceStatuses(props.deviceId)"
+      />
+    </div>
+  </template>
+<script setup lang="ts">
+
+import { ref, watch, defineOptions, defineEmits } from 'vue'
+import { ElMessage } from 'element-plus'
+import {dateFormatter} from "@/utils/formatTime";
+import {DICT_TYPE} from "@/utils/dict";
+import {IotDevicePersonLogApi} from "@/api/pms/iotdevicepersonlog";
+
+defineOptions({
+  name: 'DevicePersonLogDrawerDevice'
+})
+
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  createTime: [],
+  deviceId: '',
+  name: '',
+  code: ''
+})
+const loading = ref(false)
+const total = ref(0) // 列表的总页数
+const devicePersons = ref([])
+
+const props = defineProps({
+  deviceId: Number
+})
+
+// 加载设备的状态调整记录
+const loadDeviceStatuses = async () => {
+  queryParams.deviceId = props.deviceId
+  queryParams.pageNo = 1
+  try {
+    loading.value = true
+    // API调用
+    const data = await IotDevicePersonLogApi.getIotDevicePersonLogPage(queryParams)
+    devicePersons.value = data.list
+    total.value = data.total
+  } catch (error) {
+    ElMessage.error('数据加载失败')
+  } finally {
+    loading.value = false
+  }
+}
+onMounted(()=>{
+  loadDeviceStatuses()
+})
+</script>
+
+<style lang="scss" scoped></style>

+ 363 - 0
src/views/pms/device/RecordInfo.vue

@@ -0,0 +1,363 @@
+<template>
+  <ContentWrap>
+    <el-tabs v-model="activeTab" type="border-card" tab-position="left" v-loading="loading" style="height: 84vh">
+      <el-tab-pane
+        style="height: 100%"
+        v-for="(item,index) in list"
+        :key="index"
+      >
+        <template #label>
+          <!--          <span  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
+                     {{item.deviceCode}} ({{ item.deviceName }})
+                    </span>-->
+          <span class="custom-label" v-if='item.isFill === 1' @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
+           {{item.deviceCode}} ({{ item.deviceName }})
+          </span>
+          <span v-else  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
+           {{item.deviceCode}} ({{ item.deviceName }})
+          </span>
+        </template>
+        <div class="form-wrapper">
+          <el-form label-width="120px">
+            <div style="margin-left: 24px">
+              <el-form class="demo-form-inline" :inline="true">
+                <el-form-item label="所属队伍:">
+                  {{item.orgName}}
+                </el-form-item>
+                <el-form-item label="累计运行时间:">
+                  {{totalRunTime1}}h
+                </el-form-item>
+              </el-form>
+            </div>
+            <div v-for="(item,index) in attrList" :key="index">
+              <el-form-item :label='item.name' prop="deviceId"  >
+                <el-input
+                  v-if="item.isCollection===1"
+                  v-model="item.fillContent"
+                  clearable
+                  style="width: 200px"
+                  disabled
+                />
+                <el-input
+                  v-else
+                  v-model="item.fillContent"
+                  clearable
+                  style="width: 200px"
+                />
+              </el-form-item>
+            </div>
+            <el-form-item>
+              <el-button type="primary" @click="getFillInfo" v-show="showStatus">确定</el-button>
+              <el-button type="info" @click="deleteFillInfo" v-show="showStatus">取消</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </ContentWrap>
+
+</template>
+
+<script setup lang="ts">
+import { dateFormatter2 } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotOpeationFillApi, IotOpeationFillVO } from '@/api/pms/iotopeationfill'
+import IotOpeationFillForm from './IotOpeationFillForm.vue'
+import Vue from "@vitejs/plugin-vue";
+import {useUserStore} from "@/store/modules/user";
+import { ElMessage } from 'element-plus'
+import moment from 'moment';
+import { format } from 'date-fns';
+import {cx} from "@fullcalendar/core/internal-common";
+/** 运行记录填报 列表 */
+defineOptions({ name: 'IotOpeationFill' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const loading = ref(true) // 列表的加载中
+const { params, name } = useRoute() // 查询参数
+const orderId = params.id
+const deviceId = params.deviceid
+const deptId = params.deptid
+const createtime = params.createtime
+const list = ref<IotOpeationFillVO[]>([]) // 列表的数据
+const attrList = ref<IotOpeationFillVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const arry1 =ref([]);
+let totalRunTime1: string = '123'
+let fillStatus = params.status
+let showStatus = true;
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  deviceCode: undefined,
+  deviceName: undefined,
+  fillContent: undefined,
+  deviceType: undefined,
+  deviceComponent: undefined,
+  deptId: undefined,
+  orgName: undefined,
+  proId: undefined,
+  proName: undefined,
+  teamId: undefined,
+  teamName: undefined,
+  dutyName: undefined,
+  creDate: [],
+  createTime: [],
+  deviceCategoryId:1,
+  deviceId:undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+let cxStatus = true;
+
+const formatDescription = async(row, column, cellValue) =>{
+  return cellValue.split(',').map(part => `<div>${part}</div>`).join('');
+}
+
+
+
+const showComponent = () => {
+  if(JSON.parse(fillStatus)=== 1){
+    showStatus = false;
+  }
+};
+
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    // queryParams.deptId = deptId.split(",")[0];
+    // queryParams.userId = deptId.split(",")[1];
+    // queryParams.createTime = formatTimestamp(JSON.parse(deptId.split(",")[2].substring(0,10)));
+    queryParams.orderId = orderId
+    queryParams.deviceId = deviceId
+    debugger
+    const data = await IotOpeationFillApi.getIotOrderPage(queryParams);
+    list.value = data;
+    // if(cxStatus){
+      if (list.value){
+        queryParams.deviceCategoryId = list.value[0].deviceCategoryId
+        queryParams.deptId = list.value[0].deptId;
+        queryParams.deviceCode = list.value[0].deviceCode;
+        queryParams.deviceName = list.value[0].deviceName;
+        queryParams.deviceId = list.value[0].deviceId;
+      }
+
+    // }
+    getAttrList();
+
+
+  } finally {
+    loading.value = false
+  }
+}
+function formatTimestamp(timestamp) {
+  return moment.unix(timestamp/1000).format('YYYY-MM-DD');
+
+}
+
+/** 搜索按钮操作 */
+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 open = async (type: string, id?: number) => {
+  alert(id)
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+const openFill = (deviceCategoryId?:number,deviceId?:number,deptId?:number,deviceName?:string,deviceCode?:string) =>{
+
+  queryParams.deviceCategoryId = deviceCategoryId;
+  queryParams.deptId = deptId;
+  queryParams.deviceCode = deviceCode;
+  queryParams.deviceName = deviceName;
+  queryParams.deviceId = deviceId;
+  getAttrList();
+}
+
+
+const getAttrList = async () => {
+  loading.value = true
+  try {
+    totalRunTime1 = 0;
+    queryParams.createTime = formatTimestamp(createtime);
+    debugger
+    const data = await IotOpeationFillApi.getAttrs(queryParams)
+    attrList.value = data;
+    attrList.value.forEach(function (item,index){
+
+      if(item.name==='累计运行时间'){
+        item.name = '当日运转时间'
+      }
+      totalRunTime1 = Number(item.totalRunTime).toFixed(2)
+      item.fillContent = Number(item.fillContent).toFixed(2)
+      item.deviceCode = queryParams.deviceCode;
+      item.deptId = queryParams.deptId;
+      item.deviceId = queryParams.deviceId;
+      item.deviceCategoryId = queryParams.deviceCategoryId;
+    })
+  } finally {
+    loading.value = false
+  }
+
+}
+/** 获取填写信息保存到后台*/
+const getFillInfo = async () => {
+  try {
+    attrList.value.forEach(function (item,index){
+      item.pointName = item.name;
+      item.createTime = formatTimestamp(JSON.parse(deptId.split(",")[2].substring(0,10)));
+      item.userId = deptId.split(",")[1];
+      item.id = deptId.split(",")[3];
+    })
+    const data = attrList.value as unknown as IotOpeationFillVO
+    await IotOpeationFillApi.insertLog(data)
+    message.success(t('common.createSuccess'))
+    // 发送操作成功的事件
+    emit('success')
+    cxStatus = false;
+    getList();
+  } finally {
+
+  }
+}
+/**清空填写信息*/
+const deleteFillInfo = () =>{
+  attrList.value.forEach(function (item, index){
+    item.fillContent = '';
+  });
+}
+
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await IotOpeationFillApi.deleteIotOpeationFill(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotOpeationFillApi.exportIotOpeationFill(queryParams)
+    download.excel(data, '运行记录填报.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+  showComponent()
+})
+</script>
+<style scoped>
+.back-red{		/* 红色背景 */
+  background-color: red;
+}
+.back-blue{
+  background-color: grey;
+}
+.step-container {
+  display: grid;
+  grid-template-columns: 220px 1fr;
+  gap: 10px;
+  height: 100%;
+  min-height: 600px;
+}
+
+.steps-nav {
+  overflow-y: auto;
+  padding-right: 15px;
+}
+
+.form-wrapper {
+  background: #fff;
+  padding: 30px;
+  border-radius: 8px;
+  box-shadow: 0 2px 12px rgba(0,0,0,0.1);
+}
+
+.navigation-controls {
+  margin-top: 40px;
+  text-align: center;
+}
+
+.custom-label {
+  color: green;
+}
+::v-deep .el-step__icon {
+  background-color: #409eff;
+  color: #fff;
+  border: 0px;
+}
+.step-title-wrapper {
+  display: inline-flex;
+  align-items: center;
+  gap: 8px;
+  position: relative;
+  padding-right: 25px;
+}
+
+/* 覆盖步骤条默认样式 */
+:deep(.custom-steps) {
+
+  /* 调整头部位置 */
+  .el-step__head {
+    top: 3px;
+  }
+
+  /* 标题容器定位 */
+  .el-step__title {
+    display: inline-block;
+    margin-left: 10px;
+    padding-right: 0;
+  }
+
+  /* 步骤连接线 */
+  .el-step__line {
+    left: 11px;
+    background-color: #ebeef5;
+  }
+
+  /* 当前步骤样式 */
+  .is-process .title-text {
+    font-weight: 600;
+    color: #409eff;
+  }
+
+  /* 完成状态图标 */
+  .is-finish .tip-icon {
+    color: #67c23a;
+  }
+
+}
+</style>

+ 156 - 0
src/views/pms/device/RecordList.vue

@@ -0,0 +1,156 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="工单名" prop="orderName">
+        <el-input
+          v-model="queryParams.orderName"
+          placeholder="请输入工单名"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工单状态" prop="orderStatus">
+        <el-select
+          v-model="queryParams.orderStatus"
+          placeholder="工单状态"
+          clearable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.OPERATION_FILL_ORDER_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </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>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true">
+      <el-table-column label="序号" width="60" align="center">
+        <template #default="scope">
+          {{ scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column label="工单名称" align="center" prop="orderName" width="300" />
+      <el-table-column label="责任人" align="center" prop="userName" />
+      <!--        <el-table-column label="工单类型" align="center" prop="orderType" />-->
+      <el-table-column label="工单状态" align="center" prop="orderStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.OPERATION_FILL_ORDER_STATUS" :value="scope.row.orderStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="
+              openWrite(scope.row.id, scope.row.orderStatus, scope.row.deptId,scope.row.createTime)
+            "
+          >
+            查看
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+</template>
+
+<script setup lang="ts">
+import download from '@/utils/download'
+import { IotInspectOrderApi } from '@/api/pms/inspect/order'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
+import { IotOpeationFillApi, IotOpeationFillVO } from '@/api/pms/iotopeationfill'
+import { useUserStore } from '@/store/modules/user'
+
+const { push } = useRouter()
+
+/** 巡检工单 列表 */
+defineOptions({ name: 'IotOpeationFillDevice' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+const props = defineProps<{ deviceId?: number }>()
+const loading = ref(true) // 列表的加载中
+const list = ref<IotOpeationFillVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  inspectOrderTitle: undefined,
+  inspectOrderCode: undefined,
+  status: undefined,
+  remark: undefined,
+  createTime: [],
+  deviceId: undefined,
+  deviceIds: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await IotOpeationFillApi.getFillRecordsPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+const openWrite = (id?: string, status: number, deptid: number, createtime:number) => {
+  const deviceid = props.deviceId
+  push({ name: 'FillOrderInfoDevice',params:{id, deviceid, status, deptid, createtime}})
+}
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 初始化 **/
+onMounted(() => {
+  queryParams.deviceId = props.deviceId
+  getList()
+})
+</script>

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

@@ -17,10 +17,10 @@
           :inline="true"
           label-width="68px"
         >
-          <el-form-item label="资产编码" prop="deviceCode">
+          <el-form-item label="设备编码" prop="deviceCode">
             <el-input
               v-model="queryParams.deviceCode"
-              placeholder="请输入资产编码"
+              placeholder="请输入设备编码"
               clearable
               @keyup.enter="handleQuery"
               class="!w-200px"
@@ -119,7 +119,7 @@
               {{ scope.$index + 1 }}
             </template>
           </el-table-column>
-          <el-table-column label="资产编码" sortable align="center" prop="deviceCode" />
+          <el-table-column label="设备编码" sortable align="center" prop="deviceCode" />
           <el-table-column label="设备名称" sortable align="center" prop="deviceName">
             <template #default="scope">
               <el-link :underline="false" type="primary" @click="handleDetail(scope.row.id)">

+ 32 - 5
src/views/pms/failure/IotFailureReportForm.vue

@@ -44,6 +44,11 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="故障系统" prop="failureSystem" :disabled="disabled">
+            <el-input v-model="formData.failureSystem" placeholder="请输入故障系统" :disabled="disabled" />
+          </el-form-item>
+        </el-col>
       <el-col :span="12">
       <el-form-item label="故障时间" prop="failureTime" :disabled="disabled">
         <el-date-picker
@@ -56,10 +61,18 @@
         />
       </el-form-item>
         </el-col>
-      <el-col :span="12">
-      <el-form-item label="故障系统" prop="failureSystem" :disabled="disabled">
-        <el-input v-model="formData.failureSystem" placeholder="请输入故障系统" :disabled="disabled" />
-      </el-form-item>
+        <el-col :span="12" v-if="formData.ifDeal">
+          <el-form-item label="故障解决时间" prop="dealTime">
+            <el-date-picker
+              @change="endTimeBlur"
+              :disabled="disabled"
+              style="width: 150%"
+              v-model="formData.dealTime"
+              type="datetime"
+              value-format="x"
+              placeholder="选择故障解决时间"
+            />
+          </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="是否停机" prop="ifStop">
@@ -84,7 +97,7 @@
           </el-form-item>
         </el-col>
       <el-col :span="24">
-      <el-form-item label="解决办法" prop="solution" :rules="formData.ifDeal?solutionRule:[]">
+      <el-form-item label="解决办法" v-if="formData.ifDeal" prop="solution" :rules="formData.ifDeal?solutionRule:[]">
         <el-input v-model="formData.solution" type="textarea" placeholder="请输入解决办法" :disabled="disabled" />
       </el-form-item>
         </el-col>
@@ -111,6 +124,7 @@
 import { IotFailureReportApi, IotFailureReportVO } from '@/api/pms/failure'
 import {DICT_TYPE, getBoolDictOptions} from "@/utils/dict";
 import DeviceList from "@/views/pms/failure/DeviceList.vue";
+import dayjs from "dayjs";
 
 /** 故障上报 表单 */
 defineOptions({ name: 'IotFailureReportForm' })
@@ -132,6 +146,7 @@ const formData = ref({
   status: undefined,
   ifStop: undefined,
   failureTime: undefined,
+  dealTime: undefined,
   failureInfluence: undefined,
   failureSystem: undefined,
   description: undefined,
@@ -155,6 +170,18 @@ const deviceChoose = (row) => {
   formData.value.deptId = row.deptId;
   // deviceLabel.value = row.deviceName
 }
+const endTimeBlur = () => {
+  if (formData.value.dealTime <= formData.value.failureTime) {
+    message.error('故障解决时间不得早于故障时间')
+    formData.value.dealTime = undefined
+  }
+  const now = dayjs();
+  const target = dayjs(formData.value.dealTime);
+  if (target.isAfter(now)) {
+    message.error('故障解决时间不得早于当前时间')
+    formData.value.dealTime = undefined
+  }
+}
 const handleClear = () =>{
   formData.value.deviceId = undefined
   formData.value.deviceName = undefined

+ 24 - 33
src/views/pms/failure/index.vue

@@ -15,19 +15,19 @@
           :inline="true"
           label-width="68px"
         >
-          <el-form-item label="故障编码" prop="failureCode">
-            <el-input
-              v-model="queryParams.failureCode"
-              placeholder="请输入故障编码"
-              clearable
-              @keyup.enter="handleQuery"
-              class="!w-200px"
-            />
-          </el-form-item>
-          <el-form-item label="故障名称" label-width="70px" prop="failureName">
+<!--          <el-form-item label="故障编码" prop="failureCode">-->
+<!--            <el-input-->
+<!--              v-model="queryParams.failureCode"-->
+<!--              placeholder="请输入故障编码"-->
+<!--              clearable-->
+<!--              @keyup.enter="handleQuery"-->
+<!--              class="!w-200px"-->
+<!--            />-->
+<!--          </el-form-item>-->
+          <el-form-item label="故障标题" label-width="70px" prop="failureName">
             <el-input
               v-model="queryParams.failureName"
-              placeholder="请输入故障名称"
+              placeholder="请输入故障标题"
               clearable
               @keyup.enter="handleQuery"
               class="!w-200px"
@@ -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" /> 更多查询</el-button
@@ -172,20 +172,11 @@
             :formatter="dateFormatter"
             width="180px"
           />
-          <el-table-column label="图片" align="center" prop="pic">
+          <el-table-column label="解决用时" align="center" prop="dealHour" >
             <template #default="scope">
-              <el-button v-if="scope.row.pic" link type="primary" @click="openWeb(scope.row.pic)">
-                <Icon size="19" icon="ep:view"
-              /></el-button>
+              {{ scope.row.dealHour&&scope.row.dealHour>0?scope.row.dealHour+'H':"" }}
             </template>
           </el-table-column>
-          <el-table-column
-            label="创建时间"
-            align="center"
-            prop="createTime"
-            :formatter="dateFormatter"
-            width="180px"
-          />
           <el-table-column label="操作" align="center" min-width="120px">
             <template #default="scope">
               <el-button

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

@@ -204,6 +204,7 @@ const openForm = (id?: number) => {
   push({ name: 'InspectOrderDetail', params:{id} })
 }
 const openWrite = (id?: string) => {
+  debugger
   push({ name: 'FillOrderInfo',params:{id}})
 }
 /** 删除按钮操作 */

+ 1 - 0
src/views/pms/iotopeationfill/index1.vue

@@ -190,6 +190,7 @@ const getAttrList = async () => {
   try {
     totalRunTime1 = 0;
     queryParams.createTime = formatTimestamp(JSON.parse(deptId.split(",")[2].substring(0,10)));
+    debugger
     const data = await IotOpeationFillApi.getAttrs(queryParams)
     attrList.value = data;
     attrList.value.forEach(function (item,index){

+ 4 - 1
src/views/pms/maintain/IotMaintain.vue

@@ -80,6 +80,7 @@
             <el-col :span="8">
               <el-form-item label="故障时间" prop="failureTime" :rules="formData.type==='out'?failureTimeRule:[]" >
                 <el-date-picker
+                  :disabled="formData.maintainType==='故障上报'"
                   style="width: 150%"
                   v-model="formData.failureTime"
                   type="datetime"
@@ -331,7 +332,8 @@ const formData = ref({
   maintainDescription: undefined,
   supplier: undefined,
   maintainFee: undefined,
-  outFile: undefined
+  outFile: undefined,
+  maintainType: undefined,
 })
 const failureTimeRule = [{ required: true, message: '故障时间不能为空', trigger: 'blur' }]
 const startRule = [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]
@@ -591,6 +593,7 @@ onMounted(async () => {
   if (id) {
     formType.value = 'update'
     const iotMaintain = await IotMaintainApi.getIotMaintain(id)
+    debugger
     deviceLabel.value = iotMaintain.deviceName
     formData.value = iotMaintain
     formData.value.status = undefined

+ 18 - 18
src/views/pms/maintain/index.vue

@@ -104,17 +104,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"/> 更多查询</el-button>
             <el-button v-if="ifShow" @click="moreQuery(false)" type="danger"><Icon icon="ep:search" class="mr-5px"/> 收起查询</el-button>
@@ -189,13 +189,13 @@
 <!--            width="180px"-->
 <!--          />-->
 <!--          <el-table-column label="备注" align="center" prop="remark" />-->
-          <el-table-column
-            label="创建时间"
-            align="center"
-            prop="createTime"
-            :formatter="dateFormatter"
-            width="180px"
-          />
+<!--          <el-table-column-->
+<!--            label="创建时间"-->
+<!--            align="center"-->
+<!--            prop="createTime"-->
+<!--            :formatter="dateFormatter"-->
+<!--            width="180px"-->
+<!--          />-->
           <el-table-column label="操作" align="center" min-width="120px">
             <template #default="scope">
               <el-button