Răsfoiți Sursa

运行记录填报

yuanchao 3 luni în urmă
părinte
comite
a9f3031c19

+ 8 - 0
src/api/pms/iotopeationfill/index.ts

@@ -24,6 +24,10 @@ export interface IotOpeationFillVO {
   fillContent:string
   pointCode:string
   pointName:string
+  orderName:string
+  orderType:string
+  orderStatus:number
+  crateTime:Date
 }
 
 // 运行记录填报 API
@@ -33,6 +37,10 @@ export const IotOpeationFillApi = {
     return await request.get({ url: `/rq/iot-opeation-fill/page`, params })
   },
 
+  getIotOpeationFillPage1: async (params: any) => {
+    return await request.get({ url: `/rq/iot-opeation-fill/page1`, params })
+  },
+
   getAttrs:async (params: any) => {
     return await request.get({ url: `/rq/iot-opeation-fill/getAttrs`, params })
   },

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

@@ -114,6 +114,28 @@ const remainingRouter: AppRouteRecordRaw[] = [
       }
     ]
   },
+  {
+    path: '/fillOrderInfo',
+    component: Layout,
+    name: 'FillOrderInfo',
+    meta: {
+      hidden: true
+    },
+    children: [
+      {
+        path: 'template/detail/:id',
+        component: () => import('@/views/pms/iotopeationfill/index1.vue'),
+        name: 'FillOrderInfo',
+        meta: {
+          title: '填写信息详情',
+          noCache: false,
+          hidden: true,
+          canTo: true,
+          activeMenu: '/template/info'
+        }
+      }
+    ]
+  },
   {
     path: '/iotpms/iotdevicepms', // 商品中心
     component: Layout,

+ 1 - 0
src/utils/dict.ts

@@ -109,6 +109,7 @@ export const getDictLabel = (dictType: string, value: any): string => {
 export enum DICT_TYPE {
   IOT_DEVICE_STATUS = 'iot_device_status', // IOT 设备状态
   PMS_INSPECT_ORDER_STATUS = "pms_inspect_order_status",
+  OPERATION_FILL_ORDER_STATUS = "operation_fill_order_status",
   PMS_INSPECT_UNIT = "pms_inspect_unit",
   PMS_MAIN_STATUS_NO = 'pms_maintain_status_no',
   PMS_MAIN_STATUS = 'pms_maintain_status',

+ 169 - 221
src/views/pms/iotopeationfill/index.vue

@@ -1,116 +1,195 @@
 <template>
-  <ContentWrap>
-    <el-tabs v-model="activeTab" type="border-card" tab-position="left" v-loading="loading" style="height: 84vh">
-      <el-tab-pane
-        style="height: 100%"
-        v-for="(item,index) in arry1"
-        :key="index"
+  <el-row :gutter="20">
+    <el-col :span="4" :xs="24">
+      <ContentWrap class="h-1/1">
+        <DeptTree @node-click="handleDeptNodeClick" />
+      </ContentWrap>
+    </el-col>
+    <el-col :span="20" :xs="24">
+    <ContentWrap>
+      <!-- 搜索工作栏 -->
+      <el-form
+        class="-mb-15px"
+        :model="queryParams"
+        ref="queryFormRef"
+        :inline="true"
+        label-width="68px"
       >
-        <template #label>
-<!--          <span  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
-          </span>-->
-          <span class="custom-label" v-if='item.isFill === 1' @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
-          </span>
-          <span v-else  @click="openFill(item.deviceCategoryId,item.deviceId,item.deptId,item.deviceName,item.deviceCode)">
-           {{item.deviceCode}} ({{ item.deviceName }})
-          </span>
-        </template>
-        <div class="form-wrapper">
-          <el-form label-width="120px">
-            <div v-for="(item,index) in attrList" :key="index">
-              <el-form-item :label='item.name' prop="deviceId">
-                <el-input
-                  v-model="item.fillContent" @input="attrList[index].fillContent = $event.target.fillContent"
-                  clearable
-                  style="width: 200px"
-                />
-              </el-form-item>
-            </div>
-            <el-form-item>
-              <el-button type="info" @click="deleteFillInfo">取消</el-button>
-              <el-button type="primary" @click="getFillInfo">确定</el-button>
-            </el-form-item>
-          </el-form>
-        </div>
-
-
-
-      </el-tab-pane>
-    </el-tabs>
-  </ContentWrap>
-
+        <el-form-item label="工单名" prop="orderName">
+          <el-input
+            v-model="queryParams.orderName"
+            placeholder="请输入工单名"
+            clearable
+            @keyup.enter="handleQuery"
+            class="!w-240px"
+          />
+        </el-form-item>
+        <el-form-item label="工单状态" prop="orderStatus">
+          <el-select
+            v-model="queryParams.orderStatus"
+            placeholder="工单状态"
+            clearable
+            class="!w-240px"
+          >
+            <el-option
+              v-for="dict in getStrDictOptions(DICT_TYPE.OPERATION_FILL_ORDER_STATUS)"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <el-date-picker
+            v-model="queryParams.createTime"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            type="daterange"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+            class="!w-220px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+          <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+<!--          <el-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="orderName" />
+        <el-table-column label="工单类型" align="center" prop="orderType" />
+        <el-table-column label="工单状态" align="center" prop="orderStatus" >
+          <template #default="scope">
+            <dict-tag :type="DICT_TYPE.OPERATION_FILL_ORDER_STATUS" :value="scope.row.orderStatus" />
+          </template>
+        </el-table-column>
+<!--        <el-table-column label="备注" align="center" 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="openWrite(scope.row.deptId)"
+              v-hasPermi="['rq:iot-opeation-fill: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>
+  <!-- 表单弹窗:添加/修改 -->
+  <IotInspectOrderForm ref="formRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
-import { dateFormatter2 } from '@/utils/formatTime'
+import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
-import { IotOpeationFillApi, IotOpeationFillVO } from '@/api/pms/iotopeationfill'
-import IotOpeationFillForm from './IotOpeationFillForm.vue'
-import Vue from "@vitejs/plugin-vue";
-/** 运行记录填报 列表 */
+import { 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 {IotOpeationFillApi, IotOpeationFillVO} from "@/api/pms/iotopeationfill";
+import {useUserStore} from "@/store/modules/user";
+const { push } = useRouter()
+
+/** 巡检工单 列表 */
 defineOptions({ name: 'IotOpeationFill' })
 
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
-/** 提交表单 */
-const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+
 const loading = ref(true) // 列表的加载中
 const list = ref<IotOpeationFillVO[]>([]) // 列表的数据
-const attrList = ref<IotOpeationFillVO[]>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
-const arry1 =ref([]);
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
-  deviceCode: undefined,
-  deviceName: undefined,
-  fillContent: undefined,
-  deviceType: undefined,
-  deviceComponent: undefined,
-  deptId: undefined,
-  orgName: undefined,
-  proId: undefined,
-  proName: undefined,
-  teamId: undefined,
-  teamName: undefined,
-  dutyName: undefined,
-  creDate: [],
+  inspectOrderTitle: undefined,
+  inspectOrderCode: undefined,
+  status: undefined,
+  remark: undefined,
   createTime: [],
-  deviceCategoryId:1
+  deptId: undefined,
+  deviceIds: undefined,
+  userId:undefined,
 })
 const queryFormRef = ref() // 搜索的表单
 const exportLoading = ref(false) // 导出的加载中
-
-
-const formatDescription = async(row, column, cellValue) =>{
-  return cellValue.split(',').map(part => `<div>${part}</div>`).join('');
+const handleDeptNodeClick = async (row) => {
+  queryParams.deptId = row.id
+  await getList()
 }
-
-
 /** 查询列表 */
 const getList = async () => {
   loading.value = true
   try {
-    const data = await IotOpeationFillApi.getIotOpeationFillPage(queryParams)
-    list.value = data;
-    list.value.forEach(function (item, index) {
-      arry1.value[index] = item;
-    });
-    queryParams.deviceCategoryId = arry1.value[0].deviceCategoryId
-    queryParams.deptId = arry1.value[0].deptId;
-    queryParams.deviceCode = arry1.value[0].deviceCode;
-    queryParams.deviceName = arry1.value[0].deviceName;
-    queryParams.deviceId = arry1.value[0].deviceId;
-    getAttrList();
+    const data = await IotOpeationFillApi.getIotOpeationFillPage1(queryParams)
+    list.value = data.list
+    total.value = data.total
   } finally {
     loading.value = false
   }
 }
 
-
-
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.pageNo = 1
@@ -125,67 +204,19 @@ const resetQuery = () => {
 
 /** 添加/修改操作 */
 const formRef = ref()
-const openForm = (type: string, id?: number) => {
-  formRef.value.open(type, id)
-}
-const openFill = (deviceCategoryId?:number,deviceId?:number,deptId?:number,deviceName?:string,deviceCode?:string) =>{
-  queryParams.deviceCategoryId = deviceCategoryId;
-  queryParams.deptId = deptId;
-  queryParams.deviceCode = deviceCode;
-  queryParams.deviceName = deviceName;
-  queryParams.deviceId = deviceId;
-  getAttrList();
-}
-
-
-const getAttrList = async () => {
-  loading.value = true
-  try {
-    const data = await IotOpeationFillApi.getAttrs(queryParams)
-    attrList.value = data;
-    attrList.value.forEach(function (item,index){
-      item.deviceCode = queryParams.deviceCode;
-      item.deptId = queryParams.deptId;
-      item.deviceId = queryParams.deviceId;
-      item.deviceCategoryId = queryParams.deviceCategoryId;
-    })
-
-  } finally {
-    loading.value = false
-  }
-}
-/** 获取填写信息保存到后台*/
-const getFillInfo = async () => {
-  try {
-    attrList.value.forEach(function (item,index){
-      item.pointName = item.name;
-    })
-    const data = attrList.value as unknown as IotOpeationFillVO
-
-    await IotOpeationFillApi.insertLog(data)
-    message.success(t('common.createSuccess'))
-    // 发送操作成功的事件
-    emit('success')
-    getList();
-  } finally {
-
-  }
+const openForm = (id?: number) => {
+  push({ name: 'InspectOrderDetail', params:{id} })
 }
-/**清空填写信息*/
-const deleteFillInfo = () =>{
-  attrList.value.forEach(function (item, index){
-    item.fillContent = '';
-  });
+const openWrite = (id?: number) => {
+  push({ name: 'FillOrderInfo',params:{id}})
 }
-
-
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {
   try {
     // 删除的二次确认
     await message.delConfirm()
     // 发起删除
-    await IotOpeationFillApi.deleteIotOpeationFill(id)
+    await IotInspectOrderApi.deleteIotInspectOrder(id)
     message.success(t('common.delSuccess'))
     // 刷新列表
     await getList()
@@ -199,8 +230,8 @@ const handleExport = async () => {
     await message.exportConfirm()
     // 发起导出
     exportLoading.value = true
-    const data = await IotOpeationFillApi.exportIotOpeationFill(queryParams)
-    download.excel(data, '运行记录填报.xls')
+    const data = await IotInspectOrderApi.exportIotInspectOrder(queryParams)
+    download.excel(data, '巡检工单.xls')
   } catch {
   } finally {
     exportLoading.value = false
@@ -210,88 +241,5 @@ const handleExport = async () => {
 /** 初始化 **/
 onMounted(() => {
   getList()
-
 })
 </script>
-<style scoped>
-.back-red{		/* 红色背景 */
-  background-color: red;
-}
-.back-blue{
-  background-color: grey;
-}
-.step-container {
-  display: grid;
-  grid-template-columns: 220px 1fr;
-  gap: 10px;
-  height: 100%;
-  min-height: 600px;
-}
-
-.steps-nav {
-  overflow-y: auto;
-  padding-right: 15px;
-}
-
-.form-wrapper {
-  background: #fff;
-  padding: 30px;
-  border-radius: 8px;
-  box-shadow: 0 2px 12px rgba(0,0,0,0.1);
-}
-
-.navigation-controls {
-  margin-top: 40px;
-  text-align: center;
-}
-
-.custom-label {
-  color: green;
-}
-::v-deep .el-step__icon {
-  background-color: #409eff;
-  color: #fff;
-  border: 0px;
-}
-.step-title-wrapper {
-  display: inline-flex;
-  align-items: center;
-  gap: 8px;
-  position: relative;
-  padding-right: 25px;
-}
-
-/* 覆盖步骤条默认样式 */
-:deep(.custom-steps) {
-
-/* 调整头部位置 */
-.el-step__head {
-  top: 3px;
-}
-
-/* 标题容器定位 */
-.el-step__title {
-  display: inline-block;
-  margin-left: 10px;
-  padding-right: 0;
-}
-
-/* 步骤连接线 */
-.el-step__line {
-  left: 11px;
-  background-color: #ebeef5;
-}
-
-/* 当前步骤样式 */
-.is-process .title-text {
-  font-weight: 600;
-  color: #409eff;
-}
-
-/* 完成状态图标 */
-.is-finish .tip-icon {
-  color: #67c23a;
-}
-
-}
-</style>

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

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

+ 8 - 1
src/views/pms/modeltemplate/ModelCategoryTree.vue

@@ -6,7 +6,7 @@
       </template>
     </el-input>
   </div>
-  <div class="head-container">
+  <div class="tree-container">
     <el-tree
       ref="treeRef"
       :data="deviceCategoryList"
@@ -122,4 +122,11 @@ onMounted(async () => {
 .custom-menu li:hover {
   background: #f5f5f5;
 }
+.tree-container {
+  overflow-y: auto;
+  min-width: 100%;
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+}
+
 </style>

+ 1 - 1
src/views/pms/modeltemplate/index.vue

@@ -230,7 +230,7 @@ const resetQuery = () => {
 
 /** 处理 设备分类树 被点击 */
 const handleModelCategoryTreeNodeClick = async (row) => {
-  queryParams.modelCategoryId = row.id
+  queryParams.deviceCategoryId = row.id
   await getList()
 }