lipenghui 3 hónapja
szülő
commit
2fb007a6dc

+ 35 - 49
src/views/pms/device/DeviceInfo.vue

@@ -53,7 +53,7 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="规格型号:" prop="model">
-                {{formData.model?formData.model:'-'}}
+                {{ formData.model ? formData.model : '-' }}
               </el-form-item>
             </el-col>
           </el-row>
@@ -64,8 +64,8 @@
   <ContentWrap v-loading="formLoading">
     <el-tabs v-model="activeName">
       <el-tab-pane label="基础信息" name="info">
-        <el-form style="margin-top: 5px; margin-left: 35px;margin-right: 35px;">
-          <el-row style="border-bottom: 1px solid #dcdfe6;">
+        <el-form style="margin-top: 5px; margin-left: 35px; margin-right: 35px">
+          <el-row style="border-bottom: 1px solid #dcdfe6">
             <el-col :span="6">
               <el-form-item label="制造商:" prop="manufacturerId">
                 {{ formData.zzName }}
@@ -92,7 +92,7 @@
               </el-form-item>
             </el-col>
           </el-row>
-          <el-row style="margin-top:20px;border-bottom: 1px solid #dcdfe6;">
+          <el-row style="margin-top: 20px; border-bottom: 1px solid #dcdfe6">
             <el-col :span="6">
               <el-form-item label="采购价格:" prop="plPrice">
                 {{ formData.plPrice ? formData.plPrice : '-' }}
@@ -129,9 +129,9 @@
               </el-form-item>
             </el-col>
           </el-row>
-          <el-row style="margin-top:20px">
+          <el-row style="margin-top: 20px">
             <el-col v-for="field in list" :key="field.sort" :span="6">
-              <el-form-item :label="field.name" :prop="field.identifier" >
+              <el-form-item :label="field.name" :prop="field.identifier">
                 {{ field.value }}
               </el-form-item>
             </el-col>
@@ -139,63 +139,49 @@
         </el-form>
       </el-tab-pane>
       <el-tab-pane label="资料库" name="file">
-        <DeviceUpload
-          ref="fileRef"
-          v-model:activeName="activeName"
-        />
+        <DeviceUpload ref="fileRef" v-model:activeName="activeName" />
       </el-tab-pane>
       <el-tab-pane label="设备BOM" name="bom">
-        <BomInfo
-          ref="bomRef"
-          v-model:activeName="activeName"
-        />
+        <BomInfo ref="bomRef" v-model:activeName="activeName" />
       </el-tab-pane>
       <el-tab-pane label="故障记录" name="failure">
-        <FailureList
-          ref="failureRef"
-          v-model:activeName="activeName"
-          :deviceId = "id"
-        />
+        <FailureList ref="failureRef" v-model:activeName="activeName" :deviceId="id" />
       </el-tab-pane>
       <el-tab-pane label="维修记录" name="maintain">
-        <MaintainList
-          ref="maintainRef"
-          v-model:activeName="activeName"
-          :deviceId = "id"
-        />
+        <MaintainList ref="maintainRef" v-model:activeName="activeName" :deviceId="id" />
       </el-tab-pane>
-<!--      <el-tab-pane label="保养记录" name="maintenance">-->
-<!--        <ConnectList-->
-<!--          ref="connectRef"-->
-<!--          v-model:activeName="activeName"-->
-<!--          :propFormData="formData"-->
-<!--          :ifAlone="false"-->
-<!--        />-->
-<!--      </el-tab-pane>-->
-<!--      <el-tab-pane label="巡检记录" name="inspect">-->
-<!--        <ConnectList-->
-<!--          ref="connectRef"-->
-<!--          v-model:activeName="activeName"-->
-<!--          :propFormData="formData"-->
-<!--          :ifAlone="false"-->
-<!--        />-->
-<!--      </el-tab-pane>-->
+      <!--      <el-tab-pane label="保养记录" name="maintenance">-->
+      <!--        <ConnectList-->
+      <!--          ref="connectRef"-->
+      <!--          v-model:activeName="activeName"-->
+      <!--          :propFormData="formData"-->
+      <!--          :ifAlone="false"-->
+      <!--        />-->
+      <!--      </el-tab-pane>-->
+            <el-tab-pane label="巡检记录" name="inspect">
+              <InspectList
+                ref="inspectRef"
+                v-model:activeName="activeName"
+                :deviceId = "id"
+              />
+            </el-tab-pane>
     </el-tabs>
   </ContentWrap>
 </template>
 <script lang="ts" setup>
-import ContactList from '@/views/supplier/contact/index.vue'
-import CoreList from '@/views/supplier/coreproduct/index.vue'
-import ConnectList from '@/views/supplier/connect/index.vue'
 import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
 import { DICT_TYPE, getDictLabel } from '@/utils/dict'
 import { formatDate } from '../../../utils/formatTime'
-import DeviceUpload from "@/views/pms/device/DeviceUpload.vue";
-import BomInfo from "@/views/pms/device/BomInfo.vue";
-import FailureList from "@/views/pms/device/FailureList.vue";
-import MaintainList from "@/views/pms/device/MaintainList.vue";
-import {createImageViewer} from "@/components/ImageViewer";
-const defaultPicUrl = ref('http://1.94.244.160:70/admin-api/infra/file/29/get/IntegratedSolution.png') // 默认设备图片
+import DeviceUpload from '@/views/pms/device/DeviceUpload.vue'
+import BomInfo from '@/views/pms/device/BomInfo.vue'
+import FailureList from '@/views/pms/device/FailureList.vue'
+import MaintainList from '@/views/pms/device/MaintainList.vue'
+import InspectList from '@/views/pms/device/InspectList.vue'
+import { createImageViewer } from '@/components/ImageViewer'
+
+const defaultPicUrl = ref(
+  'http://1.94.244.160:70/admin-api/infra/file/29/get/IntegratedSolution.png'
+) // 默认设备图片
 
 defineOptions({ name: 'DeviceDetailInfo' })
 

+ 186 - 0
src/views/pms/device/InspectList.vue

@@ -0,0 +1,186 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="工单名" prop="inspectOrderTitle">
+        <el-input
+          v-model="queryParams.inspectOrderTitle"
+          placeholder="请输入工单名"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工单编码" prop="inspectOrderCode">
+        <el-input
+          v-model="queryParams.inspectOrderCode"
+          placeholder="请输入工单编码"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="工单状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="工单状态" clearable class="!w-240px">
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.PMS_INSPECT_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-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          @click="handleExport"-->
+<!--          :loading="exportLoading"-->
+<!--          v-hasPermi="['rq:iot-inspect-order:export']"-->
+<!--        >-->
+<!--          <Icon icon="ep:download" class="mr-5px" /> 导出-->
+<!--        </el-button>-->
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="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="inspectOrderTitle" />
+      <el-table-column label="工单编码" align="center" prop="inspectOrderCode" />
+      <el-table-column label="工单类型" align="center" prop="type" />
+      <el-table-column label="工单状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PMS_INSPECT_ORDER_STATUS" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="负责人" align="center" prop="chargeName" />
+      <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" min-width="120px">
+        <template #default="scope">
+          <el-button link type="primary" @click="openForm(scope.row.id)"> 查看 </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 { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { IotInspectOrderApi, IotInspectOrderVO } from '@/api/pms/inspect/order'
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
+
+const { push } = useRouter()
+
+/** 巡检工单 列表 */
+defineOptions({ name: 'DeviceIotInspectOrder' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<IotInspectOrderVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const props = defineProps<{ deviceId?: number }>()
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  inspectOrderTitle: undefined,
+  inspectOrderCode: undefined,
+  status: undefined,
+  remark: undefined,
+  createTime: [],
+  deptId: undefined,
+  deviceIds: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    queryParams.deviceId = props.deviceId
+    const data = await IotInspectOrderApi.getIotInspectOrderPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await IotInspectOrderApi.exportIotInspectOrder(queryParams)
+    download.excel(data, '巡检工单.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+const openForm = (id?: number) => {
+  push({ name: 'InspectOrderDetail', params: { id } })
+}
+</script>

+ 218 - 231
src/views/pms/failure/index.vue

@@ -6,244 +6,229 @@
       </ContentWrap>
     </el-col>
     <el-col :span="20" :xs="24">
-    <ContentWrap>
-      <!-- 搜索工作栏 -->
-      <el-form
-        class="-mb-15px"
-        :model="queryParams"
-        ref="queryFormRef"
-        :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-input
-            v-model="queryParams.failureName"
-            placeholder="请输入故障名称"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-200px"
-          />
-        </el-form-item>
-        <el-form-item label="状态" label-width="40px" prop="status">
-          <el-select
-            v-model="queryParams.status"
-            placeholder="状态"
-            clearable
-            class="!w-200px"
-          >
-            <el-option
-              v-for="dict in getStrDictOptions(DICT_TYPE.PMS_FAILURE_STATUS)"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
+      <ContentWrap>
+        <!-- 搜索工作栏 -->
+        <el-form
+          class="-mb-15px"
+          :model="queryParams"
+          ref="queryFormRef"
+          :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-select>
-        </el-form-item>
-        <el-form-item label="是否停机" v-show="ifShow" prop="ifStop">
-          <el-select
-            v-model="queryParams.ifStop"
-            placeholder="是否停机"
-            clearable
-            class="!w-200px"
-          >
-            <el-option
-              v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
+          </el-form-item>
+          <el-form-item label="故障名称" label-width="70px" prop="failureName">
+            <el-input
+              v-model="queryParams.failureName"
+              placeholder="请输入故障名称"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-200px"
             />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="故障时间" v-show="ifShow" prop="failureTime">
-          <el-date-picker
-            v-model="queryParams.failureTime"
-            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="ifDeal">
-          <el-select
-            v-model="queryParams.ifDeal"
-            placeholder="是否解决"
-            clearable
-            class="!w-200px"
-          >
-            <el-option
-              v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
+          </el-form-item>
+          <el-form-item label="状态" label-width="40px" prop="status">
+            <el-select v-model="queryParams.status" placeholder="状态" clearable class="!w-200px">
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.PMS_FAILURE_STATUS)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="是否停机" v-show="ifShow" prop="ifStop">
+            <el-select
+              v-model="queryParams.ifStop"
+              placeholder="是否停机"
+              clearable
+              class="!w-200px"
+            >
+              <el-option
+                v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="故障时间" v-show="ifShow" prop="failureTime">
+            <el-date-picker
+              v-model="queryParams.failureTime"
+              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-select>
-        </el-form-item>
-        <el-form-item label="是否协助" v-show="ifShow" prop="needHelp">
-          <el-select
-            v-model="queryParams.needHelp"
-            placeholder="是否协助"
-            clearable
-            class="!w-200px"
-          >
-            <el-option
-              v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
+          </el-form-item>
+          <el-form-item label="是否解决" v-show="ifShow" prop="ifDeal">
+            <el-select
+              v-model="queryParams.ifDeal"
+              placeholder="是否解决"
+              clearable
+              class="!w-200px"
+            >
+              <el-option
+                v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="是否协助" v-show="ifShow" prop="needHelp">
+            <el-select
+              v-model="queryParams.needHelp"
+              placeholder="是否协助"
+              clearable
+              class="!w-200px"
+            >
+              <el-option
+                v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </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-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>
-          <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>
-          <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-button
-            type="primary"
-            plain
-            @click="openForm('create', undefined, false)"
-
-          >
-            <Icon icon="ep:plus" class="mr-5px" /> 新增
-          </el-button>
-          <el-button
-            type="success"
-            plain
-            @click="handleExport"
-            :loading="exportLoading"
-            v-hasPermi="['rq:iot-failure-report:export']"
-          >
-            <Icon icon="ep:download" class="mr-5px" /> 导出
-          </el-button>
-        </el-form-item>
-      </el-form>
-    </ContentWrap>
-
-    <!-- 列表 -->
-    <ContentWrap>
-      <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="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="failureCode" />-->
-        <el-table-column label="故障标题" align="center" prop="failureName" />
-        <el-table-column label="设备" align="center" prop="deviceName" />
-        <el-table-column label="状态" align="center" prop="status" >
-          <template #default="scope">
-            <dict-tag :type="DICT_TYPE.PMS_FAILURE_STATUS" :value="scope.row.status" />
-          </template>
-        </el-table-column>
-        <el-table-column label="审批状态" align="center" prop="auditStatus" >
-          <template #default="scope">
-            <dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
-          </template>
-        </el-table-column>
-        <el-table-column label="是否解决" align="center" prop="ifDeal" >
-          <template #default="scope">
-            <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.ifDeal" />
-          </template>
-        </el-table-column>
-<!--        <el-table-column label="需要协助" align="center" prop="needHelp" >-->
-<!--          <template #default="scope">-->
-<!--            <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.needHelp" />-->
-<!--          </template>-->
-<!--        </el-table-column>-->
-<!--        <el-table-column label="是否停机" align="center" prop="ifStop" >-->
-<!--          <template #default="scope">-->
-<!--            <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.ifStop" />-->
-<!--          </template>-->
-<!--        </el-table-column>-->
-        <el-table-column
-          label="故障时间"
-          align="center"
-          prop="failureTime"
-          :formatter="dateFormatter"
-          width="180px"
-        />
-  <!--      <el-table-column label="故障影响" align="center" prop="failureInfluence" />-->
-<!--        <el-table-column label="故障系统" align="center" prop="failureSystem" />-->
-  <!--      <el-table-column label="故障描述" align="center" prop="description" />-->
-        <el-table-column label="图片" align="center" prop="pic" >
-            <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>
-            </template>
-        </el-table-column>
-  <!--      <el-table-column label="解决办法" align="center" prop="solution" />-->
-  <!--      <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" min-width="120px">
-          <template #default="scope">
-            <el-button
-              link
-              type="primary"
-              @click="openForm('detail', scope.row.id, true)"
-              v-hasPermi="['rq:iot-failure-report:query']"
+          </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>
-            <el-button
-              link
-              v-if="scope.row.auditStatus==='30'"
-              type="primary"
-              @click="openForm('update', scope.row.id, false)"
-              v-hasPermi="['rq:iot-failure-report:update']"
+            <el-button v-if="ifShow" @click="moreQuery(false)" type="danger"
+              ><Icon icon="ep:search" class="mr-5px" /> 收起查询</el-button
+            >
+            <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-button type="primary" plain @click="openForm('create', undefined, false)">
+              <Icon icon="ep:plus" class="mr-5px" /> 新增
             </el-button>
             <el-button
-              link
-              v-if="scope.row.auditStatus==='30'"
-              type="danger"
-              @click="handleDelete(scope.row.id)"
-              v-hasPermi="['rq:iot-failure-report:delete']"
+              type="success"
+              plain
+              @click="handleExport"
+              :loading="exportLoading"
+              v-hasPermi="['rq:iot-failure-report:export']"
             >
-              删除
+              <Icon icon="ep:download" class="mr-5px" /> 导出
             </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <!-- 分页 -->
-      <Pagination
-        :total="total"
-        v-model:page="queryParams.pageNo"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
-    </ContentWrap>
+          </el-form-item>
+        </el-form>
+      </ContentWrap>
+
+      <!-- 列表 -->
+      <ContentWrap>
+        <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="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="failureCode" />-->
+          <el-table-column label="故障标题" align="center" prop="failureName" />
+          <el-table-column label="设备" align="center" prop="deviceName" />
+          <el-table-column label="状态" align="center" prop="status">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.PMS_FAILURE_STATUS" :value="scope.row.status" />
+            </template>
+          </el-table-column>
+          <el-table-column label="审批状态" align="center" prop="auditStatus">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
+            </template>
+          </el-table-column>
+          <el-table-column label="是否解决" align="center" prop="ifDeal">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.ifDeal" />
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="故障时间"
+            align="center"
+            prop="failureTime"
+            :formatter="dateFormatter"
+            width="180px"
+          />
+          <el-table-column label="图片" align="center" prop="pic">
+            <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>
+            </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
+                link
+                type="primary"
+                @click="openForm('detail', scope.row.id, true)"
+                v-hasPermi="['rq:iot-failure-report:query']"
+              >
+                查看
+              </el-button>
+              <el-button
+                link
+                v-if="scope.row.auditStatus === '30'"
+                type="primary"
+                @click="openForm('update', scope.row.id, false)"
+                v-hasPermi="['rq:iot-failure-report:update']"
+              >
+                编辑
+              </el-button>
+              <el-button
+                link
+                v-if="scope.row.auditStatus === '30'"
+                type="danger"
+                @click="handleDelete(scope.row.id)"
+                v-hasPermi="['rq:iot-failure-report:delete']"
+              >
+                删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <Pagination
+          :total="total"
+          v-model:page="queryParams.pageNo"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </ContentWrap>
     </el-col>
   </el-row>
-    <!-- 表单弹窗:添加/修改 -->
-    <IotFailureReportForm ref="formRef" @success="getList" />
+  <!-- 表单弹窗:添加/修改 -->
+  <IotFailureReportForm ref="formRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
@@ -251,8 +236,8 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { IotFailureReportApi, IotFailureReportVO } from '@/api/pms/failure'
 import IotFailureReportForm from './IotFailureReportForm.vue'
-import {DICT_TYPE, getBoolDictOptions, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
-import DeptTree from "@/views/system/user/DeptTree.vue";
+import { DICT_TYPE, getBoolDictOptions, getStrDictOptions } from '@/utils/dict'
+import DeptTree from '@/views/system/user/DeptTree.vue'
 
 /** 故障上报 列表 */
 defineOptions({ name: 'IotFailureReport' })
@@ -289,7 +274,9 @@ const moreQuery = (show) => {
   ifShow.value = show
 }
 const openWeb = (url) => {
-  window.open('http://1.94.244.160:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url)));
+  window.open(
+    'http://1.94.244.160:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
+  )
 }
 const handleCommand = (command: string, row: IotFailureReportVO) => {
   switch (command) {
@@ -337,7 +324,7 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number,disable?:boolean) => {
+const openForm = (type: string, id?: number, disable?: boolean) => {
   formRef.value.open(type, id, disable)
 }
 
@@ -380,7 +367,7 @@ const submitProcess = async (row: IotFailureReportVO) => {
     // 提交审核
     debugger
     loading.value = true
-    await IotFailureReportApi.submitForApproval(row).then(res=>{
+    await IotFailureReportApi.submitForApproval(row).then((res) => {
       loading.value = false
     })
     message.success('提交审核成功!')

+ 13 - 98
src/views/pms/inspect/order/InspectOrderDetail.vue

@@ -25,24 +25,15 @@
               <el-input v-model="formData.inspectOrderCode" disabled />
             </el-form-item>
           </el-col>
-<!--          <el-col :span="12">-->
-<!--            <el-form-item label="周期" prop="planCycle">-->
-<!--              <el-input-->
-<!--                type="number"-->
-<!--                v-model="formData.planCycle"-->
-<!--                disabled-->
-<!--              />-->
-<!--            </el-form-item>-->
-<!--          </el-col>-->
           <el-col :span="12">
             <el-form-item label="负责人" prop="chargeName">
               <el-select v-model="formData.chargeName" style="width: 100%" disabled />
-                <el-option
-                  v-for="item in deptUsers"
-                  :key="item.id"
-                  :label="item.nickname"
-                  :value="item.id"
-                />
+              <el-option
+                v-for="item in deptUsers"
+                :key="item.id"
+                :label="item.nickname"
+                :value="item.id"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -57,26 +48,11 @@
   <ContentWrap>
     <!-- 列表 -->
     <ContentWrap>
-      <ContentWrap>
-        <el-form
-          class="-mb-15px"
-          :model="queryParams"
-          ref="queryFormRef"
-          :inline="true"
-          label-width="68px"
-        >
-<!--          <el-form-item>-->
-<!--            <el-button @click="openForm" type="primary"-->
-<!--              ><Icon icon="ep:plus" class="mr-5px" /> 选择巡检设备</el-button-->
-<!--            >-->
-<!--          </el-form-item>-->
-        </el-form>
-      </ContentWrap>
       <ContentWrap>
         <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
           <el-table-column label="资产编号" align="center" prop="deviceCode" />
           <el-table-column label="设备名称" align="center" prop="deviceName" />
-          <el-table-column label="路线名称" align="center" prop="routeName" />
+<!--          <el-table-column label="路线名称" align="center" prop="routeName" />-->
           <el-table-column label="操作" align="center" min-width="120px">
             <template #default="scope">
               <div style="display: flex; justify-content: center; align-items: center; width: 100%">
@@ -86,22 +62,11 @@
                     style="vertical-align: middle"
                     link
                     type="warning"
-                    @click="viewRoute(scope.row.itemJson)"
+                    @click="viewRoute(scope.row.orderDetails)"
                   >
                     巡检路线
                   </el-button>
                 </div>
-<!--                <div>-->
-<!--                  <Icon style="vertical-align: middle; color: #ea3434" icon="ep:zoom-out" />-->
-<!--                  <el-button-->
-<!--                    style="vertical-align: middle"-->
-<!--                    link-->
-<!--                    type="danger"-->
-<!--                    @click="handleDelete(scope.row.code)"-->
-<!--                  >-->
-<!--                    移除-->
-<!--                  </el-button>-->
-<!--                </div>-->
               </div>
             </template>
           </el-table-column>
@@ -112,18 +77,10 @@
   <ContentWrap>
     <el-form>
       <el-form-item style="float: right">
-<!--        <el-button @click="submitForm" type="primary" :disabled="formLoading">保 存</el-button>-->
         <el-button @click="close">取 消</el-button>
       </el-form-item>
     </el-form>
   </ContentWrap>
-<!--  <InspectItemList-->
-<!--    ref="inspectItemFormRef"-->
-<!--    :classify="formData.deviceClassify"-->
-<!--    :deviceId="formData.deviceId"-->
-<!--    @choose="inspectItemChoose"-->
-<!--  />-->
-<!--  <InspectRouteList ref="deviceFormRef" @choose="deviceChoose" />-->
   <RouteInspectItemDrawer
     ref="showDrawer"
     :model-value="drawerVisible"
@@ -132,16 +89,11 @@
 </template>
 <script setup lang="ts">
 import * as UserApi from '@/api/system/user'
-import { useUserStore } from '@/store/modules/user'
 import { ref } from 'vue'
 import { useTagsViewStore } from '@/store/modules/tagsView'
-import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
-import InspectItemList from '@/views/pms/inspect/route/InspectItemList.vue'
-import InspectRouteList from '@/views/pms/inspect/plan/InspectRouteList.vue'
-import { IotInspectRouteVO } from '@/api/pms/inspect/route'
-import { IotInspectPlanApi, IotInspectPlanVO } from '@/api/pms/inspect/plan'
+import { useCache } from '@/hooks/web/useCache'
 import RouteInspectItemDrawer from '@/views/pms/inspect/plan/RouteInspectItemDrawer.vue'
-import {IotInspectOrderApi, IotInspectOrderVO} from "@/api/pms/inspect/order";
+import { IotInspectOrderApi, IotInspectOrderVO } from '@/api/pms/inspect/order'
 
 /** 维修工单 表单 */
 defineOptions({ name: 'IotMaintainAe' })
@@ -158,7 +110,6 @@ const showDrawer = ref()
 const list = ref<IotInspectOrderVO[]>([]) // 列表的数据
 const { params, name } = useRoute() // 查询参数
 const id = params.id
-const productClassifyList = ref<Tree[]>([]) // 树形结构
 const deptUsers = ref<UserApi.UserVO[]>([]) // 用户列表
 const formData = ref({
   planCode: undefined,
@@ -173,21 +124,17 @@ const formData = ref({
 const formRules = reactive({
   planTitle: [{ required: true, message: '巡检计划标题不能为空', trigger: 'blur' }],
   planCode: [{ required: true, message: '巡检计划编号不能为空', trigger: 'blur' }],
-  // planCycle: [{ required: true, message: '周期不能为空', trigger: 'blur' }],
   planUnit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
   charges: [{ required: true, message: '负责人不能为空', trigger: 'blur' }]
 })
 // 拖动状态管理
 const items = ref([])
 const deviceChoose = (rows) => {
-  // formData.value.deviceId = row.id
-  // formData.value.deviceName = row.deviceName
-  // formData.value.deptId = row.deptId
-  // deviceLabel.value = row.deviceName
   list.value = rows
 }
 
 const viewRoute = (itemJson) => {
+  debugger
   drawerVisible.value = true
   showDrawer.value.openDrawer(itemJson)
 }
@@ -203,51 +150,19 @@ const openForm = () => {
 
 const close = () => {
   delView(unref(currentRoute))
-  push({ name: 'IotInspectOrder', params:{}})
+  push({ name: 'IotInspectOrder', params: {} })
 }
 const { wsCache } = useCache()
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
-// const submitForm = async () => {
-//   // 校验表单
-//   await formRef.value.validate()
-//   // 提交请求
-//   formLoading.value = true
-//   try {
-//     const user = wsCache.get(CACHE_KEY.USER)
-//     formData.value.deviceIds = JSON.stringify(list.value)
-//     debugger
-//     const data = formData.value as unknown as IotInspectPlanVO
-//     if (formType.value === 'create') {
-//       formData.value.deptId = user.user.deptId
-//       await IotInspectPlanApi.createIotInspectPlan(data).then((res) => {
-//       })
-//       message.success(t('common.createSuccess'))
-//       close()
-//     } else {
-//       debugger
-//       console.log(JSON.stringify(data.charges))
-//       await IotInspectPlanApi.updateIotInspectPlan(data)
-//       message.success(t('common.updateSuccess'))
-//       close()
-//     }
-//     //创建定时任务
-//     // 发送操作成功的事件
-//     emit('success')
-//   } finally {
-//     formLoading.value = false
-//   }
-// }
 
 /** 重置表单 */
 onMounted(async () => {
-  // const deptId = useUserStore().getUser.deptId
-  // deptUsers.value = await UserApi.getDeptUsersByDeptId(deptId)
   if (id) {
     formType.value = 'update'
     const iotInspectOrder = await IotInspectOrderApi.getIotInspectOrder(id)
     formData.value = iotInspectOrder
-    list.value = JSON.parse(iotInspectOrder.deviceIds)
+    list.value = iotInspectOrder.details
   } else {
     formType.value = 'create'
   }

+ 108 - 97
src/views/pms/inspect/order/WriteOrder.vue

@@ -1,6 +1,12 @@
 <template>
-    <ContentWrap>
-    <el-tabs v-model="activeTab" type="border-card" tab-position="left" v-loading="loading" style="height: 84vh">
+  <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="(tab, tabIndex) in tabs"
@@ -14,11 +20,7 @@
         </template>
 
         <div class="step-container">
-          <el-steps
-            direction="vertical"
-            :active="currentStep[tabIndex]"
-            class="steps-nav"
-          >
+          <el-steps direction="vertical" :active="currentStep[tabIndex]" class="steps-nav">
             <el-step
               v-for="(step, stepIndex) in tab.orderDetails"
               :key="stepIndex"
@@ -28,12 +30,8 @@
               <template #title>
                 <div class="step-title-wrapper">
                   <span class="title-text">{{ step.item }}</span>
-                  <el-tooltip
-                    :content="step.standard"
-                    placement="top"
-                    effect="dark"
-                  >
-                    <Icon icon="ep:info-filled"/>
+                  <el-tooltip :content="step.standard" placement="top" effect="dark">
+                    <Icon icon="ep:info-filled" />
                   </el-tooltip>
                 </div>
               </template>
@@ -42,71 +40,82 @@
 
           <div class="form-wrapper">
             <ContentWrap>
-            <el-form
-              :model="formData[tabIndex][currentStep[tabIndex]]"
-              :rules="formRules"
-              ref="formRefs"
-              label-width="120px"
-            >
-              <el-form-item label="设备id" v-if="false" prop="deviceId">
-                <el-input
-                  v-model="formData[tabIndex][currentStep[tabIndex]].deviceId"
-                  :model-value="tab.deviceId"
-                  clearable
-                />
-              </el-form-item>
-              <el-form-item label="是否异常" prop="ifNormal">
-                <el-select
-                  v-model="formData[tabIndex][currentStep[tabIndex]].ifNormal"
-                  placeholder="请选择是否异常"
-                  clearable
-                >
-                  <el-option
-                    v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
+              <el-form
+                :model="formData[tabIndex][currentStep[tabIndex]]"
+                :rules="formRules"
+                ref="formRefs"
+                label-width="120px"
+              >
+                <el-form-item label="设备id" v-if="false" prop="deviceId">
+                  <el-input
+                    v-model="formData[tabIndex][currentStep[tabIndex]].deviceId"
+                    :model-value="tab.deviceId"
+                    clearable
                   />
-                </el-select>
-              </el-form-item>
+                </el-form-item>
+                <el-form-item label="是否异常" prop="ifNormal">
+                  <el-select
+                    v-model="formData[tabIndex][currentStep[tabIndex]].ifNormal"
+                    placeholder="请选择是否异常"
+                    clearable
+                  >
+                    <el-option
+                      v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    />
+                  </el-select>
+                </el-form-item>
 
-              <el-form-item label="异常描述" prop="description" :rules="formData[tabIndex][currentStep[tabIndex]].ifNormal?descriptionRule:[]">
-                <el-input
-                  v-model="formData[tabIndex][currentStep[tabIndex]].description"
-                  type="textarea"
-                  :rows="5"
-                  placeholder="请填写异常描述"
-                />
-              </el-form-item>
+                <el-form-item
+                  label="异常描述"
+                  prop="description"
+                  :rules="formData[tabIndex][currentStep[tabIndex]].ifNormal ? descriptionRule : []"
+                >
+                  <el-input
+                    v-model="formData[tabIndex][currentStep[tabIndex]].description"
+                    type="textarea"
+                    :rows="5"
+                    placeholder="请填写异常描述"
+                  />
+                </el-form-item>
 
-              <el-form-item label="图片" prop="picUrl">
-                <UploadImg v-model="formData[tabIndex][currentStep[tabIndex]].picUrl" height="55px" width="30em" />
-              </el-form-item>
-            </el-form>
+                <el-form-item label="图片" prop="picUrl">
+                  <UploadImg
+                    v-model="formData[tabIndex][currentStep[tabIndex]].picUrl"
+                    height="55px"
+                    width="30em"
+                  />
+                </el-form-item>
+              </el-form>
 
-            <div class="navigation-controls">
-              <el-button
-                :disabled="currentStep[tabIndex] === 0"
-                @click="handlePrev(tabIndex)"
-              >
-                上一步
-              </el-button>
+              <div class="navigation-controls">
+                <el-button :disabled="currentStep[tabIndex] === 0" @click="handlePrev(tabIndex)">
+                  上一步
+                </el-button>
 
-              <el-button
-                type="primary"
-                :disabled="!isStepValid(tabIndex)"
-                @click="handleNext(tabIndex, tab.deviceId)"
-              >
-                {{ isLastStep(tabIndex) ? '完成提交' : '下一步' }}
-              </el-button>
-            </div>
+                <el-button
+                  type="primary"
+                  :disabled="!isStepValid(tabIndex)"
+                  @click="handleNext(tabIndex, tab.deviceId)"
+                >
+                  {{ isLastStep(tabIndex) ? '完成提交' : '下一步' }}
+                </el-button>
+              </div>
             </ContentWrap>
             <ContentWrap style="margin-top: 50px">
               <el-card>
-                <span style="font-weight: bold">巡检标准:</span>{{tab.orderDetails[currentStep[tabIndex]].standard}}<br />
+                <span style="font-weight: bold">巡检标准:</span
+                >{{ tab.orderDetails[currentStep[tabIndex]].standard }}<br />
                 <el-divider />
                 <span style="font-weight: bold">附件:</span>
-                <el-button v-if="tab.orderDetails[currentStep[tabIndex]].urls" link type="primary" @click="openWeb(tab.orderDetails[currentStep[tabIndex]].urls)">
+                <el-button
+                  v-if="tab.orderDetails[currentStep[tabIndex]].urls"
+                  link
+                  type="primary"
+                  @click="openWeb(tab.orderDetails[currentStep[tabIndex]].urls)"
+                >
                   <Icon size="19" icon="ep:view" />预览
                 </el-button>
               </el-card>
@@ -115,18 +124,18 @@
         </div>
       </el-tab-pane>
     </el-tabs>
-    </ContentWrap>
+  </ContentWrap>
 </template>
 
 <script setup>
-import {useTagsViewStore} from "@/store/modules/tagsView";
+import { useTagsViewStore } from '@/store/modules/tagsView'
+import { onMounted, reactive, ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { IotInspectOrderApi } from '@/api/pms/inspect/order'
+import { DICT_TYPE, getBoolDictOptions } from '@/utils/dict'
 
 defineOptions({ name: 'InspectOrderWrite' })
 const { t } = useI18n() // 国际化
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-import {IotInspectOrderApi} from "@/api/pms/inspect/order";
-import {DICT_TYPE, getBoolDictOptions} from "@/utils/dict";
 
 const { delView } = useTagsViewStore() // 视图操作
 const { currentRoute, push } = useRouter()
@@ -143,7 +152,9 @@ onMounted(async () => {
   }
 })
 const openWeb = (url) => {
-  window.open('http://1.94.244.160:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url)));
+  window.open(
+    'http://1.94.244.160:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
+  )
 }
 // 响应式状态
 const loading = ref(true)
@@ -151,14 +162,10 @@ const activeTab = ref('0')
 const currentStep = ref({})
 const formRefs = ref([])
 const formData = reactive([])
-const descriptionRule = [
-  { required: true, message: '描述不能为空', trigger: 'blur' }
-];
+const descriptionRule = [{ required: true, message: '描述不能为空', trigger: 'blur' }]
 // 表单验证规则
 const formRules = reactive({
-  ifNormal: [
-    { required: true, message: '请输入是否异常', trigger: 'blur' }
-  ],
+  ifNormal: [{ required: true, message: '请输入是否异常', trigger: 'blur' }]
   // description: [
   //   { required: true, message: '请输入异常描述', trigger: 'blur' },
   // ],
@@ -172,7 +179,7 @@ const initFormData = (tabsData) => {
       indexId: item.indexId,
       ifNormal: item.ifNormal,
       description: item.description,
-      picUrl: item.picUrl,
+      picUrl: item.picUrl
     }))
     currentStep.value[tabIndex] = 0
   })
@@ -186,19 +193,25 @@ const getStepStatus = (tabIndex, stepIndex) => {
 
 // 完成步骤数计算
 const completedSteps = (tabIndex) => {
-  return formData[tabIndex].filter(item =>
-    item.ifNormal !=null
-  ).length
+  return formData[tabIndex].filter((item) => item.ifNormal != null).length
 }
 
 // 步骤验证
 const isStepValid = (tabIndex) => {
   const current = currentStep.value[tabIndex]
   debugger
-  if (formData[tabIndex][current].ifNormal===null||formData[tabIndex][current].ifNormal===undefined) {
+  if (
+    formData[tabIndex][current].ifNormal === null ||
+    formData[tabIndex][current].ifNormal === undefined
+  ) {
     return false
   }
-  if (formData[tabIndex][current].ifNormal&&(formData[tabIndex][current].description===undefined||formData[tabIndex][current].description===null||formData[tabIndex][current].description==='')) {
+  if (
+    formData[tabIndex][current].ifNormal &&
+    (formData[tabIndex][current].description === undefined ||
+      formData[tabIndex][current].description === null ||
+      formData[tabIndex][current].description === '')
+  ) {
     return false
   }
   return true
@@ -211,7 +224,7 @@ const handlePrev = (tabIndex) => {
   }
 }
 
-const handleNext =  (tabIndex, deviceId) => {
+const handleNext = (tabIndex, deviceId) => {
   if (!isStepValid(tabIndex)) {
     return ElMessage.warning('请先完成当前步骤的必填项')
   }
@@ -219,14 +232,14 @@ const handleNext =  (tabIndex, deviceId) => {
   const totalSteps = tabs.value[tabIndex].orderDetails.length
   debugger
   if (currentStep.value[tabIndex] < totalSteps - 1) {
-    formData[tabIndex][current].indexId = current+1
+    formData[tabIndex][current].indexId = current + 1
     formData[tabIndex][current].deviceId = deviceId
     currentStep.value[tabIndex]++
-     submitForm(tabIndex, current, '')
+    submitForm(tabIndex, current, '')
   } else {
-    formData[tabIndex][current].indexId = current+1
+    formData[tabIndex][current].indexId = current + 1
     formData[tabIndex][current].deviceId = deviceId
-     submitForm(tabIndex, current,'finish')
+    submitForm(tabIndex, current, 'finish')
   }
 }
 
@@ -236,24 +249,22 @@ const isLastStep = (tabIndex) => {
 }
 
 // 提交表单
-const submitForm =  (tabIndex,current,type) => {
+const submitForm = (tabIndex, current, type) => {
   try {
     IotInspectOrderApi.writeIotInspectOrder(formData[tabIndex][current], id)
     if (type === 'finish') {
       message.success(t('common.createSuccess'))
       delView(unref(currentRoute))
-      push({ name: 'IotInspectOrder', params:{}})
+      push({ name: 'IotInspectOrder', params: {} })
     }
   } catch (error) {
     debugger
     ElMessage.error('提交失败,请检查数据')
   }
 }
-
 </script>
 
 <style scoped>
-
 .step-container {
   display: grid;
   grid-template-columns: 220px 1fr;
@@ -271,7 +282,7 @@ const submitForm =  (tabIndex,current,type) => {
   background: #fff;
   padding: 30px;
   border-radius: 8px;
-  box-shadow: 0 2px 12px rgba(0,0,0,0.1);
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
 }
 
 .navigation-controls {

+ 148 - 149
src/views/pms/inspect/order/index.vue

@@ -6,153 +6,151 @@
       </ContentWrap>
     </el-col>
     <el-col :span="20" :xs="24">
-    <ContentWrap>
-      <!-- 搜索工作栏 -->
-      <el-form
-        class="-mb-15px"
-        :model="queryParams"
-        ref="queryFormRef"
-        :inline="true"
-        label-width="68px"
-      >
-        <el-form-item label="工单名" prop="inspectOrderTitle">
-          <el-input
-            v-model="queryParams.inspectOrderTitle"
-            placeholder="请输入工单名"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-240px"
-          />
-        </el-form-item>
-        <el-form-item label="工单编码" prop="inspectOrderCode">
-          <el-input
-            v-model="queryParams.inspectOrderCode"
-            placeholder="请输入工单编码"
-            clearable
-            @keyup.enter="handleQuery"
-            class="!w-240px"
-          />
-        </el-form-item>
-        <el-form-item label="工单状态" prop="status">
-          <el-select
-            v-model="queryParams.status"
-            placeholder="工单状态"
-            clearable
-            class="!w-240px"
-          >
-            <el-option
-              v-for="dict in getStrDictOptions(DICT_TYPE.PMS_INSPECT_ORDER_STATUS)"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
+      <ContentWrap>
+        <!-- 搜索工作栏 -->
+        <el-form
+          class="-mb-15px"
+          :model="queryParams"
+          ref="queryFormRef"
+          :inline="true"
+          label-width="68px"
+        >
+          <el-form-item label="工单名" prop="inspectOrderTitle">
+            <el-input
+              v-model="queryParams.inspectOrderTitle"
+              placeholder="请输入工单名"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-240px"
             />
-          </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-button-->
-<!--            type="primary"-->
-<!--            plain-->
-<!--            @click="openForm('create')"-->
-<!--            v-hasPermi="['rq:iot-inspect-order:create']"-->
-<!--          >-->
-<!--            <Icon icon="ep:plus" class="mr-5px" /> 新增-->
-<!--          </el-button>-->
-          <el-button
-            type="success"
-            plain
-            @click="handleExport"
-            :loading="exportLoading"
-            v-hasPermi="['rq:iot-inspect-order:export']"
-          >
-            <Icon icon="ep:download" class="mr-5px" /> 导出
-          </el-button>
-        </el-form-item>
-      </el-form>
-    </ContentWrap>
-
-    <!-- 列表 -->
-    <ContentWrap>
-      <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="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="inspectOrderTitle" />
-        <el-table-column label="工单编码" align="center" prop="inspectOrderCode" />
-        <el-table-column label="工单类型" align="center" prop="type" />
-        <el-table-column label="工单状态" align="center" prop="status" >
-          <template #default="scope">
-            <dict-tag :type="DICT_TYPE.PMS_INSPECT_ORDER_STATUS" :value="scope.row.status" />
-          </template>
-        </el-table-column>
-        <el-table-column label="负责人" align="center" prop="chargeName" />
-        <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" min-width="120px">
-          <template #default="scope">
-  <!--          <el-button-->
-  <!--            link-->
-  <!--            type="primary"-->
-  <!--            @click="openForm('update', scope.row.id)"-->
-  <!--            v-hasPermi="['rq:iot-inspect-order:update']"-->
-  <!--          >-->
-  <!--            编辑-->
-  <!--          </el-button>-->
-  <!--          <el-button-->
-  <!--            link-->
-  <!--            type="danger"-->
-  <!--            @click="handleDelete(scope.row.id)"-->
-  <!--            v-hasPermi="['rq:iot-inspect-order:delete']"-->
-  <!--          >-->
-  <!--            删除-->
-  <!--          </el-button>-->
-            <el-button
-              link
-              type="primary"
-              @click="openForm(scope.row.id)"
+          </el-form-item>
+          <el-form-item label="工单编码" prop="inspectOrderCode">
+            <el-input
+              v-model="queryParams.inspectOrderCode"
+              placeholder="请输入工单编码"
+              clearable
+              @keyup.enter="handleQuery"
+              class="!w-240px"
+            />
+          </el-form-item>
+          <el-form-item label="工单状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="工单状态"
+              clearable
+              class="!w-240px"
             >
-              查看
-            </el-button>
+              <el-option
+                v-for="dict in getStrDictOptions(DICT_TYPE.PMS_INSPECT_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-button-->
+            <!--            type="primary"-->
+            <!--            plain-->
+            <!--            @click="openForm('create')"-->
+            <!--            v-hasPermi="['rq:iot-inspect-order:create']"-->
+            <!--          >-->
+            <!--            <Icon icon="ep:plus" class="mr-5px" /> 新增-->
+            <!--          </el-button>-->
             <el-button
-              v-if="scope.row.status==='todo'"
-              link
-              type="primary"
-              @click="openWrite(scope.row.id)"
-              v-hasPermi="['rq:iot-inspect-order:update']"
+              type="success"
+              plain
+              @click="handleExport"
+              :loading="exportLoading"
+              v-hasPermi="['rq:iot-inspect-order:export']"
             >
-              填写
+              <Icon icon="ep:download" class="mr-5px" /> 导出
             </el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <!-- 分页 -->
-      <Pagination
-        :total="total"
-        v-model:page="queryParams.pageNo"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
-    </ContentWrap>
+          </el-form-item>
+        </el-form>
+      </ContentWrap>
+
+      <!-- 列表 -->
+      <ContentWrap>
+        <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="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="inspectOrderTitle" />
+          <el-table-column label="工单编码" align="center" prop="inspectOrderCode" />
+          <el-table-column label="工单类型" align="center" prop="type" />
+          <el-table-column label="工单状态" align="center" prop="status">
+            <template #default="scope">
+              <dict-tag :type="DICT_TYPE.PMS_INSPECT_ORDER_STATUS" :value="scope.row.status" />
+            </template>
+          </el-table-column>
+          <el-table-column label="负责人" align="center" prop="chargeName" />
+          <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" min-width="120px">
+            <template #default="scope">
+              <!--          <el-button-->
+              <!--            link-->
+              <!--            type="primary"-->
+              <!--            @click="openForm('update', scope.row.id)"-->
+              <!--            v-hasPermi="['rq:iot-inspect-order:update']"-->
+              <!--          >-->
+              <!--            编辑-->
+              <!--          </el-button>-->
+              <!--          <el-button-->
+              <!--            link-->
+              <!--            type="danger"-->
+              <!--            @click="handleDelete(scope.row.id)"-->
+              <!--            v-hasPermi="['rq:iot-inspect-order:delete']"-->
+              <!--          >-->
+              <!--            删除-->
+              <!--          </el-button>-->
+              <el-button link type="primary" @click="openForm(scope.row.id)"> 查看 </el-button>
+              <el-button
+                v-if="scope.row.status === 'todo'"
+                link
+                type="primary"
+                @click="openWrite(scope.row.id)"
+                v-hasPermi="['rq:iot-inspect-order:update']"
+              >
+                填写
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页 -->
+        <Pagination
+          :total="total"
+          v-model:page="queryParams.pageNo"
+          v-model:limit="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </ContentWrap>
     </el-col>
   </el-row>
   <!-- 表单弹窗:添加/修改 -->
@@ -164,8 +162,9 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { IotInspectOrderApi, IotInspectOrderVO } from '@/api/pms/inspect/order'
 import IotInspectOrderForm from './IotInspectOrderForm.vue'
-import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
-import DeptTree from "@/views/system/user/DeptTree.vue";
+import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
+import DeptTree from '@/views/system/user/DeptTree.vue'
+
 const { push } = useRouter()
 
 /** 巡检工单 列表 */
@@ -186,7 +185,7 @@ const queryParams = reactive({
   remark: undefined,
   createTime: [],
   deptId: undefined,
-  deviceIds: undefined,
+  deviceIds: undefined
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
@@ -221,17 +220,17 @@ const resetQuery = () => {
 /** 添加/修改操作 */
 const formRef = ref()
 const openForm = (id?: number) => {
-  push({ name: 'InspectOrderDetail', params:{id} })
+  push({ name: 'InspectOrderDetail', params: { id } })
 }
 const openWrite = (id?: number) => {
   IotInspectOrderApi.getIotInspectOrder(id).then((res) => {
     debugger
-    if (res.status==='finished') {
-      message.warning("该工单已执行");
+    if (res.status === 'finished') {
+      message.warning('该工单已执行')
       return
     }
   })
-  push({ name: 'InspectOrderWrite', params:{id} })
+  push({ name: 'InspectOrderWrite', params: { id } })
 }
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {

+ 20 - 42
src/views/pms/inspect/plan/IotInspectPlan.vue

@@ -41,24 +41,24 @@
                 />
               </el-form-item>
             </el-col>
-<!--            <el-col :span="12">-->
-<!--              <el-form-item label="负责人" prop="charges">-->
-<!--                <el-select-->
-<!--                  clearable-->
-<!--                  filterable-->
-<!--                  v-model="formData.charges"-->
-<!--                  multiple-->
-<!--                  style="width: 100%"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="item in deptUsers"-->
-<!--                    :key="item.id"-->
-<!--                    :label="item.nickname"-->
-<!--                    :value="item.id"-->
-<!--                  />-->
-<!--                </el-select>-->
-<!--              </el-form-item>-->
-<!--            </el-col>-->
+            <!--            <el-col :span="12">-->
+            <!--              <el-form-item label="负责人" prop="charges">-->
+            <!--                <el-select-->
+            <!--                  clearable-->
+            <!--                  filterable-->
+            <!--                  v-model="formData.charges"-->
+            <!--                  multiple-->
+            <!--                  style="width: 100%"-->
+            <!--                >-->
+            <!--                  <el-option-->
+            <!--                    v-for="item in deptUsers"-->
+            <!--                    :key="item.id"-->
+            <!--                    :label="item.nickname"-->
+            <!--                    :value="item.id"-->
+            <!--                  />-->
+            <!--                </el-select>-->
+            <!--              </el-form-item>-->
+            <!--            </el-col>-->
             <el-col :span="24">
               <el-form-item label="备注" prop="remark">
                 <el-input type="textarea" v-model="formData.remark" />
@@ -193,7 +193,7 @@ const formRules = reactive({
   planTitle: [{ required: true, message: '巡检计划标题不能为空', trigger: 'blur' }],
   planCode: [{ required: true, message: '巡检计划编号不能为空', trigger: 'blur' }],
   planCycle: [{ required: true, message: '周期不能为空', trigger: 'blur' }],
-  planUnit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
+  planUnit: [{ required: true, message: '单位不能为空', trigger: 'blur' }]
   // charges: [{ required: true, message: '负责人不能为空', trigger: 'blur' }]
 })
 // 拖动状态管理
@@ -208,7 +208,7 @@ const deviceChoose = (rows) => {
 
 const viewRoute = (itemJson) => {
   drawerVisible.value = true
-  showDrawer.value.openDrawer(itemJson)
+  showDrawer.value.openDrawer(JSON.parse(itemJson))
 }
 const formRef = ref() // 表单 Ref
 const inspectItemChoose = (rows) => {
@@ -247,27 +247,6 @@ const submitForm = async () => {
     if (formType.value === 'create') {
       formData.value.deptId = user.user.deptId
       await IotInspectPlanApi.createIotInspectPlan(data).then((res) => {
-        // let cron = '';
-        // if (formData.value.planUnit==='hour') {
-        //   // cron = '0 '+formData.value.planCycle+' * * * ?'
-        //   cron = '0 0/'+formData.value.planCycle+' * * * ?'
-        // } else if (formData.value.planUnit==='day') {
-        //   cron = '0 0 0 */'+formData.value.planCycle+' * ?';
-        // } else if (formData.value.planUnit==='month') {
-        //   cron = '0 0 0 1 */'+formData.value.planCycle+' ?'
-        // }
-        // debugger
-        // const job = {
-        //   name: '巡检工单'+res,
-        //   status: 1,
-        //   handlerName: 'inspectCreateOrderJob',
-        //   handlerParam: res,
-        //   cronExpression: cron,
-        //   retryCount: 0,
-        //   retryInterval: 0,
-        //   monitorTimeout: 0
-        // }
-        // JobApi.createJob(job)
       })
       message.success(t('common.createSuccess'))
       close()
@@ -293,7 +272,6 @@ onMounted(async () => {
     formType.value = 'update'
     const iotInspectPlan = await IotInspectPlanApi.getIotInspectPlan(id)
     formData.value = iotInspectPlan
-    debugger
     list.value = JSON.parse(iotInspectPlan.deviceIds)
   } else {
     formType.value = 'create'

+ 20 - 7
src/views/pms/inspect/plan/RouteInspectItemDrawer.vue

@@ -28,8 +28,16 @@
 
             <!-- 组件内容 -->
             <div class="component-content">
-              <span style="font-weight: bold">巡检项:</span><span style="font-size: 14px">{{ element.item }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-              <span style="font-weight: bold">巡检标准:</span><span style="font-size: 14px">{{element.standard}}</span>
+              <span style="font-weight: bold">巡检项:</span
+              ><span style="font-size: 14px">{{ element.item }}</span
+              >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-weight: bold">巡检标准:</span
+              ><span style="font-size: 14px">{{ element.standard }}</span><br/>
+              <div v-if="element.ifNormal!=undefined">
+                <span style="font-weight: bold;color: #2bb673">是否异常:</span><span style="font-size: 14px">{{ element.ifNormal?"是":"否" }}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                <span style="font-weight: bold;color: #2bb673">异常描述:</span
+              ><span style="font-size: 14px">{{ element.description }}</span><br/>
+                <span style="font-weight: bold;color: #2bb673" v-if="element.urls">图片:<span style="font-size: 14px"><Icon icon="ep:view" @click="openWeb(element.urls)" /></span></span>
+              </div>
             </div>
           </div>
         </template>
@@ -40,6 +48,7 @@
 <script setup lang="ts">
 import { defineEmits, defineOptions, ref } from 'vue'
 import draggable from 'vuedraggable'
+
 const drawerVisible = ref<boolean>(false)
 const emit = defineEmits(['update:modelValue', 'add'])
 const items = ref([])
@@ -58,12 +67,16 @@ const total = ref(0) // 列表的总页数
 const props = defineProps({
   modelValue: Boolean
 })
-
+const openWeb = (url) => {
+  window.open(
+    'http://1.94.244.160:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
+  )
+}
 // 打开抽屉
 const openDrawer = (itemJson) => {
   drawerVisible.value = true
   debugger
-  items.value = JSON.parse(itemJson)
+  items.value = itemJson
 }
 
 // 关闭抽屉
@@ -80,8 +93,6 @@ defineExpose({ openDrawer, closeDrawer }) // 暴露方法给父组件
 </script>
 
 <style lang="scss" scoped>
-
-
 .sortable-container {
   display: flex;
   flex-direction: column;
@@ -98,7 +109,9 @@ defineExpose({ openDrawer, closeDrawer }) // 暴露方法给父组件
   background: #fff;
   border: 1px solid #ebeef5;
   border-radius: 8px;
-  transition: transform 0.3s, box-shadow 0.3s;
+  transition:
+    transform 0.3s,
+    box-shadow 0.3s;
   user-select: none;
 }
 

+ 12 - 17
src/views/pms/inspect/route/InspectItemList.vue

@@ -54,15 +54,6 @@
         row-key="id"
         @selection-change="handleSelectionChange"
       >
-        <!--        <el-table-column width="60" label="选择" type="selection" :reserve-selection="true">-->
-        <!--          <template #default="{ row }">-->
-        <!--            <el-checkbox-->
-        <!--              :model-value="selectedRows.some(item => item.id === row.id)"-->
-        <!--              @click.stop="toggleRow(row)"-->
-        <!--              class="no-label-radio"-->
-        <!--            />-->
-        <!--          </template>-->
-        <!--        </el-table-column>-->
         <el-table-column
           type="selection"
           :reserve-selection="true"
@@ -70,9 +61,11 @@
         />
         <el-table-column label="巡检项" align="center" prop="item" />
         <el-table-column label="巡检标准" align="center" prop="standard" />
-        <el-table-column label="附件" align="center" prop="urls" >
+        <el-table-column label="附件" align="center" prop="urls">
           <template #default="scope">
-            <el-button v-if="scope.row.urls" link type="primary" @click="openWeb(scope.row.urls)"> <Icon size="19" icon="ep:view" /></el-button>
+            <el-button v-if="scope.row.urls" link type="primary" @click="openWeb(scope.row.urls)">
+              <Icon size="19" icon="ep:view"
+            /></el-button>
           </template>
         </el-table-column>
         <el-table-column label="排序" align="center" prop="sort" />
@@ -97,7 +90,7 @@
 <script setup lang="ts">
 import { IotDeviceVO } from '@/api/pms/device'
 import { dateFormatter } from '@/utils/formatTime'
-import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+import { useCache } from '@/hooks/web/useCache'
 import { IotInspectItemApi, IotInspectItemVO } from '@/api/pms/inspect/item'
 
 const emit = defineEmits(['choose']) // 定义 success 事件,用于操作成功后的回调
@@ -113,10 +106,12 @@ const queryParams = reactive({
   deptId: undefined,
   deviceClassify: undefined,
   deviceId: undefined,
-  createTime: undefined,
+  createTime: undefined
 })
 const openWeb = (url) => {
-  window.open('http://1.94.244.160:8012/onlinePreview?url='+encodeURIComponent(Base64.encode(url)));
+  window.open(
+    'http://1.94.244.160:8012/onlinePreview?url=' + encodeURIComponent(Base64.encode(url))
+  )
 }
 const toggleAll = () => {
   list.value.forEach((row) => {
@@ -155,7 +150,7 @@ const open = async (classify, id) => {
   selectedRows.value = []
   queryParams.createTime = undefined
   queryParams.item = undefined
-  queryParams.pageNo = 1;
+  queryParams.pageNo = 1
   queryParams.deviceId = undefined
   debugger
   if (id) {
@@ -179,7 +174,7 @@ const getList = async () => {
     const data = await IotInspectItemApi.getIotInspectItemPage(queryParams)
     list.value = data.list
     list.value = list.value.sort((a, b) => {
-      return a.sort-b.sort
+      return a.sort - b.sort
     })
     total.value = data.total
   } finally {
@@ -200,7 +195,7 @@ const handleConfirm = () => {
       ...row,
       // 确保返回必要字段
       code: row.item,
-      name: row.standard,
+      name: row.standard
     }))
   )
   dialogVisible.value = false

+ 48 - 45
src/views/pms/maintain/IotMaintain.vue

@@ -18,7 +18,7 @@
                   clearable
                   @clear="deviceClear"
                   placeholder="请选择设备"
-                  @click="formType==='update'?undefined:openForm()"
+                  @click="formType === 'update' ? undefined : openForm()"
                 />
               </el-form-item>
             </el-col>
@@ -47,7 +47,11 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="维修开始时间" prop="maintainStartTime" :rules="formData.type==='in'?startRule:[]">
+              <el-form-item
+                label="维修开始时间"
+                prop="maintainStartTime"
+                :rules="formData.type === 'in' ? startRule : []"
+              >
                 <el-date-picker
                   style="width: 150%"
                   v-model="formData.maintainStartTime"
@@ -58,7 +62,11 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="维修结束时间" prop="maintainEndTime" :rules="formData.type==='in'?endRule:[]">
+              <el-form-item
+                label="维修结束时间"
+                prop="maintainEndTime"
+                :rules="formData.type === 'in' ? endRule : []"
+              >
                 <el-date-picker
                   @change="endTimeBlur"
                   style="width: 150%"
@@ -69,23 +77,23 @@
                 />
               </el-form-item>
             </el-col>
-<!--            <el-col :span="8">-->
-<!--              <el-form-item label="维修负责人" prop="maintainPerson">-->
-<!--                <el-select-->
-<!--                  v-model="formData.maintainPerson"-->
-<!--                  filterable-->
-<!--                  clearable-->
-<!--                  style="width: 100%"-->
-<!--                >-->
-<!--                  <el-option-->
-<!--                    v-for="item in deptUsers"-->
-<!--                    :key="item.id"-->
-<!--                    :label="item.nickname"-->
-<!--                    :value="item.id"-->
-<!--                  />-->
-<!--                </el-select>-->
-<!--              </el-form-item>-->
-<!--            </el-col>-->
+            <!--            <el-col :span="8">-->
+            <!--              <el-form-item label="维修负责人" prop="maintainPerson">-->
+            <!--                <el-select-->
+            <!--                  v-model="formData.maintainPerson"-->
+            <!--                  filterable-->
+            <!--                  clearable-->
+            <!--                  style="width: 100%"-->
+            <!--                >-->
+            <!--                  <el-option-->
+            <!--                    v-for="item in deptUsers"-->
+            <!--                    :key="item.id"-->
+            <!--                    :label="item.nickname"-->
+            <!--                    :value="item.id"-->
+            <!--                  />-->
+            <!--                </el-select>-->
+            <!--              </el-form-item>-->
+            <!--            </el-col>-->
             <el-col :span="8">
               <el-form-item label="故障时间" prop="failureTime">
                 <el-date-picker
@@ -112,16 +120,16 @@
                 <UploadImg v-model="formData.pic" height="55px" />
               </el-form-item>
             </el-col>
-<!--            <el-col :span="8" v-if="formData.type === 'out'">-->
-<!--              <el-form-item label="供应商" prop="supplier" :rules="supplierRules">-->
-<!--                <el-select-->
-<!--                  v-model="formData.supplier"-->
-<!--                  placeholder="请输入供应商"-->
-<!--                  :model-value="supplierLabel"-->
-<!--                  @click="openCustomer('supplier')"-->
-<!--                />-->
-<!--              </el-form-item>-->
-<!--            </el-col>-->
+            <!--            <el-col :span="8" v-if="formData.type === 'out'">-->
+            <!--              <el-form-item label="供应商" prop="supplier" :rules="supplierRules">-->
+            <!--                <el-select-->
+            <!--                  v-model="formData.supplier"-->
+            <!--                  placeholder="请输入供应商"-->
+            <!--                  :model-value="supplierLabel"-->
+            <!--                  @click="openCustomer('supplier')"-->
+            <!--                />-->
+            <!--              </el-form-item>-->
+            <!--            </el-col>-->
             <el-col :span="8" v-if="formData.type === 'in'">
               <el-form-item label="维修费用(元)" prop="maintainFee">
                 <el-input-number
@@ -134,11 +142,11 @@
                 />
               </el-form-item>
             </el-col>
-<!--            <el-col :span="8" v-if="formData.type === 'out'">-->
-<!--              <el-form-item label="委外相关附件" prop="outFile">-->
-<!--                <UploadFile v-model="formData.outFile" class="min-w-80px" />-->
-<!--              </el-form-item>-->
-<!--            </el-col>-->
+            <!--            <el-col :span="8" v-if="formData.type === 'out'">-->
+            <!--              <el-form-item label="委外相关附件" prop="outFile">-->
+            <!--                <UploadFile v-model="formData.outFile" class="min-w-80px" />-->
+            <!--              </el-form-item>-->
+            <!--            </el-col>-->
             <el-col :span="16">
               <el-form-item label="故障描述" prop="description">
                 <el-input type="textarea" v-model="formData.description" />
@@ -278,7 +286,6 @@ import { useUserStore } from '@/store/modules/user'
 import { ref } from 'vue'
 import { IotMaintainMaterialVO } from '@/api/pms/maintain/material'
 import { useTagsViewStore } from '@/store/modules/tagsView'
-import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 import CustomerList from '@/views/pms/device/CustomerList.vue'
 import WorkOrderMaterial from '@/views/pms/iotmainworkorder/WorkOrderMaterial.vue'
 import { IotMainWorkOrderBomMaterialVO } from '@/api/pms/iotmainworkorderbommaterial'
@@ -337,12 +344,8 @@ const formData = ref({
   maintainFee: undefined,
   outFile: undefined
 })
-const startRule = [
-  { required: true, message: '维修开始时间不能为空', trigger: 'blur' }
-];
-const endRule = [
-  { required: true, message: '维修结束时间不能为空', trigger: 'blur' }
-];
+const startRule = [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]
+const endRule = [{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]
 const formRules = reactive({
   deviceName: [{ required: true, message: '设备不能为空', trigger: 'blur' }],
   failureCode: [{ required: true, message: '故障编码不能为空', trigger: 'blur' }],
@@ -400,7 +403,7 @@ const deviceChoose = (row) => {
   // deviceLabel.value = row.deviceName
   list.value = []
 }
-const deviceClear = () =>{
+const deviceClear = () => {
   formData.value.deviceId = undefined
   formData.value.deviceName = undefined
   formData.value.deviceCode = undefined
@@ -485,11 +488,11 @@ const selectChoose = (selectedMaterial) => {
     }
     if (item.materials) {
       item.materials.forEach((it) => {
-        totalFee.value = it.unitPrice * it.quantity+totalFee.value
+        totalFee.value = it.unitPrice * it.quantity + totalFee.value
       })
     }
   })
-  formData.value.maintainFee = totalFee.value;
+  formData.value.maintainFee = totalFee.value
   console.log('选择完成的数据:', JSON.stringify(selectedMaterial))
   console.log('添加到本地列表的数据:', materialList.value)
 }

+ 41 - 33
src/views/pms/maintain/IotMaintainDetail.vue

@@ -52,7 +52,11 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="维修开始时间" prop="maintainStartTime" :rules="formData.type === 'in' ? startRule : []">
+            <el-form-item
+              label="维修开始时间"
+              prop="maintainStartTime"
+              :rules="formData.type === 'in' ? startRule : []"
+            >
               <el-date-picker
                 disabled
                 style="width: 150%"
@@ -63,7 +67,11 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="维修结束时间" prop="maintainEndTime" :rules="formData.type === 'in' ? endRule : []">
+            <el-form-item
+              label="维修结束时间"
+              prop="maintainEndTime"
+              :rules="formData.type === 'in' ? endRule : []"
+            >
               <el-date-picker
                 disabled
                 style="width: 150%"
@@ -122,34 +130,34 @@
               <el-input v-model="formData.maintainFee" :disabled="true" />
             </el-form-item>
           </el-col>
-<!--          <el-col :span="8" v-if="formData.type === 'out'">-->
-<!--            <el-form-item label="供应商" prop="supplier">-->
-<!--              <el-select-->
-<!--                disabled-->
-<!--                v-model="formData.supplier"-->
-<!--                placeholder="请输入供应商"-->
-<!--                :model-value="supplierLabel"-->
-<!--              />-->
-<!--            </el-form-item>-->
-<!--          </el-col>-->
-<!--          <el-col :span="8" v-if="formData.type === 'out'">-->
-<!--            <el-form-item label="维修费用" prop="maintainFee">-->
-<!--              <el-input-number-->
-<!--                disabled-->
-<!--                v-model="formData.maintainFee"-->
-<!--                :min="0"-->
-<!--                :precision="2"-->
-<!--                :step="0.1"-->
-<!--                placeholder="请输入维修费用"-->
-<!--                style="width: 100%"-->
-<!--              />-->
-<!--            </el-form-item>-->
-<!--          </el-col>-->
-<!--          <el-col :span="8" v-if="formData.type === 'out'">-->
-<!--            <el-form-item label="委外相关附件" prop="outFile">-->
-<!--              <UploadFile disabled="" v-model="formData.outFile" class="min-w-80px" />-->
-<!--            </el-form-item>-->
-<!--          </el-col>-->
+          <!--          <el-col :span="8" v-if="formData.type === 'out'">-->
+          <!--            <el-form-item label="供应商" prop="supplier">-->
+          <!--              <el-select-->
+          <!--                disabled-->
+          <!--                v-model="formData.supplier"-->
+          <!--                placeholder="请输入供应商"-->
+          <!--                :model-value="supplierLabel"-->
+          <!--              />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="8" v-if="formData.type === 'out'">-->
+          <!--            <el-form-item label="维修费用" prop="maintainFee">-->
+          <!--              <el-input-number-->
+          <!--                disabled-->
+          <!--                v-model="formData.maintainFee"-->
+          <!--                :min="0"-->
+          <!--                :precision="2"-->
+          <!--                :step="0.1"-->
+          <!--                placeholder="请输入维修费用"-->
+          <!--                style="width: 100%"-->
+          <!--              />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="8" v-if="formData.type === 'out'">-->
+          <!--            <el-form-item label="委外相关附件" prop="outFile">-->
+          <!--              <UploadFile disabled="" v-model="formData.outFile" class="min-w-80px" />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
           <el-col :span="8">
             <el-form-item label="故障描述" prop="description">
               <el-input type="textarea" v-model="formData.description" disabled />
@@ -240,7 +248,7 @@ const drawerVisible = ref<boolean>(false)
 const showDrawer = ref()
 const list = ref<IotMaintainMaterialVO[]>([]) // 列表的数据
 const { params, name } = useRoute() // 查询参数
-const id = params.id ||props.id
+const id = params.id || props.id
 const materialList = ref<any[]>([]) // 保养工单bom关联物料列表
 const currentBomNodeId = ref<string>()
 const formData = ref({
@@ -305,10 +313,10 @@ const close = () => {
 }
 const startRule = [
   // { required: true, message: '维修开始时间不能为空', trigger: 'blur' }
-];
+]
 const endRule = [
   // { required: true, message: '维修结束时间不能为空', trigger: 'blur' }
-];
+]
 const handleViewNew = (nodeId, bomId) => {
   drawerVisible.value = true
   // showDrawer.value.openDrawer()