lipenghui před 3 měsíci
rodič
revize
125a0820b0

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

@@ -412,6 +412,55 @@ const remainingRouter: AppRouteRecordRaw[] = [
       },
     ]
   },
+  {
+    path: '/iotpms/iotinspectorder',
+    component: Layout,
+    name: 'PmsInspectOrderCenter',
+    meta: {
+      hidden: true
+    },
+    children: [
+      {
+        path: 'inspect/order/add',
+        component: () => import('@/views/pms/inspect/order/InspectOrderDetail.vue'),
+        name: 'InspectOrderAdd',
+        meta: {
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:add',
+          title: '巡检工单填写',
+          activeMenu: '/inspect/order/add'
+        }
+      },
+      {
+        path: 'inspect/order/edit/:id(\\d+)',
+        component: () => import('@/views/pms/inspect/order/InspectOrderDetail.vue'),
+        name: 'InspectOrderEdit',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          icon: 'ep:edit',
+          title: '巡检计划编辑',
+          activeMenu: '/inspect/order/edit'
+        }
+        }
+        ,{
+          path: '/inspect/order/detail/:id(\\d+)',
+          component: () => import('@/views/pms/inspect/order/InspectOrderDetail.vue'),
+          name: 'InspectOrderDetail',
+          meta: {
+            noCache: false,
+            hidden: true,
+            canTo: true,
+            icon: 'ep:add',
+            title: '巡检工单详情',
+            activeMenu: '/inspect/order/detail'
+          }
+      },
+    ]
+  },
   {
     path: '/failure',
     component: Layout,

+ 1 - 0
src/utils/dict.ts

@@ -107,6 +107,7 @@ export const getDictLabel = (dictType: string, value: any): string => {
 }
 
 export enum DICT_TYPE {
+  PMS_INSPECT_ORDER_STATUS = "pms_inspect_order_status",
   PMS_INSPECT_UNIT = "pms_inspect_unit",
   PMS_MAIN_STATUS_NO = 'pms_maintain_status_no',
   PMS_MAIN_STATUS = 'pms_maintain_status',

+ 276 - 0
src/views/pms/inspect/order/InspectOrderDetail.vue

@@ -0,0 +1,276 @@
+<template>
+  <ContentWrap v-loading="formLoading">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      v-loading="formLoading"
+      style="margin-right: 4em; margin-left: 0.5em; margin-top: 1em"
+      label-width="130px"
+    >
+      <div class="base-expandable-content">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="计划编码" prop="planCode">
+              <el-input v-model="formData.planCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="工单名称" prop="inspectOrderTitle">
+              <el-input v-model="formData.inspectOrderTitle" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="工单编码" prop="inspectOrderCode">
+              <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-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input type="textarea" v-model="formData.remark" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </div>
+    </el-form>
+  </ContentWrap>
+  <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" min-width="120px">
+            <template #default="scope">
+              <div style="display: flex; justify-content: center; align-items: center; width: 100%">
+                <div style="margin-right: 10px">
+                  <Icon style="vertical-align: middle; color: #c36e5b" icon="ep:view" />
+                  <el-button
+                    style="vertical-align: middle"
+                    link
+                    type="warning"
+                    @click="viewRoute(scope.row.itemJson)"
+                  >
+                    巡检路线
+                  </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>
+        </el-table>
+      </ContentWrap>
+    </ContentWrap>
+  </ContentWrap>
+  <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"
+    @update:model-value="(val) => (drawerVisible = val)"
+  />
+</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 RouteInspectItemDrawer from '@/views/pms/inspect/plan/RouteInspectItemDrawer.vue'
+import {IotInspectOrderApi, IotInspectOrderVO} from "@/api/pms/inspect/order";
+
+/** 维修工单 表单 */
+defineOptions({ name: 'IotMaintainAe' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+const { delView } = useTagsViewStore() // 视图操作
+const { currentRoute, push } = useRouter()
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const drawerVisible = ref<boolean>(false)
+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,
+  id: undefined,
+  inspectOrderTitle: undefined,
+  inspectOrderCode: undefined,
+  status: undefined,
+  remark: undefined,
+  deptId: undefined,
+  deviceIds: undefined
+})
+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) => {
+  drawerVisible.value = true
+  showDrawer.value.openDrawer(itemJson)
+}
+const formRef = ref() // 表单 Ref
+const inspectItemChoose = (rows) => {
+  items.value = []
+  items.value = rows
+}
+const deviceFormRef = ref()
+const openForm = () => {
+  deviceFormRef.value.open()
+}
+
+const close = () => {
+  delView(unref(currentRoute))
+  push({
+    name: 'IotInspectOrder',
+    query: {
+      date: new Date().getTime()
+    }
+  })
+}
+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)
+  } else {
+    formType.value = 'create'
+  }
+})
+const handleDelete = async (id: number) => {
+  try {
+    const index = list.value.findIndex((item) => item.code === id)
+    if (index !== -1) {
+      // 通过 splice 删除元素
+      list.value.splice(index, 1)
+    }
+  } catch {}
+}
+</script>
+<style scoped>
+.base-expandable-content {
+  overflow: hidden; /* 隐藏溢出的内容 */
+  transition: max-height 0.3s ease; /* 平滑过渡效果 */
+}
+/* 横向布局容器 */
+</style>

+ 46 - 49
src/views/pms/inspect/order/index.vue

@@ -8,43 +8,39 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="巡检工单名" prop="inspectOrderTitle">
+      <el-form-item label="工单名" prop="inspectOrderTitle">
         <el-input
           v-model="queryParams.inspectOrderTitle"
-          placeholder="请输入巡检工单名"
+          placeholder="请输入工单名"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="巡检工单编码" prop="inspectOrderCode">
+      <el-form-item label="工单编码" prop="inspectOrderCode">
         <el-input
           v-model="queryParams.inspectOrderCode"
-          placeholder="请输入巡检工单编码"
+          placeholder="请输入工单编码"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="巡检工单状态" prop="status">
+      <el-form-item label="工单状态" prop="status">
         <el-select
           v-model="queryParams.status"
-          placeholder="请选择巡检工单状态"
+          placeholder="工单状态"
           clearable
           class="!w-240px"
         >
-          <el-option label="请选择字典生成" value="" />
+          <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="remark">
-        <el-input
-          v-model="queryParams.remark"
-          placeholder="请输入备注"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
       <el-form-item label="创建时间" prop="createTime">
         <el-date-picker
           v-model="queryParams.createTime"
@@ -56,24 +52,6 @@
           class="!w-220px"
         />
       </el-form-item>
-      <el-form-item label="部门id" prop="deptId">
-        <el-input
-          v-model="queryParams.deptId"
-          placeholder="请输入部门id"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="设备id" prop="deviceIds">
-        <el-input
-          v-model="queryParams.deviceIds"
-          placeholder="请输入设备id"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </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>
@@ -101,10 +79,14 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
-      <el-table-column label="主键id" align="center" prop="id" />
-      <el-table-column label="巡检工单名" align="center" prop="inspectOrderTitle" />
-      <el-table-column label="巡检工单编码" align="center" prop="inspectOrderCode" />
-      <el-table-column label="巡检工单状态" align="center" prop="status" />
+      <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="remark" />
       <el-table-column
         label="创建时间"
@@ -113,25 +95,38 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="部门id" align="center" prop="deptId" />
-      <el-table-column label="设备id" align="center" prop="deviceIds" />
       <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('update', scope.row.id)"
-            v-hasPermi="['rq:iot-inspect-order:update']"
+            @click="openForm(scope.row.id)"
           >
-            编辑
+            查看
           </el-button>
           <el-button
             link
-            type="danger"
-            @click="handleDelete(scope.row.id)"
-            v-hasPermi="['rq:iot-inspect-order:delete']"
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['rq:iot-inspect-order:update']"
           >
-            删除
+            填写
           </el-button>
         </template>
       </el-table-column>
@@ -154,6 +149,8 @@ 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";
+const { push } = useRouter()
 
 /** 巡检工单 列表 */
 defineOptions({ name: 'IotInspectOrder' })
@@ -204,8 +201,8 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
+const openForm = (id?: number) => {
+  push({ name: 'InspectOrderDetail', params:{id} })
 }
 
 /** 删除按钮操作 */

+ 27 - 4
src/views/pms/inspect/plan/IotInspectPlan.vue

@@ -17,7 +17,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="单位" prop="planUnit">
-              <el-select v-model="formData.planUnit" placeholder="请选择单位">
+              <el-select v-model="formData.planUnit" placeholder="请选择单位" :disabled = "formType==='update'">
                 <el-option
                   v-for="dict in getStrDictOptions(DICT_TYPE.PMS_INSPECT_UNIT)"
                   :key="dict.label"
@@ -29,7 +29,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="周期" prop="planCycle">
-              <el-input type="number" v-model="formData.planCycle" />
+              <el-input type="number" v-model="formData.planCycle" :disabled = "formType==='update'"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -145,7 +145,7 @@ import { IotInspectRouteVO } from '@/api/pms/inspect/route'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { IotInspectPlanApi, IotInspectPlanVO } from '@/api/pms/inspect/plan'
 import RouteInspectItemDrawer from '@/views/pms/inspect/plan/RouteInspectItemDrawer.vue'
-
+import * as JobApi from '@/api/infra/job'
 /** 维修工单 表单 */
 defineOptions({ name: 'IotMaintainAe' })
 
@@ -230,7 +230,29 @@ const submitForm = async () => {
     const data = formData.value as unknown as IotInspectPlanVO
     if (formType.value === 'create') {
       formData.value.deptId = user.user.deptId
-      await IotInspectPlanApi.createIotInspectPlan(data)
+      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()
     } else {
@@ -240,6 +262,7 @@ const submitForm = async () => {
       message.success(t('common.updateSuccess'))
       close()
     }
+    //创建定时任务
     // 发送操作成功的事件
     emit('success')
   } finally {