From 6648e74a007254e167c5508de5d25402cd4bb63b Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei@zhuguifeideiMac.local>
Date: 星期一, 10 三月 2025 16:39:50 +0800
Subject: [PATCH] 完成保养工单明细

---
 eims/ruoyi-admin/src/main/resources/application-dev.yml                                                                                        |    2 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java                                                      |   22 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintStandController.java                                             |  105 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java                                          |  253 ++
 eims-ui/apps/web-antd/src/api/eims/maint-stand/index.ts                                                                                        |   61 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java                                                     |   22 
 eims-ui/apps/web-antd/src/api/eims/maint-plan/model.d.ts                                                                                       |   67 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java                                                         |  142 +
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrder.java                                                           |  109 
 eims/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml                                                                |    4 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/GenerateCodeServiceImpl.java                                            |   39 
 eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue                                                                                      |   32 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java                                                  |   77 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintStandServiceImpl.java                                          |  135 +
 eims-ui/apps/web-antd/src/views/eims/maint-stand/maint-stand-drawer.vue                                                                        |  111 +
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java                                                       |  150 +
 eims-ui/apps/web-antd/src/api/eims/maint-stand/model.d.ts                                                                                      |   53 
 eims-ui/apps/web-antd/src/views/eims/components/miant-order-modal.vue                                                                          |   49 
 eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/MaintOrderCodeTranslationImpl.java           |   30 
 eims-ui/apps/web-antd/src/views/eims/maint-stand/data.tsx                                                                                      |  111 +
 eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java                            |    5 
 eims-ui/apps/web-antd/src/views/eims/maint-orditm/index.vue                                                                                    |  159 +
 eims-ui/apps/web-antd/src/views/eims/maint-orditm/data.tsx                                                                                     |  169 +
 eims-ui/apps/web-antd/src/views/eims/components/basis-sub-table.vue                                                                            |   98 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintPlanService.java                                                   |   77 
 eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx                                                                                       |   33 
 eims-ui/apps/web-antd/src/api/eims/maint-plan/index.ts                                                                                         |   61 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintStandService.java                                                  |   68 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrditmController.java                                            |  105 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/GenerateCodeController.java                                               |   24 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderVo.java                                                      |  149 +
 eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue                                                                          |  154 +
 eims-ui/apps/web-antd/src/views/eims/maint-plan/index.vue                                                                                      |  293 ++
 eims-ui/apps/web-antd/src/api/eims/maint-orditm/model.d.ts                                                                                     |   46 
 eims-ui/apps/web-antd/src/views/eims/maint-order/data.tsx                                                                                      |  298 ++
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrditmServiceImpl.java                                         |  170 +
 eims-ui/apps/web-antd/src/constants/dict/index.ts                                                                                              |   10 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IGenerateCodeService.java                                                    |    5 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStandVo.java                                                      |   93 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintStand.java                                                           |   77 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrditmBo.java                                                     |   76 
 eims-ui/apps/web-antd/src/views/eims/maint-order/index.vue                                                                                     |  316 ++
 eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml                                                             |   20 
 eims-ui/apps/web-antd/src/views/eims/maint-order/maint-order-drawer.vue                                                                        |  201 +
 eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    1 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java                                             |  106 
 eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts                                                                                  |    5 
 eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx                                                                                       |  278 ++
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java                                                            |  106 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderBo.java                                                      |  118 +
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java                                                       |  115 +
 eims-ui/apps/web-antd/src/views/eims/maint-order/sub-orditm.vue                                                                                |  147 +
 eims/ruoyi-modules/lb-eims/pom.xml                                                                                                             |    5 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrditmService.java                                                 |   68 
 eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrditmMapper.xml                                                            |    7 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrditmVo.java                                                     |  100 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintStandBo.java                                                      |   78 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrditmMapper.java                                                    |   15 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java                                           |  235 ++
 eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintStandMapper.xml                                                             |    7 
 eims-ui/apps/web-antd/src/views/eims/maint-stand/index.vue                                                                                     |  159 +
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintPlanController.java                                              |  106 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintStandMapper.java                                                     |   15 
 eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java                                          |   62 
 eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts                                                                                        |   61 
 eims-ui/apps/web-antd/src/api/eims/maint-orditm/index.ts                                                                                       |   61 
 eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java                                                 |    7 
 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrditm.java                                                          |   73 
 eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts                                                                                      |   89 
 eims-ui/apps/web-antd/src/views/eims/maint-orditm/maint-orditm-drawer.vue                                                                      |  175 +
 eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/MaintOrderService.java                                       |   11 
 eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx                                                                                       |   53 
 eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml                                                              |   19 
 73 files changed, 6,486 insertions(+), 77 deletions(-)

diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
new file mode 100644
index 0000000..e30c0ac
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order/index.ts
@@ -0,0 +1,61 @@
+import type { MaintOrderVO } from './model';
+
+import type { ID, IDS } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+  maintOrderExport = '/eims/maintOrder/export',
+  maintOrderList = '/eims/maintOrder/list',
+  root = '/eims/maintOrder'
+}
+
+/**
+ * 鏌ヨ淇濆吇宸ュ崟鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listMaintOrder(params?: any) {
+  return requestClient.get<MaintOrderVO[]>(Api.maintOrderList, { params });
+}
+
+/**
+ * 鏌ヨ淇濆吇宸ュ崟璇︾粏
+ * @param maintOrderId
+ */
+export function getMaintOrder(maintOrderId: ID) {
+  return requestClient.get<MaintOrderVO>(`${Api.root}/${maintOrderId}`);
+}
+
+/**
+ * 鏂板淇濆吇宸ュ崟
+ * @param data
+ */
+export function addMaintOrder(data: any) {
+  return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼淇濆吇宸ュ崟
+ * @param data
+ */
+export function updateMaintOrder(data: any) {
+  return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎淇濆吇宸ュ崟
+ * @param maintOrderId
+ */
+export function delMaintOrder(maintOrderId: IDS) {
+  return requestClient.deleteWithMsg<void>(`${Api.root}/${maintOrderId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function maintOrderExport(data: any) {
+  return commonExport(Api.maintOrderExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
new file mode 100644
index 0000000..996513f
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-order/model.d.ts
@@ -0,0 +1,89 @@
+export interface MaintOrderVO {
+  /**
+   *
+   */
+  id: number | string;
+
+  /**
+   *
+   */
+  equId: number | string;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�-淇濆吇绫诲瀷锛堝瓧鍏革級
+   */
+  maintType: string;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡
+   */
+  maintCycle: number;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+   */
+  maintCycleUnit: string;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�- 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+   */
+  maintRule: string;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�-淇濆吇浜�
+   */
+  maintUser: number;
+  maintUserName: string;
+
+  /**
+   * 璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬
+   */
+  maintDept: number;
+
+  /**
+   * 淇濆吇鍗曞彿
+   */
+  maintCode: string;
+
+  /**
+   *
+   */
+  status: string;
+
+  verifyUser: number;
+  /**
+   * 楠岃瘉浜�
+   */
+  verifyUserName: string;
+
+  /**
+   * 淇濆吇璁″垝鏃堕棿
+   */
+  planTime: string;
+
+  /**
+   * 淇濆吇寮�濮嬫椂闂�
+   */
+  startTime: string;
+
+  /**
+   * 淇濆吇缁撴潫鏃堕棿
+   */
+  endTime: string;
+
+  /**
+   * 璁″垝id
+   */
+  planId: number | string;
+
+  /**
+   * 鍒涘缓鏃堕棿
+   */
+  createTime: string;
+
+  /**
+   * 澶囨敞
+   */
+  remark: string;
+
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-orditm/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-orditm/index.ts
new file mode 100644
index 0000000..8807a5a
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-orditm/index.ts
@@ -0,0 +1,61 @@
+import type { MaintOrditmVO } from './model';
+
+import type { ID, IDS, PageResult } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+  maintOrditmExport = '/eims/maintOrditm/export',
+  maintOrditmList = '/eims/maintOrditm/list',
+  root = '/eims/maintOrditm'
+}
+
+/**
+ * 鏌ヨ宸ュ崟鏉$洰鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listMaintOrditm(params?: any) {
+  return requestClient.get<PageResult<MaintOrditmVO>>(Api.maintOrditmList, { params });
+}
+
+/**
+ * 鏌ヨ宸ュ崟鏉$洰璇︾粏
+ * @param maintOrditmId
+ */
+export function getMaintOrditm(maintOrditmId: ID) {
+  return requestClient.get<MaintOrditmVO>(`${Api.root}/${maintOrditmId}`);
+}
+
+/**
+ * 鏂板宸ュ崟鏉$洰
+ * @param data
+ */
+export function addMaintOrditm(data: any) {
+  return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼宸ュ崟鏉$洰
+ * @param data
+ */
+export function updateMaintOrditm(data: any) {
+  return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎宸ュ崟鏉$洰
+ * @param maintOrditmId
+ */
+export function delMaintOrditm(maintOrditmId: IDS) {
+  return requestClient.deleteWithMsg<void>(`${Api.root}/${maintOrditmId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function maintOrditmExport(data: any) {
+  return commonExport(Api.maintOrditmExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-orditm/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-orditm/model.d.ts
new file mode 100644
index 0000000..0e39a49
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-orditm/model.d.ts
@@ -0,0 +1,46 @@
+export interface MaintOrditmVO {
+  /**
+   *
+   */
+  id: number | string;
+
+  /**
+   * 宸ュ崟id
+   */
+  orderId: number | string;
+
+  /**
+   * 璁惧id
+   */
+  equId: number | string;
+
+  /**
+   * 淇濆吇椤圭洰鍚嶇О
+   */
+  itmName: string;
+
+  /**
+   * 淇濆吇椤圭洰鎿嶄綔鏍囧噯
+   */
+  itmAction: string;
+
+  /**
+   * 淇濆吇鎿嶄綔鐢ㄦ埛
+   */
+  itmUser: number;
+
+  /**
+   * 淇濆吇鏃堕棿
+   */
+  itmTime: string;
+
+  /**
+   * 瀹屾垚鐘舵�侊紙瀛楀吀锛�
+   */
+  status: string;
+
+  /**
+   * 澶囨敞
+   */
+  remark: string;
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-plan/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-plan/index.ts
new file mode 100644
index 0000000..bba8da4
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-plan/index.ts
@@ -0,0 +1,61 @@
+import type { MaintPlanVO } from './model';
+
+import type { ID, IDS } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+  maintPlanExport = '/eims/maintPlan/export',
+  maintPlanList = '/eims/maintPlan/list',
+  root = '/eims/maintPlan'
+}
+
+/**
+ * 鏌ヨ淇濆吇璁″垝鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listMaintPlan(params?: any) {
+  return requestClient.get<MaintPlanVO[]>(Api.maintPlanList, { params });
+}
+
+/**
+ * 鏌ヨ淇濆吇璁″垝璇︾粏
+ * @param maintPlanId
+ */
+export function getMaintPlan(maintPlanId: ID) {
+  return requestClient.get<MaintPlanVO>(`${Api.root}/${maintPlanId}`);
+}
+
+/**
+ * 鏂板淇濆吇璁″垝
+ * @param data
+ */
+export function addMaintPlan(data: any) {
+  return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼淇濆吇璁″垝
+ * @param data
+ */
+export function updateMaintPlan(data: any) {
+  return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎淇濆吇璁″垝
+ * @param maintPlanId
+ */
+export function delMaintPlan(maintPlanId: IDS) {
+  return requestClient.deleteWithMsg<void>(`${Api.root}/${maintPlanId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function maintPlanExport(data: any) {
+  return commonExport(Api.maintPlanExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-plan/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-plan/model.d.ts
new file mode 100644
index 0000000..09f143c
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-plan/model.d.ts
@@ -0,0 +1,67 @@
+export interface MaintPlanVO {
+  /**
+   *
+   */
+  id: number | string;
+
+  /**
+   * 璁惧id
+
+   */
+  equId: number | string;
+
+  /**
+   * 淇濆吇绫诲瀷锛堝瓧鍏革級
+   */
+  maintType: string;
+
+  /**
+   * 淇濆吇鍛ㄦ湡
+   */
+  maintCycle: number;
+
+  /**
+   * 淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+   */
+  maintCycleUnit: string;
+
+  /**
+   * 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+   */
+  maintRule: string;
+
+  /**
+   * 淇濆吇浜�
+   */
+  maintUser: number;
+
+  /**
+   * 淇濆吇閮ㄩ棬
+   */
+  maintDept: number;
+
+  /**
+   * 鐘舵�侊紙瀛楀吀锛� 0-鍚敤  1-绂佺敤
+   */
+  status: string;
+
+  /**
+   * 涓婃鎵ц鏃堕棿
+   */
+  maintFirstTime: string;
+
+  /**
+   * 涓婃鎵ц鏃堕棿
+   */
+  maintLastTime: string;
+
+  /**
+   * 涓嬫鎵ц鏃堕棿
+   */
+  maintNextTime: string;
+
+  /**
+   * 澶囨敞
+   */
+  remark: string;
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-stand/index.ts b/eims-ui/apps/web-antd/src/api/eims/maint-stand/index.ts
new file mode 100644
index 0000000..0822d12
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-stand/index.ts
@@ -0,0 +1,61 @@
+import type { MaintStandVO } from './model';
+
+import type { ID, IDS, PageResult } from '#/api/common';
+
+import { commonExport } from '#/api/helper';
+import { requestClient } from '#/api/request';
+
+enum Api {
+  maintStandExport = '/eims/maintStand/export',
+  maintStandList = '/eims/maintStand/list',
+  root = '/eims/maintStand'
+}
+
+/**
+ * 鏌ヨ淇濆吇鏍囧噯鍒楄〃
+ * @param query
+ * @returns {*}
+ */
+
+export function listMaintStand(params?: any) {
+  return requestClient.get<PageResult<MaintStandVO>>(Api.maintStandList, { params });
+}
+
+/**
+ * 鏌ヨ淇濆吇鏍囧噯璇︾粏
+ * @param maintStandId
+ */
+export function getMaintStand(maintStandId: ID) {
+  return requestClient.get<MaintStandVO>(`${Api.root}/${maintStandId}`);
+}
+
+/**
+ * 鏂板淇濆吇鏍囧噯
+ * @param data
+ */
+export function addMaintStand(data: any) {
+  return requestClient.postWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 淇敼淇濆吇鏍囧噯
+ * @param data
+ */
+export function updateMaintStand(data: any) {
+  return requestClient.putWithMsg<void>(Api.root, data);
+}
+
+/**
+ * 鍒犻櫎淇濆吇鏍囧噯
+ * @param maintStandId
+ */
+export function delMaintStand(maintStandId: IDS) {
+  return requestClient.deleteWithMsg<void>(`${Api.root}/${maintStandId}`);
+}
+/**
+ * 瀵煎嚭
+ * @param
+ */
+export function maintStandExport(data: any) {
+  return commonExport(Api.maintStandExport, data);
+}
diff --git a/eims-ui/apps/web-antd/src/api/eims/maint-stand/model.d.ts b/eims-ui/apps/web-antd/src/api/eims/maint-stand/model.d.ts
new file mode 100644
index 0000000..8dd1ba4
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/api/eims/maint-stand/model.d.ts
@@ -0,0 +1,53 @@
+export interface MaintStandVO {
+  /**
+   *
+   */
+  id: string | number;
+
+  /**
+   * 璁惧id
+   */
+  equId: string | number;
+
+  /**
+   * 璁惧缂栫爜
+   */
+  equCode: string;
+
+  /**
+   * 璁惧绫诲瀷
+   */
+  equTypeId: string | number;
+
+  /**
+   * 璧勪骇缂栧彿
+   */
+  assetNo: string;
+
+  /**
+   * 璁惧鍚嶇О
+
+   */
+  equName: string;
+
+  /**
+   * 璁惧鍨嬪彿
+   */
+  modelNo: string;
+
+  /**
+   * 淇濆吇椤圭洰鍚嶇О
+   */
+  name: string;
+
+  /**
+   * 淇濆吇椤圭洰鏍囧噯
+   */
+  stand: string;
+
+  /**
+   * 澶囨敞
+   */
+  remark: string;
+
+}
diff --git a/eims-ui/apps/web-antd/src/constants/dict/index.ts b/eims-ui/apps/web-antd/src/constants/dict/index.ts
index 7fe5f13..b86cfa4 100644
--- a/eims-ui/apps/web-antd/src/constants/dict/index.ts
+++ b/eims-ui/apps/web-antd/src/constants/dict/index.ts
@@ -39,3 +39,13 @@
   WEIXIU = '2', // 缁翠慨涓�
   YIJIEDAN = '1' // 宸叉帴鍗�
 }
+
+/**
+ * 淇濆吇宸ュ崟鐘舵��
+ */
+export enum MAINT_ORDER_STATUS {
+  BAOYANG = '1', // 淇濆吇缁�
+  DAIBAOYANG = '0', // 寰呬繚鍏�
+  DAIYANZHENG = '2', // 寰呴獙璇�
+  WANCHENG = '3' // 瀹屾垚
+}
diff --git a/eims-ui/apps/web-antd/src/views/eims/components/basis-sub-table.vue b/eims-ui/apps/web-antd/src/views/eims/components/basis-sub-table.vue
new file mode 100644
index 0000000..b7e37a0
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/components/basis-sub-table.vue
@@ -0,0 +1,98 @@
+<script setup lang="ts">
+import { ref, watch } from 'vue';
+
+import { Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+
+interface Props {
+  reqKey: string;
+  reqValue: any;
+  title?: string;
+  listApi: (params: any) => Promise<any>; // 鍔ㄦ�丄PI鍑芥暟
+  columns?: VxeGridProps['columns'];
+}
+const props = defineProps<Props>();
+const columns = props?.columns?.filter((i) => i.field !== 'action');
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        const keyName = props.reqKey;
+        const keyValue = props.reqValue;
+        if (keyName && keyValue) {
+          const params = { [keyName]: props.reqValue };
+          Object.assign(formValues, params);
+        } else {
+          // 鏈紶鍙傚垯鏌ヨ涓�涓笉瀛樺湪鐨勫��
+          const params = { [keyName]: -1 };
+          Object.assign(formValues, params);
+        }
+        return await props.listApi({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: `basis-sub-table${props.reqValue}`
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+  }
+});
+
+// 浣跨敤 watch 鐩戝惉 id 鐨勫彉鍖�
+watch(
+  () => props.reqValue,
+  (newVal, oldVal) => {
+    if (newVal !== oldVal && newVal) {
+      tableApi.query();
+    }
+  },
+  { immediate: false }
+);
+/**
+ * TODO 鍚庣画鎵╁睍鐐瑰嚮浜嬩欢
+ */
+const slotName = ref<string>('equName');
+</script>
+
+<template>
+  <div class="w-full">
+    <BasicTable :table-title="title">
+      <template #[slotName]="{ row }">
+        <Space>
+          <span>{{ row[slotName] }}</span>
+        </Space>
+      </template>
+    </BasicTable>
+  </div>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/components/miant-order-modal.vue b/eims-ui/apps/web-antd/src/views/eims/components/miant-order-modal.vue
new file mode 100644
index 0000000..a549111
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/components/miant-order-modal.vue
@@ -0,0 +1,49 @@
+<script setup lang="ts">
+import { ref } from 'vue';
+
+import { useVbenModal } from '@vben/common-ui';
+
+import { message } from 'ant-design-vue';
+
+import MaintOrderView from '#/views/eims/maint-order/index.vue';
+
+const emit = defineEmits<{ updateSelect: [any] }>();
+
+const [BasicModal, modalApi] = useVbenModal({
+  fullscreenButton: false,
+  draggable: true,
+  onCancel: handleCancel,
+  onConfirm: handleConfirm
+});
+const innerView = ref();
+
+async function handleConfirm() {
+  try {
+    modalApi.modalLoading(true);
+    const tableSelect = innerView.value.tableSelect();
+    if (tableSelect.length > 1) {
+      message.error('鏈�澶氬彧鑳介�夋嫨涓�鏉℃暟鎹紒');
+      modalApi.modalLoading(false);
+      return false;
+    }
+    emit('updateSelect', tableSelect[0]);
+    await handleCancel();
+  } catch (error) {
+    console.error(error);
+  } finally {
+    modalApi.modalLoading(false);
+  }
+}
+
+async function handleCancel() {
+  modalApi.close();
+}
+</script>
+
+<template>
+  <BasicModal :fullscreen-button="true" class="w-[800px]">
+    <MaintOrderView ref="innerView" />
+  </BasicModal>
+</template>
+
+<style scoped></style>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-order/data.tsx
new file mode 100644
index 0000000..8c28042
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order/data.tsx
@@ -0,0 +1,298 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
+
+export const querySchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintCode',
+    label: '淇濆吇宸ュ崟'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.EIMS_MAINT_TYPE)
+    },
+    fieldName: 'maintType',
+    label: '淇濆吇绫诲瀷'
+  },
+  {
+    component: 'TreeSelect',
+    // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+    defaultValue: undefined,
+    fieldName: 'maintDept',
+    label: '淇濆吇閮ㄩ棬'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      allowClear: true,
+      showSearch: true,
+      getPopupContainer
+    },
+    fieldName: 'maintUser',
+    label: '淇濆吇浜�'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.MAINT_TIME_RULE)
+    },
+    fieldName: 'maintRule',
+    label: '璁$畻瑙勫垯'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.MAINT_ORDER_STATUS)
+    },
+    fieldName: 'status',
+    label: '鐘舵��'
+  }
+];
+
+export const columns: VxeGridProps['columns'] = [
+  { type: 'checkbox', width: 60, fixed: 'left' },
+  {
+    title: '淇濆吇宸ュ崟',
+    field: 'maintCode',
+    minWidth: 200,
+    fixed: 'left'
+  },
+
+  {
+    title: '鐘舵��',
+    field: 'status',
+    minWidth: 80,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.status, DictEnum.MAINT_ORDER_STATUS);
+      }
+    }
+  },
+  {
+    title: '璁惧鍚嶇О',
+    field: 'equName',
+    minWidth: 200,
+    fixed: 'left'
+  },
+  {
+    title: '璧勪骇缂栧彿',
+    field: 'assetNo',
+    minWidth: 160
+  },
+  {
+    title: '淇濆吇绫诲瀷',
+    field: 'maintType',
+    minWidth: 120,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.maintType, DictEnum.EIMS_MAINT_TYPE);
+      }
+    }
+  },
+  {
+    title: '淇濆吇浜�',
+    field: 'maintUserName',
+    minWidth: 100
+  },
+  {
+    title: '璁″垝淇濆吇鏃堕棿',
+    field: 'planTime',
+    minWidth: 160
+  },
+  {
+    title: '淇濆吇寮�濮嬫椂闂�',
+    field: 'startTime',
+    minWidth: 160
+  },
+  {
+    title: '淇濆吇缁撴潫鏃堕棿',
+    field: 'endTime',
+    minWidth: 160
+  },
+  {
+    title: '楠岃瘉浜�',
+    field: 'verifyUserName',
+    minWidth: 160
+  },
+  {
+    title: '鍒涘缓鏃堕棿',
+    field: 'createTime',
+    minWidth: 200
+  },
+  {
+    field: 'action',
+    fixed: 'right',
+    slots: { default: 'action' },
+    title: '鎿嶄綔',
+    width: 200
+  }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    },
+    fieldName: 'id'
+  },
+  {
+    component: 'Input',
+    fieldName: 'equId',
+    label: '璁惧id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintCode',
+    label: '淇濆吇鍗曞彿'
+  },
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'RadioGroup',
+    componentProps: {
+      buttonStyle: 'solid',
+      options: getDictOptions(DictEnum.EIMS_MAINT_TYPE),
+      optionType: 'button'
+    },
+    fieldName: 'maintType',
+    defaultValue: '1',
+    label: '淇濆吇绫诲瀷'
+  },
+  /*
+  {
+    component: 'InputNumber',
+    fieldName: 'maintCycle',
+    label: '淇濆吇鍛ㄦ湡',
+    formItemClass: 'col-span-1',
+    componentProps: {
+      min: 1
+    }
+  },
+ {
+    component: 'Select',
+    componentProps: {
+      getPopupContainer,
+      options: getDictOptions(DictEnum.MAINT_CYCLE_UNIT)
+    },
+    fieldName: 'maintCycleUnit',
+    formItemClass: 'col-span-1 w-[80px]',
+    labelWidth: 0,
+    label: ''
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      getPopupContainer,
+      options: getDictOptions(DictEnum.MAINT_TIME_RULE)
+    },
+    fieldName: 'maintRule',
+    label: '淇濆吇瑙勫垯 '
+  },*/
+  {
+    component: 'Input',
+    fieldName: 'maintUser',
+    label: '淇濆吇浜篿d',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintUserName',
+    label: '淇濆吇浜�'
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintDept',
+    label: '閮ㄩ棬id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'RadioGroup',
+    componentProps: {
+      buttonStyle: 'solid',
+      options: getDictOptions(DictEnum.MAINT_ORDER_STATUS),
+      optionType: 'button'
+    },
+    fieldName: 'status',
+    defaultValue: '0',
+    label: '鐘舵��'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD',
+      showTime: false,
+      valueFormat: 'YYYY-MM-DD',
+      getPopupContainer
+    },
+    fieldName: 'planTime',
+    label: '璁″垝淇濆吇鏃ユ湡'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD HH:mm:ss',
+      showTime: true,
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      getPopupContainer
+    },
+    fieldName: 'startTime',
+    label: '寮�濮嬫椂闂�'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD HH:mm:ss',
+      showTime: true,
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      getPopupContainer
+    },
+    fieldName: 'endTime',
+    label: '缁撴潫鏃堕棿'
+  },
+  {
+    component: 'Input',
+    fieldName: 'verifyUser',
+    label: '楠岃瘉浜篿d',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'verifyUserName',
+    label: '楠岃瘉浜�'
+  },
+  {
+    component: 'Textarea',
+    fieldName: 'remark',
+    label: '澶囨敞'
+  }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order/index.vue b/eims-ui/apps/web-antd/src/views/eims/maint-order/index.vue
new file mode 100644
index 0000000..f5e3edc
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order/index.vue
@@ -0,0 +1,316 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { computed, onMounted, ref } from 'vue';
+
+import { useAccess } from '@vben/access';
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { useUserStore } from '@vben/stores';
+import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
+
+import { Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delMaintOrder, listMaintOrder, maintOrderExport } from '#/api/eims/maint-order';
+import { getDeptTree, userList } from '#/api/system/user';
+import { MAINT_ORDER_STATUS } from '#/constants/dict';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import maintOrderDrawer from './maint-order-drawer.vue';
+import SubOrditm from './sub-orditm.vue';
+
+defineExpose({
+  tableSelect
+});
+
+const formOptions: VbenFormProps = {
+  commonConfig: {
+    labelWidth: 80,
+    componentProps: {
+      allowClear: true
+    }
+  },
+  collapsed: true,
+  schema: querySchema(),
+  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
+};
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        return await listMaintOrder({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'maint-order-index'
+};
+const orderId = ref<string>();
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  formOptions,
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
+    cellClick: (e: any) => {
+      const { row } = e;
+      orderId.value = row.id;
+    }
+  }
+});
+
+const [MaintOrderDrawer, maintOrderDrawerApi] = useVbenDrawer({
+  connectedComponent: maintOrderDrawer
+});
+
+function handleAdd() {
+  maintOrderDrawerApi.setData({});
+  maintOrderDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  maintOrderDrawerApi.setData({ id: record.id });
+  maintOrderDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+  await delMaintOrder(row.id);
+  await tableApi.query();
+}
+
+function handleMultiDelete() {
+  const rows = tableApi.grid.getCheckboxRecords();
+  const ids = rows.map((row: any) => row.id);
+  Modal.confirm({
+    title: '鎻愮ず',
+    okType: 'danger',
+    content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+    onOk: async () => {
+      await delMaintOrder(ids);
+      await tableApi.query();
+    }
+  });
+}
+
+function handleDownloadExcel() {
+  commonDownloadExcel(maintOrderExport, '淇濆吇宸ュ崟璁板綍', tableApi.formApi.form.values, {
+    fieldMappingTime: formOptions.fieldMappingTime
+  });
+}
+
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+async function setupDeptSelect() {
+  // updateSchema
+  const deptTree = await getDeptTree();
+  // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊� 鍗崇埗鑺傜偣 / 瀛愯妭鐐�
+  addFullName(deptTree, 'label', ' / ');
+  tableApi.formApi.updateSchema([
+    {
+      componentProps: (formModel) => ({
+        class: 'w-full',
+        fieldNames: {
+          key: 'id',
+          value: 'id',
+          children: 'children'
+        },
+        getPopupContainer,
+        async onSelect(deptId: number | string) {
+          /** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
+          await setupUserOptions(deptId);
+          /** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
+          formModel.maintUser = undefined;
+        },
+        placeholder: '璇烽�夋嫨',
+        showSearch: true,
+        treeData: deptTree,
+        treeDefaultExpandAll: true,
+        treeLine: { showLeafIcon: false },
+        // 绛涢�夌殑瀛楁
+        treeNodeFilterProp: 'label',
+        // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+        treeNodeLabelProp: 'fullName'
+      }),
+      fieldName: 'maintDept'
+    }
+  ]);
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+async function setupUserOptions(deptId: any) {
+  const params = { deptId };
+  const userPageResult = await userList({
+    pageNum: 1,
+    pageSize: 500,
+    ...params
+  });
+  const options = userPageResult.rows.map((item) => ({
+    label: item.nickName || item.userName,
+    value: item.userId
+  }));
+  // 绛涢��
+  const filterOption = (input: string, option: any) => {
+    return option.label.toLowerCase().includes(input.toLowerCase());
+  };
+
+  const placeholder = options.length > 0 ? '璇烽�夋嫨' : '璇ラ儴闂ㄤ笅鏆傛棤鐢ㄦ埛';
+  tableApi.formApi.updateSchema([
+    {
+      componentProps: { options, placeholder, filterOption },
+      fieldName: 'maintUser'
+    }
+  ]);
+}
+
+
+
+onMounted(async () => {
+  await setupDeptSelect();
+});
+
+async function handleEditStatus(record: Recordable<any>, status: string) {
+  maintOrderDrawerApi.setData({ id: record.id, status });
+  maintOrderDrawerApi.open();
+}
+
+const userStore = useUserStore();
+const userId = userStore.userInfo?.userId;
+const deptId = userStore.userInfo?.deptId;
+const { hasAccessByRoles } = useAccess();
+const isSuperAdmin = computed(() => hasAccessByRoles(['superadmin']));
+const isLeader = computed(() => hasAccessByRoles(['leader']));
+
+/**
+ * 寰呬繚鍏荤姸鎬�-淇濆吇浜烘搷浣�
+ * @param row
+ */
+function daibaoyang(row: any) {
+  return (isSuperAdmin.value || isLeader.value || row.maintUser === userId) && row.status === MAINT_ORDER_STATUS.DAIBAOYANG;
+}
+
+/**
+ * 淇濆吇鐘舵��-淇濆吇浜烘搷浣�
+ * @param row
+ */
+function baoyang(row: any) {
+  return (isSuperAdmin.value || isLeader.value || row.maintUser === userId) && row.status === MAINT_ORDER_STATUS.BAOYANG;
+}
+
+/**
+ * 寰呴獙璇佺姸鎬�-楠岃瘉浜烘搷浣�
+ * @param row
+ */
+function yanzheng(row: any) {
+  return (isSuperAdmin.value || isLeader.value || row.verifyUser === userId) && row.status === MAINT_ORDER_STATUS.DAIYANZHENG;
+}
+
+// 閫変腑鏁版嵁
+function tableSelect() {
+  return tableApi.grid.getCheckboxRecords();
+}
+</script>
+
+<template>
+  <Page :auto-content-height="true">
+    <div class="flex h-full gap-[8px] flex-col">
+      <BasicTable class="h-2/3" table-title="淇濆吇宸ュ崟鍒楄〃">
+        <template #toolbar-tools>
+          <Space>
+            <a-button v-access:code="['eims:maintOrder:export']" @click="handleDownloadExcel">
+              {{ $t('pages.common.export') }}
+            </a-button>
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi)"
+              danger
+              type="primary"
+              v-access:code="['eims:maintOrder:remove']"
+              @click="handleMultiDelete"
+            >
+              {{ $t('pages.common.delete') }}
+            </a-button>
+            <a-button type="primary" v-access:code="['eims:maintOrder:add']" @click="handleAdd">
+              {{ $t('pages.common.add') }}
+            </a-button>
+          </Space>
+        </template>
+
+        <template #equName="{ row }">
+          <Space>
+            <span>{{ row.equName }}</span>
+          </Space>
+        </template>
+
+        <template #action="{ row }">
+          <Space>
+            <ghost-button
+              v-if="daibaoyang(row)"
+              class="btn-success"
+              v-access:code="['eims:maintOrder:edit']"
+              @click.stop="handleEditStatus(row, MAINT_ORDER_STATUS.BAOYANG)"
+            >
+              淇濆吇
+            </ghost-button>
+            <ghost-button
+              v-if="baoyang(row)"
+              class="btn-success"
+              v-access:code="['eims:maintOrder:edit']"
+              @click.stop="handleEditStatus(row, MAINT_ORDER_STATUS.DAIYANZHENG)"
+            >
+              瀹屾垚
+            </ghost-button>
+            <ghost-button
+              v-if="yanzheng(row)"
+              class="btn-success"
+              v-access:code="['eims:maintOrder:edit']"
+              @click.stop="handleEditStatus(row, MAINT_ORDER_STATUS.WANCHENG)"
+            >
+              楠岃瘉
+            </ghost-button>
+            <ghost-button v-access:code="['eims:maintOrder:edit']" @click.stop="handleEdit(row)">
+              {{ $t('pages.common.edit') }}
+            </ghost-button>
+            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�"
+                        @confirm="handleDelete(row)">
+              <ghost-button danger v-access:code="['eims:maintOrder:remove']" @click.stop="">
+                {{ $t('pages.common.delete') }}
+              </ghost-button>
+            </Popconfirm>
+          </Space>
+        </template>
+      </BasicTable>
+      <!--<BasisSubTable :columns="maintStandCol" :list-api="listMaintStand" :req-value="equId" class="h-1/3" req-key="equId" title="淇濆吇瀹炴柦椤圭洰" />-->
+      <SubOrditm :order-id="orderId" class="h-1/3" />
+    </div>
+    <MaintOrderDrawer @reload="tableApi.query()" />
+  </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order/maint-order-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-order/maint-order-drawer.vue
new file mode 100644
index 0000000..992a2e3
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order/maint-order-drawer.vue
@@ -0,0 +1,201 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { cloneDeep } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { addMaintOrder, getMaintOrder, updateMaintOrder } from '#/api/eims/maint-order';
+import CodeInput from '#/views/eims/components/code-input.vue';
+import equModal from '#/views/eims/components/equ-modal.vue';
+import userModal from '#/views/eims/components/user-modal.vue';
+
+import { drawerSchema } from './data';
+
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+  return isUpdate.value ? '缂栬緫淇濆吇宸ュ崟' : '鏂板淇濆吇宸ュ崟';
+});
+
+const [BasicForm, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    componentProps: {
+      class: 'w-full'
+    },
+    labelWidth: 120
+  },
+  schema: drawerSchema(),
+  showDefaultActions: false,
+  wrapperClass: 'grid-cols-2'
+});
+
+const [BasicDrawer, drawerApi] = useVbenDrawer({
+  onCancel: handleCancel,
+  onConfirm: handleConfirm,
+  async onOpenChange(isOpen) {
+    if (!isOpen) {
+      return null;
+    }
+    drawerApi.drawerLoading(true);
+    const { id } = drawerApi.getData() as { id?: number | string };
+    const { status } = drawerApi.getData() as { status?: string };
+    // 浠庝繚鍏昏鍒掗〉闈㈢敓鎴愪繚鍏诲伐鍗�
+    const { planOrder } = drawerApi.getData();
+    isUpdate.value = !!id;
+    // 鏂板-浠庝繚鍏昏鍒掗〉闈㈢敓鎴愪繚鍏诲伐鍗�
+    if (!isUpdate.value && !id) {
+      await formApi.setValues(planOrder);
+    }
+    // 閲嶇疆
+    baoyangCol(false);
+
+    // 鏇存柊 && 璧嬪��
+    if (isUpdate.value && id) {
+      const record = await getMaintOrder(id);
+      /**
+       * 鏇存柊鐘舵��
+       */
+      if (status) {
+        record.status = status;
+        baoyangCol(true);
+        // TODO 绮剧粏鍖栨帶鍒惰緭鍏�
+        /* switch (status) {
+          case MAINT_ORDER_STATUS.BAOYANG: {
+
+            break;
+          }
+          case MAINT_ORDER_STATUS.DAIYANZHENG: {
+            break;
+          }
+        }*/
+      }
+      await formApi.setValues(record);
+    }
+
+    drawerApi.drawerLoading(false);
+  }
+});
+
+
+async function handleConfirm() {
+  try {
+    drawerApi.drawerLoading(true);
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    const data = cloneDeep(await formApi.getValues());
+    await (isUpdate.value ? updateMaintOrder(data) : addMaintOrder(data));
+    emit('reload');
+    await handleCancel();
+  } catch (error) {
+    console.error(error);
+  } finally {
+    drawerApi.drawerLoading(false);
+  }
+}
+
+function baoyangCol(disable: boolean) {
+  const show = disable;
+  formApi.updateSchema([
+    {
+      componentProps: {
+        disabled: show
+      },
+      fieldName: 'maintType'
+    },
+    {
+      componentProps: {
+        disabled: show
+      },
+      fieldName: 'planTime'
+    },
+    {
+      componentProps: {
+        disabled: show
+      },
+      fieldName: 'status'
+    }
+  ]);
+}
+
+async function handleCancel() {
+  drawerApi.close();
+  await formApi.resetForm();
+}
+
+// equ modal
+const [EquModal, equModalApi] = useVbenModal({
+  connectedComponent: equModal,
+  draggable: true,
+  title: '閫夋嫨璁惧'
+});
+
+function handleEquModal() {
+  equModalApi.setData({});
+  equModalApi.open();
+}
+
+// user modal
+const [UserModal, userModalApi] = useVbenModal({
+  connectedComponent: userModal,
+  draggable: true,
+  title: '閫夋嫨淇濆吇浜�'
+});
+
+const userType = ref<number | undefined>(undefined);
+
+function handleUserModal(type: number) {
+  userType.value = type;
+  userModalApi.setData({});
+  userModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勮澶�
+ * @param equ
+ */
+async function updateEqu(equ: any) {
+  await formApi.setValues({equId:equ.equId,equName:equ.equName});
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勭敤鎴�
+ * @param user
+ */
+async function updateUser(user: any) {
+  if (userType.value === 1) {
+    await formApi.setValues({ 'maintUserName': user.nickName, 'maintUser': user.userId, 'maintDept': user.deptId });
+  } else if (userType.value === 2) {
+    await formApi.setValues({ 'verifyUserName': user.nickName, 'verifyUser': user.userId, 'verifyDept': user.deptId });
+  }
+}
+</script>
+
+<template>
+  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+    <BasicForm>
+      <template #equName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleEquModal" v-bind="slotProps"
+                     :disabled="isUpdate" />
+      </template>
+      <template #maintUserName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal(1)" v-bind="slotProps" />
+      </template>
+      <template #verifyUserName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal(2)" v-bind="slotProps" />
+      </template>
+      <template #maintCode="slotProps">
+        <CodeInput v-bind="slotProps" :disabled="isUpdate" prefix="BYSD" />
+      </template>
+    </BasicForm>
+    <EquModal class="w-[1200px]" @update-equ="updateEqu" />
+    <UserModal class="w-[1200px]" @select-user="updateUser" />
+  </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-order/sub-orditm.vue b/eims-ui/apps/web-antd/src/views/eims/maint-order/sub-orditm.vue
new file mode 100644
index 0000000..98bf28c
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-order/sub-orditm.vue
@@ -0,0 +1,147 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { nextTick, ref, watch } from 'vue';
+
+import { useVbenDrawer } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { getVxePopupContainer } from '@vben/utils';
+
+import { Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { listMaintOrditm } from '#/api/eims/maint-orditm';
+import { columns } from '#/views/eims/maint-orditm/data';
+import maintOrditmDrawer from '#/views/eims/maint-orditm/maint-orditm-drawer.vue';
+
+interface Props {
+  orderId?: string;
+}
+
+const props = defineProps<Props>();
+
+const completed = ref<string>('宸插畬鎴�');
+// 鏈洏鐐�
+const uncompleted = ref<string>('鏈畬鎴�');
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        if (props.orderId) {
+          const params = { orderId: props.orderId };
+          Object.assign(formValues, params);
+        } else {
+          const params = { orderId: -1 };
+          Object.assign(formValues, params);
+        }
+        return await listMaintOrditm({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      },
+      querySuccess: () => {
+        nextTick(() => {
+          // eslint-disable-next-line no-use-before-define
+          const data = tableApi?.grid.getData();
+          completed.value = '宸插畬鎴�';
+          uncompleted.value = '鏈畬鎴�';
+          if (data.length <= 0) return false;
+          const wc = data?.filter((i) => i.status === '1')?.length;
+          completed.value = `宸插畬鎴�(${wc})`;
+          uncompleted.value = `鏈畬鎴�(${data.length - wc})`;
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'sub-orditm-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+  }
+});
+
+const [MaintOrditmDrawer, maintOrditmDrawerApi] = useVbenDrawer({
+  connectedComponent: maintOrditmDrawer
+});
+
+function handleAdd() {
+  maintOrditmDrawerApi.setData({});
+  maintOrditmDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  maintOrditmDrawerApi.setData({ id: record.id });
+  maintOrditmDrawerApi.open();
+}
+
+// 浣跨敤 watch 鐩戝惉 resId 鐨勫彉鍖�
+watch(
+  () => props.orderId,
+  (newVal, oldVal) => {
+    if (newVal !== oldVal && newVal) {
+      tableApi.query();
+    }
+  },
+  { immediate: false }
+);
+</script>
+
+<template>
+  <div class="w-full">
+    <BasicTable table-title="瀹炴柦椤圭洰">
+      <template #toolbar-tools>
+        <Space>
+          <a-button>{{ uncompleted }}</a-button>
+          <a-button type="primary"> {{ completed }}</a-button>
+        </Space>
+      </template>
+
+      <template #equName="{ row }">
+        <Space>
+          <span>{{ row.equName }}</span>
+        </Space>
+      </template>
+
+      <template #action="{ row }">
+        <Space>
+          <ghost-button v-access:code="['eims:maintOrditm:edit']" @click.stop="handleEdit(row)">
+            {{ $t('pages.common.edit') }}
+          </ghost-button>
+          <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+            <ghost-button danger v-access:code="['eims:maintOrditm:remove']" @click.stop="">
+              {{ $t('pages.common.delete') }}
+            </ghost-button>
+          </Popconfirm>
+        </Space>
+      </template>
+    </BasicTable>
+    <MaintOrditmDrawer @reload="tableApi.query()" />
+  </div>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-orditm/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/data.tsx
new file mode 100644
index 0000000..37e58ac
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/data.tsx
@@ -0,0 +1,169 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
+
+export const querySchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'Input',
+    fieldName: 'assetNo',
+    label: '璧勪骇缂栧彿'
+  }
+];
+
+export const columns: VxeGridProps['columns'] = [
+  { type: 'checkbox', width: 60, fixed: 'left' },
+  {
+    title: '鐘舵��',
+    field: 'status',
+    minWidth: 80,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.status, DictEnum.EIMS_ORDITM_STATUS);
+      }
+    }
+  },
+  {
+    title: '瀹屾垚鏃堕棿',
+    field: 'itmTime',
+    minWidth: 200
+  },
+  {
+    title: '璁惧鍚嶇О',
+    field: 'equName',
+    minWidth: 160,
+    slots: { default: 'equName' }
+  },
+  {
+    title: '淇濆吇椤圭洰',
+    field: 'itmName',
+    minWidth: 200
+  },
+  {
+    title: '椤圭洰鏍囧噯',
+    field: 'itmAction',
+    minWidth: 200
+  },
+  {
+    title: '淇濆吇鐢ㄦ埛',
+    field: 'itmUserName',
+    minWidth: 200
+  },
+  {
+    field: 'action',
+    fixed: 'right',
+    slots: { default: 'action' },
+    title: '鎿嶄綔',
+    width: 200
+  }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    fieldName: 'orderId',
+    label: '宸ュ崟id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'orderName',
+    label: '淇濆吇宸ュ崟'
+  },
+  {
+    component: 'Input',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    },
+    fieldName: 'id'
+  },
+  {
+    component: 'Input',
+    fieldName: 'equId',
+    label: '璁惧id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О',
+    componentProps: {
+      readonly: true
+    },
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      allowClear: true,
+      showSearch: true,
+      getPopupContainer
+    },
+    fieldName: 'itmName',
+    label: '淇濆吇椤圭洰',
+  },
+  {
+    component: 'Input',
+    fieldName: 'itmAction',
+    label: '椤圭洰鏍囧噯',
+    componentProps: {
+      readonly: true
+    },
+  },
+  {
+    component: 'Input',
+    fieldName: 'itmUser',
+    label: '淇濆吇浜篿d',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'itmUserName',
+    label: '淇濆吇浜�'
+  },
+  {
+    component: 'RadioGroup',
+    componentProps: {
+      buttonStyle: 'solid',
+      options: getDictOptions(DictEnum.EIMS_ORDITM_STATUS),
+      optionType: 'button'
+    },
+    fieldName: 'status',
+    defaultValue: '0',
+    label: '鐘舵��'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD HH:mm:ss',
+      showTime: true,
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      getPopupContainer
+    },
+    fieldName: 'itmTime',
+    label: '瀹屾垚鏃堕棿'
+  },
+  {
+    component: 'Textarea',
+    fieldName: 'remark',
+    label: '澶囨敞'
+  }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-orditm/index.vue b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/index.vue
new file mode 100644
index 0000000..014cb93
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/index.vue
@@ -0,0 +1,159 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { getVxePopupContainer } from '@vben/utils';
+
+import { Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delMaintOrditm, listMaintOrditm, maintOrditmExport } from '#/api/eims/maint-orditm';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import maintOrditmDrawer from './maint-orditm-drawer.vue';
+
+const formOptions: VbenFormProps = {
+  commonConfig: {
+    labelWidth: 80,
+    componentProps: {
+      allowClear: true
+    }
+  },
+  schema: querySchema(),
+  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
+};
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        return await listMaintOrditm({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'maint-orditm-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  formOptions,
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+  }
+});
+
+const [MaintOrditmDrawer, maintOrditmDrawerApi] = useVbenDrawer({
+  connectedComponent: maintOrditmDrawer
+});
+
+function handleAdd() {
+  maintOrditmDrawerApi.setData({});
+  maintOrditmDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  maintOrditmDrawerApi.setData({ id: record.id });
+  maintOrditmDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+  await delMaintOrditm(row.id);
+  await tableApi.query();
+}
+
+function handleMultiDelete() {
+  const rows = tableApi.grid.getCheckboxRecords();
+  const ids = rows.map((row: any) => row.id);
+  Modal.confirm({
+    title: '鎻愮ず',
+    okType: 'danger',
+    content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+    onOk: async () => {
+      await delMaintOrditm(ids);
+      await tableApi.query();
+    }
+  });
+}
+
+function handleDownloadExcel() {
+  commonDownloadExcel(maintOrditmExport, '淇濆吇宸ュ崟鏄庣粏璁板綍', tableApi.formApi.form.values, {
+    fieldMappingTime: formOptions.fieldMappingTime
+  });
+}
+</script>
+
+<template>
+  <Page :auto-content-height="true">
+    <div class="flex h-full gap-[8px]">
+      <BasicTable class="flex-1 overflow-hidden" table-title="淇濆吇宸ュ崟鏄庣粏鍒楄〃">
+        <template #toolbar-tools>
+          <Space>
+            <a-button v-access:code="['eims:maintOrditm:export']" @click="handleDownloadExcel">
+              {{ $t('pages.common.export') }}
+            </a-button>
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi)"
+              danger
+              type="primary"
+              v-access:code="['eims:maintOrditm:remove']"
+              @click="handleMultiDelete"
+            >
+              {{ $t('pages.common.delete') }}
+            </a-button>
+            <a-button type="primary" v-access:code="['eims:maintOrditm:add']" @click="handleAdd">
+              {{ $t('pages.common.add') }}
+            </a-button>
+          </Space>
+        </template>
+
+        <template #equName="{ row }">
+          <Space>
+            <span>{{ row.equName }}</span>
+          </Space>
+        </template>
+
+        <template #action="{ row }">
+          <Space>
+            <ghost-button v-access:code="['eims:maintOrditm:edit']" @click.stop="handleEdit(row)">
+              {{ $t('pages.common.edit') }}
+            </ghost-button>
+            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+              <ghost-button danger v-access:code="['eims:maintOrditm:remove']" @click.stop="">
+                {{ $t('pages.common.delete') }}
+              </ghost-button>
+            </Popconfirm>
+          </Space>
+        </template>
+      </BasicTable>
+    </div>
+    <MaintOrditmDrawer @reload="tableApi.query()" />
+  </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-orditm/maint-orditm-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/maint-orditm-drawer.vue
new file mode 100644
index 0000000..7341ecd
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-orditm/maint-orditm-drawer.vue
@@ -0,0 +1,175 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { cloneDeep } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { addMaintOrditm, getMaintOrditm, updateMaintOrditm } from '#/api/eims/maint-orditm';
+import { listMaintStand } from '#/api/eims/maint-stand';
+import orderModal from '#/views/eims/components/miant-order-modal.vue';
+import userModal from '#/views/eims/components/user-modal.vue';
+
+import { drawerSchema } from './data';
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+  return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
+});
+
+const [BasicForm, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    componentProps: {
+      class: 'w-full'
+    },
+    labelWidth: 120
+  },
+  schema: drawerSchema(),
+  showDefaultActions: false,
+  wrapperClass: 'grid-cols-2'
+});
+
+const [BasicDrawer, drawerApi] = useVbenDrawer({
+  onCancel: handleCancel,
+  onConfirm: handleConfirm,
+  async onOpenChange(isOpen) {
+    if (!isOpen) {
+      return null;
+    }
+    drawerApi.drawerLoading(true);
+    const { id } = drawerApi.getData() as { id?: number | string };
+    isUpdate.value = !!id;
+    // 鏇存柊 && 璧嬪��
+    if (isUpdate.value && id) {
+      const record = await getMaintOrditm(id);
+      await formApi.setValues(record);
+    }
+
+    drawerApi.drawerLoading(false);
+  }
+});
+
+/**
+ * 宸ュ崟鏄庣粏鐨勫姞杞�
+ */
+async function setupOrditmOptions(equId: any) {
+  const params = { equId };
+  const userPageResult = await listMaintStand({
+    pageNum: 1,
+    pageSize: 50,
+    ...params
+  });
+  const options = userPageResult?.rows.map((item) => ({
+    label: item.name,
+    value: item.name
+  }));
+  // 绛涢��
+  const filterOption = (input: string, option: any) => {
+    return option.label.toLowerCase().includes(input.toLowerCase());
+  };
+
+  const placeholder = options.length > 0 ? '璇烽�夋嫨' : '璇ュ伐鍗曟殏鏃犳槑缁�';
+  formApi.updateSchema([
+    {
+      componentProps: {
+        options,
+        placeholder,
+        filterOption,
+        async onSelect(name: string) {
+          const item = userPageResult?.rows.find((i) => i.name === name);
+          await formApi.setValues({ itmAction: item?.stand });
+        }
+      },
+      fieldName: 'itmName'
+    }
+  ]);
+}
+
+async function handleConfirm() {
+  try {
+    drawerApi.drawerLoading(true);
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    const data = cloneDeep(await formApi.getValues());
+    await (isUpdate.value ? updateMaintOrditm(data) : addMaintOrditm(data));
+    emit('reload');
+    await handleCancel();
+  } catch (error) {
+    console.error(error);
+  } finally {
+    drawerApi.drawerLoading(false);
+  }
+}
+
+async function handleCancel() {
+  drawerApi.close();
+  await formApi.resetForm();
+}
+
+// order modal
+const [OrderModal, orderModalApi] = useVbenModal({
+  connectedComponent: orderModal,
+  draggable: true,
+  title: '閫夋嫨宸ュ崟'
+});
+
+function handleOrderModal() {
+  orderModalApi.setData({});
+  orderModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勫伐鍗�
+ * @param order
+ */
+async function updateOrderSelect(order: any) {
+  await formApi.setValues({ 'orderId': order.id, 'orderName': order.maintCode, 'equId': order.equId, 'equName': order.equName });
+  await setupOrditmOptions(order?.equId);
+}
+
+// user modal
+const [UserModal, userModalApi] = useVbenModal({
+  connectedComponent: userModal,
+  draggable: true,
+  title: '閫夋嫨鎴愬憳'
+});
+
+/**
+ * 鎵撳紑閫夋嫨鐢ㄦ埛
+ */
+function handleUserModal() {
+  userModalApi.setData({});
+  userModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勭敤鎴�
+ * @param user
+ */
+async function updateUserSelect(user: any) {
+  await formApi.setValues({ 'itmUser': user.userId, 'itmUserName': user.nickName });
+}
+</script>
+
+<template>
+  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+    <BasicForm>
+      <template #orderName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleOrderModal" v-bind="slotProps" />
+      </template>
+      <template #itmUserName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal" v-bind="slotProps" />
+      </template>
+    </BasicForm>
+    <OrderModal class="w-[1200px]" @update-select="updateOrderSelect" />
+    <UserModal class="w-[1200px]" @select-user="updateUserSelect" />
+  </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
new file mode 100644
index 0000000..b96fefd
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-plan/data.tsx
@@ -0,0 +1,278 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { DictEnum } from '@vben/constants';
+import { getPopupContainer } from '@vben/utils';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+import { getDictOptions } from '#/utils/dict';
+import { renderDict } from '#/utils/render';
+
+export const querySchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'Input',
+    fieldName: 'assetNo',
+    label: '璧勪骇缂栧彿'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.EIMS_MAINT_TYPE)
+    },
+    fieldName: 'maintType',
+    label: '淇濆吇绫诲瀷'
+  },
+  {
+    component: 'TreeSelect',
+    // 鍦╠rawer閲屾洿鏂� 杩欓噷涓嶉渶瑕侀粯璁ょ殑componentProps
+    defaultValue: undefined,
+    fieldName: 'maintDept',
+    label: '淇濆吇閮ㄩ棬',
+
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      allowClear: true,
+      showSearch: true,
+      getPopupContainer
+    },
+    fieldName: 'maintUser',
+    label: '淇濆吇浜�',
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.MAINT_TIME_RULE)
+    },
+    fieldName: 'maintRule',
+    label: '璁$畻瑙勫垯'
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      options: getDictOptions(DictEnum.SYS_NORMAL_DISABLE)
+    },
+    fieldName: 'status',
+    label: '鐘舵��'
+  },
+];
+
+export const columns: VxeGridProps['columns'] = [
+  { type: 'checkbox', width: 60, fixed: 'left' },
+  {
+    title: '璁惧鍚嶇О',
+    field: 'equName',
+    minWidth: 200,
+    fixed: 'left'
+  },
+  {
+    title: '璧勪骇缂栧彿',
+    field: 'assetNo',
+    minWidth: 160
+  },
+  {
+    title: '鐘舵��',
+    field: 'status',
+    minWidth: 80,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.status, DictEnum.SYS_NORMAL_DISABLE);
+      }
+    }
+  },
+  {
+    title: '淇濆吇绫诲瀷',
+    field: 'maintType',
+    minWidth: 120,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.maintType, DictEnum.EIMS_MAINT_TYPE);
+      }
+    }
+  },
+  {
+    title: '淇濆吇浜�',
+    field: 'maintUserName',
+    minWidth: 100
+  },
+  {
+    title: '寰幆鍛ㄦ湡',
+    field: 'maintCycleUnitName',
+    minWidth: 80
+  },
+  {
+    title: '鏃堕棿璁$畻瑙勫垯',
+    field: 'maintRule',
+    minWidth: 140,
+    slots: {
+      default: ({ row }) => {
+        return renderDict(row.maintRule, DictEnum.MAINT_TIME_RULE);
+      }
+    }
+  },
+  {
+    title: '棣栨鎵ц鏃堕棿',
+    field: 'maintFirstTime',
+    minWidth: 160
+  },
+  {
+    title: '涓婃鎵ц鏃堕棿',
+    field: 'maintLastTime',
+    minWidth: 160
+  },
+  {
+    title: '涓嬫鎵ц鏃堕棿',
+    field: 'maintNextTime',
+    minWidth: 160
+  },
+  {
+    field: 'action',
+    fixed: 'right',
+    slots: { default: 'action' },
+    title: '鎿嶄綔',
+    width: 200
+  }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    },
+    fieldName: 'id'
+  },
+  {
+    component: 'Input',
+    fieldName: 'equId',
+    label: '璁惧id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'RadioGroup',
+    componentProps: {
+      buttonStyle: 'solid',
+      options: getDictOptions(DictEnum.EIMS_MAINT_TYPE),
+      optionType: 'button'
+    },
+    fieldName: 'maintType',
+    defaultValue: '1',
+    label: '淇濆吇绫诲瀷'
+  },
+  {
+    component: 'InputNumber',
+    fieldName: 'maintCycle',
+    label: '淇濆吇鍛ㄦ湡',
+    formItemClass: 'col-span-1',
+    componentProps: {
+      min: 1
+    }
+  },
+  {
+    component: 'Select',
+    componentProps: {
+      getPopupContainer,
+      options: getDictOptions(DictEnum.MAINT_CYCLE_UNIT)
+    },
+    fieldName: 'maintCycleUnit',
+    formItemClass: 'col-span-1 w-[80px]',
+    labelWidth: 0,
+    label: ''
+  },
+
+  {
+    component: 'Select',
+    componentProps: {
+      getPopupContainer,
+      options: getDictOptions(DictEnum.MAINT_TIME_RULE)
+    },
+    fieldName: 'maintRule',
+    label: '淇濆吇瑙勫垯 '
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintUser',
+    label: '鐢ㄦ埛id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintUserName',
+    label: '淇濆吇浜�'
+  },
+  {
+    component: 'Input',
+    fieldName: 'maintDept',
+    label: '閮ㄩ棬id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'RadioGroup',
+    componentProps: {
+      buttonStyle: 'solid',
+      options: getDictOptions(DictEnum.SYS_NORMAL_DISABLE),
+      optionType: 'button'
+    },
+    fieldName: 'status',
+    defaultValue: '0',
+    label: '鐘舵��'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD',
+      showTime: false,
+      valueFormat: 'YYYY-MM-DD',
+      getPopupContainer
+    },
+    fieldName: 'maintFirstTime',
+    label: '棣栨鎵ц鏃堕棿'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD',
+      showTime: false,
+      valueFormat: 'YYYY-MM-DD',
+      getPopupContainer
+    },
+    fieldName: 'maintLastTime',
+    label: '涓婃鎵ц鏃堕棿'
+  },
+  {
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD',
+      showTime: false,
+      valueFormat: 'YYYY-MM-DD',
+      getPopupContainer
+    },
+    fieldName: 'maintNextTime',
+    label: '涓嬫鎵ц鏃堕棿',
+  },
+  {
+    component: 'Textarea',
+    fieldName: 'remark',
+    label: '澶囨敞'
+  }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-plan/index.vue b/eims-ui/apps/web-antd/src/views/eims/maint-plan/index.vue
new file mode 100644
index 0000000..ff7c4d5
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-plan/index.vue
@@ -0,0 +1,293 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { onMounted, ref } from 'vue';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, getPopupContainer, getVxePopupContainer } from '@vben/utils';
+
+import { Dropdown, Menu, MenuItem, Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delMaintPlan, listMaintPlan, maintPlanExport } from '#/api/eims/maint-plan';
+import { listMaintStand } from '#/api/eims/maint-stand';
+import { generateCode } from '#/api/eims/utils';
+import { getDeptTree, userList } from '#/api/system/user';
+import { MAINT_ORDER_STATUS } from '#/constants/dict';
+import { commonDownloadExcel } from '#/utils/file/download';
+import BasisSubTable from '#/views/eims/components/basis-sub-table.vue';
+import maintOrderDrawer from '#/views/eims/maint-order/maint-order-drawer.vue';
+import { columns as maintSrandCol } from '#/views/eims/maint-stand/data';
+
+import { columns, querySchema } from './data';
+import maintPlanDrawer from './maint-plan-drawer.vue';
+
+const formOptions: VbenFormProps = {
+  commonConfig: {
+    labelWidth: 80,
+    componentProps: {
+      allowClear: true
+    }
+  },
+  collapsed: true,
+  schema: querySchema(),
+  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
+};
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        return await listMaintPlan({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'maint-plan-index'
+};
+const equId = ref<string>();
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  formOptions,
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams),
+    cellClick: (e: any) => {
+      const { row } = e;
+      equId.value = row.equId;
+    }
+  }
+});
+
+const [MaintPlanDrawer, maintPlanDrawerApi] = useVbenDrawer({
+  connectedComponent: maintPlanDrawer
+});
+
+const [MaintOrderDrawer, maintOrderDrawerApi] = useVbenDrawer({
+  connectedComponent: maintOrderDrawer,
+});
+
+function handleAdd() {
+  maintPlanDrawerApi.setData({});
+  maintPlanDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  maintPlanDrawerApi.setData({ id: record.id });
+  maintPlanDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+  await delMaintPlan(row.id);
+  await tableApi.query();
+}
+
+function handleMultiDelete() {
+  const rows = tableApi.grid.getCheckboxRecords();
+  const ids = rows.map((row: any) => row.id);
+  Modal.confirm({
+    title: '鎻愮ず',
+    okType: 'danger',
+    content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+    onOk: async () => {
+      await delMaintPlan(ids);
+      await tableApi.query();
+    }
+  });
+}
+
+function handleDownloadExcel() {
+  commonDownloadExcel(maintPlanExport, '淇濆吇璁″垝璁板綍', tableApi.formApi.form.values, {
+    fieldMappingTime: formOptions.fieldMappingTime
+  });
+}
+
+/**
+ * 鐢熸垚淇濆吇宸ュ崟
+ * @param record
+ */
+async function handleAddOrder(record: Recordable<any>) {
+  /**
+   * 鐢熸垚淇濆吇宸ュ崟code
+   */
+  const code = await generateCode('BYYJ');
+  if (!code) {
+    Modal.error({
+      content: '鐢熸垚淇濆吇宸ュ崟澶辫触锛岃閲嶈瘯锛�',
+      title: '鎻愮ず'
+    });
+    return false;
+  }
+  const planOrder = {
+    equId: record.equId,
+    equName: record.equName,
+    maintUser: record.maintUser,
+    maintUserName: record.maintUserName,
+    maintDept: record.maintDept,
+    maintDeptName: record.maintDeptName,
+    maintType: record.maintType,
+    planTime: record.maintNextTime,
+    status: MAINT_ORDER_STATUS.DAIBAOYANG,
+    maintCode: code
+  };
+
+  maintOrderDrawerApi.setData({ planOrder });
+  maintOrderDrawerApi.open();
+  // await addMaintOrder(order.value);
+}
+/**
+ * 鍒濆鍖栭儴闂ㄩ�夋嫨
+ */
+async function setupDeptSelect() {
+  // updateSchema
+  const deptTree = await getDeptTree();
+  // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊� 鍗崇埗鑺傜偣 / 瀛愯妭鐐�
+  addFullName(deptTree, 'label', ' / ');
+  tableApi.formApi.updateSchema([
+    {
+      componentProps: (formModel) => ({
+        class: 'w-full',
+        fieldNames: {
+          key: 'id',
+          value: 'id',
+          children: 'children'
+        },
+        getPopupContainer,
+        async onSelect(deptId: number | string) {
+          /** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
+          await setupUserOptions(deptId);
+          /** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
+          formModel.maintUser = undefined;
+        },
+        placeholder: '璇烽�夋嫨',
+        showSearch: true,
+        treeData: deptTree,
+        treeDefaultExpandAll: true,
+        treeLine: { showLeafIcon: false },
+        // 绛涢�夌殑瀛楁
+        treeNodeFilterProp: 'label',
+        // 閫変腑鍚庢樉绀哄湪杈撳叆妗嗙殑鍊�
+        treeNodeLabelProp: 'fullName'
+      }),
+      fieldName: 'maintDept'
+    }
+  ]);
+}
+
+/**
+ * 鐢ㄦ埛鐨勫姞杞�
+ */
+async function setupUserOptions(deptId: any) {
+  const params = { deptId };
+  const userPageResult = await userList({
+    pageNum: 1,
+    pageSize: 500,
+    ...params
+  });
+  const options = userPageResult.rows.map((item) => ({
+    label: item.nickName || item.userName,
+    value: item.userId
+  }));
+  // 绛涢��
+  const filterOption = (input: string, option: any) => {
+    return option.label.toLowerCase().includes(input.toLowerCase());
+  };
+
+  const placeholder = options.length > 0 ? '璇烽�夋嫨' : '璇ラ儴闂ㄤ笅鏆傛棤鐢ㄦ埛';
+  tableApi.formApi.updateSchema([
+    {
+      componentProps: { options, placeholder, filterOption },
+      fieldName: 'maintUser'
+    }
+  ]);
+}
+
+onMounted(async () => {
+  await setupDeptSelect();
+});
+</script>
+
+<template>
+  <Page :auto-content-height="true">
+    <div class="flex h-full gap-[8px] flex-col">
+      <BasicTable class="h-2/3" table-title="淇濆吇璁″垝鍒楄〃">
+        <template #toolbar-tools>
+          <Space>
+            <a-button v-access:code="['eims:maintPlan:export']" @click="handleDownloadExcel">
+              {{ $t('pages.common.export') }}
+            </a-button>
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi)"
+              danger
+              type="primary"
+              v-access:code="['eims:maintPlan:remove']"
+              @click="handleMultiDelete"
+            >
+              {{ $t('pages.common.delete') }}
+            </a-button>
+            <a-button type="primary" v-access:code="['eims:maintPlan:add']" @click="handleAdd">
+              {{ $t('pages.common.add') }}
+            </a-button>
+          </Space>
+        </template>
+
+        <template #equName="{ row }">
+          <Space>
+            <span>{{ row.equName }}</span>
+          </Space>
+        </template>
+
+        <template #action="{ row }">
+          <Space>
+            <ghost-button class="btn-success" v-access:code="['eims:maintPlan:edit']" @click.stop="handleAddOrder(row)"> 鐢熸垚宸ュ崟 </ghost-button>
+            <ghost-button v-access:code="['eims:maintPlan:edit']" @click.stop="handleEdit(row)">
+              {{ $t('pages.common.edit') }}
+            </ghost-button>
+          </Space>
+          <Dropdown :get-popup-container="getVxePopupContainer" placement="bottomRight">
+            <template #overlay>
+              <Menu>
+                <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+                  <MenuItem key="1" @click.stop="">
+                    {{ $t('pages.common.delete') }}
+                  </MenuItem>
+                </Popconfirm>
+              </Menu>
+            </template>
+            <a-button size="small" type="link" v-access:code="['eims:maintPlan:remove']">
+              {{ $t('pages.common.more') }}
+            </a-button>
+          </Dropdown>
+        </template>
+      </BasicTable>
+      <BasisSubTable :columns="maintSrandCol" :list-api="listMaintStand" :req-value="equId" class="h-1/3" req-key="equId" title="淇濆吇瀹炴柦椤圭洰" />
+    </div>
+    <MaintPlanDrawer @reload="tableApi.query()" />
+    <MaintOrderDrawer @reload="tableApi.query()" />
+  </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
new file mode 100644
index 0000000..9f094eb
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-plan/maint-plan-drawer.vue
@@ -0,0 +1,154 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { addMaintPlan, getMaintPlan, updateMaintPlan } from '#/api/eims/maint-plan';
+import { getDeptTree, userList } from '#/api/system/user';
+import equModal from '#/views/eims/components/equ-modal.vue';
+import userModal from '#/views/eims/components/user-modal.vue';
+
+import { drawerSchema } from './data';
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+  return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
+});
+
+const [BasicForm, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    componentProps: {
+      class: 'w-full'
+    },
+    labelWidth: 120
+  },
+  layout: 'horizontal',
+  fieldMappingTime: [['field4', ['phoneType', 'phoneNumber'], null]],
+  schema: drawerSchema(),
+  showDefaultActions: false,
+  wrapperClass: 'grid-cols-2'
+});
+
+const [BasicDrawer, drawerApi] = useVbenDrawer({
+  onCancel: handleCancel,
+  onConfirm: handleConfirm,
+  async onOpenChange(isOpen) {
+    if (!isOpen) {
+      return null;
+    }
+    drawerApi.drawerLoading(true);
+    const { id } = drawerApi.getData() as { id?: number | string };
+    isUpdate.value = !!id;
+
+    formApi.updateSchema([
+      {
+        dependencies: {
+          show: () => isUpdate.value,
+          triggerFields: ['']
+        },
+        fieldName: 'maintLastTime'
+      },
+      {
+        dependencies: {
+          show: () => isUpdate.value,
+          triggerFields: ['']
+        },
+        fieldName: 'maintNextTime'
+      }
+    ]);
+    // 鏇存柊 && 璧嬪��
+    if (isUpdate.value && id) {
+      const record = await getMaintPlan(id);
+      await formApi.setValues(record);
+    }
+
+    drawerApi.drawerLoading(false);
+  }
+});
+
+async function handleConfirm() {
+  try {
+    drawerApi.drawerLoading(true);
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    const data = cloneDeep(await formApi.getValues());
+    await (isUpdate.value ? updateMaintPlan(data) : addMaintPlan(data));
+    emit('reload');
+    await handleCancel();
+  } catch (error) {
+    console.error(error);
+  } finally {
+    drawerApi.drawerLoading(false);
+  }
+}
+
+async function handleCancel() {
+  drawerApi.close();
+  await formApi.resetForm();
+}
+
+// equ modal
+const [EquModal, equModalApi] = useVbenModal({
+  connectedComponent: equModal,
+  draggable: true,
+  title: '閫夋嫨璁惧'
+});
+
+function handleEquModal() {
+  equModalApi.setData({});
+  equModalApi.open();
+}
+
+// user modal
+const [UserModal, userModalApi] = useVbenModal({
+  connectedComponent: userModal,
+  draggable: true,
+  title: '閫夋嫨淇濆吇浜�'
+});
+
+function handleUserModal() {
+  userModalApi.setData({});
+  userModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勮澶�
+ * @param equ
+ */
+async function updateEqu(equ: any) {
+  await formApi.setValues(equ);
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勭敤鎴�
+ * @param user
+ */
+async function updateUser(user: any) {
+  await formApi.setValues({ 'maintUserName': user.nickName, 'maintUser': user.userId, 'maintDept': user.deptId });
+}
+</script>
+
+<template>
+  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+    <BasicForm>
+      <template #equName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleEquModal" v-bind="slotProps" />
+      </template>
+      <template #maintUserName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleUserModal" v-bind="slotProps" />
+      </template>
+    </BasicForm>
+    <EquModal class="w-[1200px]" @update-equ="updateEqu" />
+    <UserModal class="w-[1200px]" @select-user="updateUser" />
+  </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-stand/data.tsx b/eims-ui/apps/web-antd/src/views/eims/maint-stand/data.tsx
new file mode 100644
index 0000000..bf209fb
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-stand/data.tsx
@@ -0,0 +1,111 @@
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
+import { type FormSchemaGetter } from '#/adapter/form';
+
+export const querySchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'Input',
+    fieldName: 'assetNo',
+    label: '璧勪骇缂栧彿'
+  }
+];
+
+export const columns: VxeGridProps['columns'] = [
+  { type: 'checkbox', width: 60, fixed: 'left' },
+  {
+    title: '璁惧鍚嶇О',
+    field: 'equName',
+    minWidth: 200,
+    fixed: 'left',
+    slots: { default: 'equName' }
+  },
+  {
+    title: '璧勪骇缂栧彿',
+    field: 'assetNo',
+    minWidth: 160
+  },
+  {
+    title: '淇濆吇椤圭洰',
+    field: 'name',
+    minWidth: 300
+  },
+  {
+    title: '椤圭洰鏍囧噯',
+    field: 'stand',
+    minWidth: 200
+  },
+  {
+    field: 'action',
+    fixed: 'right',
+    slots: { default: 'action' },
+    title: '鎿嶄綔',
+    width: 200
+  }
+];
+
+export const drawerSchema: FormSchemaGetter = () => [
+  {
+    component: 'Input',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    },
+    fieldName: 'id'
+  },
+  {
+    component: 'Input',
+    fieldName: 'equId',
+    label: '璁惧id',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'equCode',
+    label: '璁惧缂栫爜',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'assetNo',
+    label: '璧勪骇缂栧彿',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'modelNo',
+    label: '璁惧鍨嬪彿',
+    dependencies: {
+      show: () => false,
+      triggerFields: ['']
+    }
+  },
+  {
+    component: 'Input',
+    fieldName: 'equName',
+    label: '璁惧鍚嶇О'
+  },
+  {
+    component: 'Textarea',
+    fieldName: 'name',
+    label: '瀹炴柦椤圭洰'
+  },
+  {
+    component: 'Textarea',
+    fieldName: 'stand',
+    label: '瀹炴柦鏍囧噯'
+  }
+];
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-stand/index.vue b/eims-ui/apps/web-antd/src/views/eims/maint-stand/index.vue
new file mode 100644
index 0000000..d399899
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-stand/index.vue
@@ -0,0 +1,159 @@
+<script setup lang="ts">
+import type { Recordable } from '@vben/types';
+
+import { Page, useVbenDrawer, type VbenFormProps } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { getVxePopupContainer } from '@vben/utils';
+
+import { Modal, Popconfirm, Space } from 'ant-design-vue';
+
+import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { delMaintStand, listMaintStand, maintStandExport } from '#/api/eims/maint-stand';
+import { commonDownloadExcel } from '#/utils/file/download';
+
+import { columns, querySchema } from './data';
+import maintStandDrawer from './maint-stand-drawer.vue';
+
+const formOptions: VbenFormProps = {
+  commonConfig: {
+    labelWidth: 80,
+    componentProps: {
+      allowClear: true
+    }
+  },
+  schema: querySchema(),
+  wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4'
+};
+
+const gridOptions: VxeGridProps = {
+  checkboxConfig: {
+    // 楂樹寒
+    highlight: true,
+    // 缈婚〉鏃朵繚鐣欓�変腑鐘舵��
+    reserve: true
+    // 鐐瑰嚮琛岄�変腑
+    // trigger: 'row'
+  },
+  columns,
+  height: 'auto',
+  keepSource: true,
+  pagerConfig: {},
+  proxyConfig: {
+    ajax: {
+      query: async ({ page }, formValues = {}) => {
+        return await listMaintStand({
+          pageNum: page.currentPage,
+          pageSize: page.pageSize,
+          ...formValues
+        });
+      }
+    }
+  },
+  rowConfig: {
+    isHover: true,
+    keyField: 'id'
+  },
+  sortConfig: {
+    // 杩滅▼鎺掑簭
+    remote: true,
+    // 鏀寔澶氬瓧娈垫帓搴� 榛樿鍏抽棴
+    multiple: true
+  },
+  id: 'maint-stand-index'
+};
+
+const [BasicTable, tableApi] = useVbenVxeGrid({
+  formOptions,
+  gridOptions,
+  gridEvents: {
+    sortChange: (sortParams) => vxeSortEvent(tableApi, sortParams)
+  }
+});
+
+const [MaintStandDrawer, maintStandDrawerApi] = useVbenDrawer({
+  connectedComponent: maintStandDrawer
+});
+
+function handleAdd() {
+  maintStandDrawerApi.setData({});
+  maintStandDrawerApi.open();
+}
+
+async function handleEdit(record: Recordable<any>) {
+  maintStandDrawerApi.setData({ id: record.id });
+  maintStandDrawerApi.open();
+}
+
+async function handleDelete(row: Recordable<any>) {
+  await delMaintStand(row.id);
+  await tableApi.query();
+}
+
+function handleMultiDelete() {
+  const rows = tableApi.grid.getCheckboxRecords();
+  const ids = rows.map((row: any) => row.id);
+  Modal.confirm({
+    title: '鎻愮ず',
+    okType: 'danger',
+    content: `纭鍒犻櫎閫変腑鐨�${ids.length}鏉¤褰曞悧锛焋,
+    onOk: async () => {
+      await delMaintStand(ids);
+      await tableApi.query();
+    }
+  });
+}
+
+function handleDownloadExcel() {
+  commonDownloadExcel(maintStandExport, '淇濆吇鏍囧噯璁板綍', tableApi.formApi.form.values, {
+    fieldMappingTime: formOptions.fieldMappingTime
+  });
+}
+</script>
+
+<template>
+  <Page :auto-content-height="true">
+    <div class="flex h-full gap-[8px]">
+      <BasicTable class="flex-1 overflow-hidden" table-title="淇濆吇鏍囧噯鍒楄〃">
+        <template #toolbar-tools>
+          <Space>
+            <a-button v-access:code="['eims:maintStand:export']" @click="handleDownloadExcel">
+              {{ $t('pages.common.export') }}
+            </a-button>
+            <a-button
+              :disabled="!vxeCheckboxChecked(tableApi)"
+              danger
+              type="primary"
+              v-access:code="['eims:maintStand:remove']"
+              @click="handleMultiDelete"
+            >
+              {{ $t('pages.common.delete') }}
+            </a-button>
+            <a-button type="primary" v-access:code="['eims:maintStand:add']" @click="handleAdd">
+              {{ $t('pages.common.add') }}
+            </a-button>
+          </Space>
+        </template>
+
+        <template #equName="{ row }">
+          <Space>
+            <span>{{ row.equName }}</span>
+          </Space>
+        </template>
+
+        <template #action="{ row }">
+          <Space>
+            <ghost-button v-access:code="['eims:maintStand:edit']" @click.stop="handleEdit(row)">
+              {{ $t('pages.common.edit') }}
+            </ghost-button>
+            <Popconfirm :get-popup-container="getVxePopupContainer" placement="left" title="纭鍒犻櫎锛�" @confirm="handleDelete(row)">
+              <ghost-button danger v-access:code="['eims:maintStand:remove']" @click.stop="">
+                {{ $t('pages.common.delete') }}
+              </ghost-button>
+            </Popconfirm>
+          </Space>
+        </template>
+      </BasicTable>
+    </div>
+    <MaintStandDrawer @reload="tableApi.query()" />
+  </Page>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/maint-stand/maint-stand-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/maint-stand/maint-stand-drawer.vue
new file mode 100644
index 0000000..1e430fd
--- /dev/null
+++ b/eims-ui/apps/web-antd/src/views/eims/maint-stand/maint-stand-drawer.vue
@@ -0,0 +1,111 @@
+<script setup lang="ts">
+import { computed, ref } from 'vue';
+
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { $t } from '@vben/locales';
+import { cloneDeep } from '@vben/utils';
+
+import { InputSearch } from 'ant-design-vue';
+
+import { useVbenForm } from '#/adapter/form';
+import { addMaintStand, getMaintStand, updateMaintStand } from '#/api/eims/maint-stand';
+
+import equModal from '#/views/eims/components/equ-modal.vue';
+
+import { drawerSchema } from './data';
+import type { MaintStandVO } from '#/api/eims/maint-stand/model';
+
+const emit = defineEmits<{ reload: [] }>();
+
+const isUpdate = ref(false);
+const title = computed(() => {
+  return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add');
+});
+
+const [BasicForm, formApi] = useVbenForm({
+  commonConfig: {
+    formItemClass: 'col-span-2',
+    componentProps: {
+      class: 'w-full'
+    },
+    labelWidth: 120
+  },
+  schema: drawerSchema(),
+  showDefaultActions: false,
+  wrapperClass: 'grid-cols-2'
+});
+
+const [BasicDrawer, drawerApi] = useVbenDrawer({
+  onCancel: handleCancel,
+  onConfirm: handleConfirm,
+  async onOpenChange(isOpen) {
+    if (!isOpen) {
+      return null;
+    }
+    drawerApi.drawerLoading(true);
+    const { id } = drawerApi.getData() as { id?: number | string };
+    isUpdate.value = !!id;
+    // 鏇存柊 && 璧嬪��
+    if (isUpdate.value && id) {
+      const record = await getMaintStand(id);
+      await formApi.setValues(record);
+    }
+
+    drawerApi.drawerLoading(false);
+  }
+});
+
+async function handleConfirm() {
+  try {
+    drawerApi.drawerLoading(true);
+    const { valid } = await formApi.validate();
+    if (!valid) {
+      return;
+    }
+    const data = cloneDeep(await formApi.getValues());
+    await (isUpdate.value ? updateMaintStand(data) : addMaintStand(data));
+    emit('reload');
+    await handleCancel();
+  } catch (error) {
+    console.error(error);
+  } finally {
+    drawerApi.drawerLoading(false);
+  }
+}
+
+async function handleCancel() {
+  drawerApi.close();
+  await formApi.resetForm();
+}
+
+// equ modal
+const [EquModal, equModalApi] = useVbenModal({
+  connectedComponent: equModal,
+  draggable: true,
+  title: '閫夋嫨璁惧'
+});
+
+function handleEquModal() {
+  equModalApi.setData({});
+  equModalApi.open();
+}
+
+/**
+ * 鏇存柊閫夋嫨鐨勮澶�
+ * @param equ
+ */
+async function updateSelect(equ: any) {
+  await formApi.setValues(equ);
+}
+</script>
+
+<template>
+  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+    <BasicForm>
+      <template #equName="slotProps">
+        <InputSearch :enter-button="true" placeholder="璇烽�夋嫨" @search="handleEquModal" v-bind="slotProps" />
+      </template>
+    </BasicForm>
+    <EquModal class="w-[1200px]" @update-equ="updateSelect" />
+  </BasicDrawer>
+</template>
diff --git a/eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx b/eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx
index f6ce668..4946d81 100644
--- a/eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/repair-req/data.tsx
@@ -79,6 +79,23 @@
 export const columns: VxeGridProps['columns'] = [
   { type: 'checkbox', width: 60, fixed: 'left' },
   {
+    title: '璁惧(宸ュ叿)鍚嶇О',
+    sortable: true,
+    minWidth: 150,
+    fixed: 'left',
+    slots: {
+      default: ({ row }) => {
+        if (row.reqType === REPAIR_REQ_TYPE.EQU) {
+          return row.equName;
+        } else if (row.reqType === REPAIR_REQ_TYPE.FIXTURE) {
+          return row.fixtureName;
+        } else {
+          return '';
+        }
+      }
+    }
+  },
+  {
     title: '鎶ヤ慨鍗曞彿',
     field: 'code',
     minWidth: 160,
@@ -116,22 +133,6 @@
     field: 'reqTime',
     sortable: true,
     minWidth: 200
-  },
-  {
-    title: '璁惧(宸ュ叿)鍚嶇О',
-    sortable: true,
-    minWidth: 150,
-    slots: {
-      default: ({ row }) => {
-        if (row.reqType === REPAIR_REQ_TYPE.EQU) {
-          return row.equName;
-        } else if (row.reqType === REPAIR_REQ_TYPE.FIXTURE) {
-          return row.fixtureName;
-        } else {
-          return '';
-        }
-      }
-    }
   },
   {
     title: '鏁呴殰绫诲埆',
diff --git a/eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx b/eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx
index 3f5d7b4..0913dd9 100644
--- a/eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx
+++ b/eims-ui/apps/web-antd/src/views/eims/repair-res/data.tsx
@@ -50,6 +50,33 @@
 export const columns: VxeGridProps['columns'] = [
   { type: 'checkbox', width: 60, fixed: 'left' },
   {
+    title: '璁惧(宸ュ叿)鍚嶇О',
+    sortable: true,
+    minWidth: 150,
+    fixed: 'left',
+    slots: {
+      default: ({ row }) => {
+        if (!row.reqType) {
+          return '';
+        }
+
+        // 鏍规嵁涓嶅悓鐨勮姹傜被鍨嬭繑鍥炵浉搴旂殑鍚嶇О
+        switch (row.reqType) {
+          case REPAIR_REQ_TYPE.EQU: {
+            return row.equName;
+          }
+          case REPAIR_REQ_TYPE.FIXTURE: {
+            return row.fixtureName;
+          }
+          default: {
+            // 濡傛灉璇锋眰绫诲瀷鏃笉鏄� EQU 涔熶笉鏄� FIXTURE锛屽垯杩斿洖绌哄瓧绗︿覆
+            return '';
+          }
+        }
+      }
+    }
+  },
+  {
     title: '缁翠慨鍗曞彿',
     field: 'resCode',
     minWidth: 160,
@@ -103,32 +130,6 @@
     field: 'reqTime',
     sortable: true,
     minWidth: 200
-  },
-  {
-    title: '璁惧(宸ュ叿)鍚嶇О',
-    sortable: true,
-    minWidth: 150,
-    slots: {
-      default: ({ row }) => {
-        if (!row.reqType) {
-          return '';
-        }
-
-        // 鏍规嵁涓嶅悓鐨勮姹傜被鍨嬭繑鍥炵浉搴旂殑鍚嶇О
-        switch (row.reqType) {
-          case REPAIR_REQ_TYPE.EQU: {
-            return row.equName;
-          }
-          case REPAIR_REQ_TYPE.FIXTURE: {
-            return row.fixtureName;
-          }
-          default: {
-            // 濡傛灉璇锋眰绫诲瀷鏃笉鏄� EQU 涔熶笉鏄� FIXTURE锛屽垯杩斿洖绌哄瓧绗︿覆
-            return '';
-          }
-        }
-      }
-    }
   },
   {
     title: '鏁呴殰绫诲埆',
diff --git a/eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue b/eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue
index 5a7d45b..226fdcf 100644
--- a/eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/repair-res/index.vue
@@ -12,17 +12,18 @@
 import { Modal, Popconfirm, Space } from 'ant-design-vue';
 
 import { useVbenVxeGrid, vxeCheckboxChecked, type VxeGridProps, vxeSortEvent } from '#/adapter/vxe-table';
+import { listRepairRecord } from '#/api/eims/repair-record';
 import { delRepairRes, listRepairRes, repairResExport } from '#/api/eims/repair-res';
 import { getDeptTree, userList } from '#/api/system/user';
 import { REPAIR_RES_STATUS } from '#/constants/dict';
 import { commonDownloadExcel } from '#/utils/file/download';
+import BasisSubTable from '#/views/eims/components/basis-sub-table.vue';
 
-import RepairRecord from '../repair-record/index.vue';
+import fbPreviewDrawer from '../repair-fb/fb-preview-drawer.vue';
+import repairFbDrawer from '../repair-fb/repair-fb-drawer.vue';
+import { columns as repairRecordCol } from '../repair-record/data';
 import { columns, querySchema } from './data';
 import repairResDrawer from './repair-res-drawer.vue';
-
-import repairFbDrawer from '../repair-fb/repair-fb-drawer.vue'
-import fbPreviewDrawer from '../repair-fb/fb-preview-drawer.vue'
 
 const userStore = useUserStore();
 const userId = userStore.userInfo?.userId;
@@ -106,7 +107,7 @@
 });
 
 function handleAddFb(record: Recordable<any>) {
-  repairFbDrawerApi.setData({ resId: record.id, resCode: record.resCode, fbUser: userId, fbDept: deptId});
+  repairFbDrawerApi.setData({ resId: record.id, resCode: record.resCode, fbUser: userId, fbDept: deptId });
   repairFbDrawerApi.open();
 }
 
@@ -114,7 +115,6 @@
   fbPreviewDrawerApi.setData({ id: record.fbId });
   fbPreviewDrawerApi.open();
 }
-
 
 function handleAdd() {
   repairResDrawerApi.setData({ resUser: userId, resDept: deptId });
@@ -133,22 +133,22 @@
 
 const { hasAccessByRoles } = useAccess();
 const isSuperAdmin = computed(() => hasAccessByRoles(['superadmin']));
-
+const isLeader = computed(() => hasAccessByRoles(['leader']));
 
 function pingjiaAdd(row: any) {
-  return (isSuperAdmin.value || row.reqUser === userId) && row.status === REPAIR_RES_STATUS.WANCHENG && !row.fbId;
+  return (isSuperAdmin.value || isLeader.value || row.reqUser === userId) && row.status === REPAIR_RES_STATUS.WANCHENG && !row.fbId;
 }
 
 function pingjiaDetail(row: any) {
-  return (isSuperAdmin.value || row.reqUser === userId) && row.status === REPAIR_RES_STATUS.WANCHENG && row.fbId;
+  return (isSuperAdmin.value || isLeader.value || row.reqUser === userId) && row.status === REPAIR_RES_STATUS.WANCHENG && row.fbId;
 }
 
 function weixiu(row: any) {
-  return (isSuperAdmin.value || row.resUser === userId) && row.status === REPAIR_RES_STATUS.YIJIEDAN;
+  return (isSuperAdmin.value || isLeader.value || row.resUser === userId) && row.status === REPAIR_RES_STATUS.YIJIEDAN;
 }
 
 function wancheng(row: any) {
-  return (isSuperAdmin.value || row.resUser === userId) && row.status === REPAIR_RES_STATUS.WEIXIU;
+  return (isSuperAdmin.value || isLeader.value || row.resUser === userId) && row.status === REPAIR_RES_STATUS.WEIXIU;
 }
 
 async function handleDelete(row: Recordable<any>) {
@@ -272,8 +272,12 @@
 
         <template #action="{ row }">
           <Space>
-            <ghost-button v-if="pingjiaAdd(row)" class="btn-success" v-access:code="['eims:repairRes:edit']" @click.stop="handleAddFb(row)"> 璇勪环 </ghost-button>
-            <ghost-button v-if="pingjiaDetail(row)" class="btn-success" v-access:code="['eims:repairRes:edit']" @click.stop="handleDetailFb(row)"> 闃呰瘎 </ghost-button>
+            <ghost-button v-if="pingjiaAdd(row)" class="btn-success" v-access:code="['eims:repairRes:edit']" @click.stop="handleAddFb(row)">
+              璇勪环
+            </ghost-button>
+            <ghost-button v-if="pingjiaDetail(row)" class="btn-success" v-access:code="['eims:repairRes:edit']" @click.stop="handleDetailFb(row)">
+              闃呰瘎
+            </ghost-button>
             <ghost-button
               v-if="weixiu(row)"
               class="btn-success"
@@ -303,7 +307,7 @@
           </Space>
         </template>
       </BasicTable>
-      <RepairRecord :res-id="resId" class="h-1/3" table-title="缁翠慨璁板綍" />
+      <BasisSubTable :columns="repairRecordCol" :list-api="listRepairRecord" :req-value="resId" class="h-1/3" req-key="resId" title="鎿嶄綔璁板綍" />
     </div>
     <RepairResDrawer @reload="tableApi.query()" />
     <RepairFbDrawer @reload="tableApi.query()" />
diff --git a/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts b/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
index a1bfb45..1e5e3a5 100644
--- a/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
+++ b/eims-ui/packages/@core/base/shared/src/constants/dict-enum.ts
@@ -3,9 +3,14 @@
   EIMS_FIXTURE_STATUS = 'eims_fixture_status', // 宸ュ叿锛堟不鍏凤級鐘舵��
   EIMS_INVENTORY_DETAIL_STATU = 'inventory_detail_statu', // 璁惧鐩樼偣鐘舵��
   EIMS_INVENTORY_STATU = 'inventory_statu', // 璁惧鐩樼偣鐘舵��
+  EIMS_MAINT_TYPE = 'eims_maint_type', // 淇濆吇绫诲瀷
+  EIMS_ORDITM_STATUS = 'eims_orditm_status', // 淇濆吇宸ュ崟鏄庣粏瀹屾垚鐘舵��
   EQU_IMPORT_STATU = 'equ_import_status', // 璁惧瀵煎叆鐘舵��
   FIXTURE_BORROW_RECORD_STATUS = 'fixture_borrow_record_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤璁板綍鐘舵��
   FIXTURE_BORROW_STATUS = 'fixture_borrow_status', // 宸ュ叿锛堟不鍏凤級鍊熺敤鐘舵��
+  MAINT_CYCLE_UNIT = 'maint_cycle_unit', // 淇濆吇鍛ㄦ湡鍗曚綅
+  MAINT_ORDER_STATUS = 'maint_order_status', // 淇濆吇宸ュ崟鐘舵��
+  MAINT_TIME_RULE = 'maint_time_rule', // 淇濆吇瑙勫垯
   REPAIR_FAULT_TYPE = 'repair_fault_type', // 鎶ヤ慨鐘舵��
   REPAIR_RECORD_HANDLE = 'repair_record_handle', // 缁翠慨璁板綍鎿嶄綔
   REPAIR_REQ_STATUS = 'repair_req_status', // 鎶ヤ慨鐘舵��
diff --git a/eims/ruoyi-admin/src/main/resources/application-dev.yml b/eims/ruoyi-admin/src/main/resources/application-dev.yml
index 4ca327a..a2da72f 100644
--- a/eims/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/eims/ruoyi-admin/src/main/resources/application-dev.yml
@@ -13,7 +13,7 @@
 
 --- # snail-job 閰嶇疆
 snail-job:
-  enabled: false
+  enabled: true
   # 闇�瑕佸湪 SnailJob 鍚庡彴缁勭鐞嗗垱寤哄搴斿悕绉扮殑缁�,鐒跺悗鍒涘缓浠诲姟鐨勬椂鍊欓�夋嫨瀵瑰簲鐨勭粍,鎵嶈兘姝g‘鍒嗘淳浠诲姟
   group: "ruoyi_group"
   # SnailJob 鎺ュ叆楠岃瘉浠ょ墝 璇﹁ script/sql/snail_job.sql `sj_group_config` 琛�
diff --git a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
index 878a0bb..bb8dca6 100644
--- a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
+++ b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/DictConstants.java
@@ -19,6 +19,7 @@
      * 鎶ヤ慨鐘舵��
      */
     String REPAIR_REQ_STATUS = "repair_req_status";
+
     interface REPAIR_REQ_STATUS_DETAIL {
         /**
          * 宸叉帴鍗�
@@ -38,6 +39,7 @@
      * 缁翠慨宸ュ崟鐘舵��
      */
     String REPAIR_RES_STATUS = "repair_res_status";
+
     interface REPAIR_RES_STATUS_DETAIL {
         /**
          * 鎺ュ崟
@@ -58,6 +60,7 @@
      * 缁翠慨宸ュ崟鐘舵��
      */
     String REPAIR_RECORD_HANDLE = "repair_record_handle";
+
     interface REPAIR_RECORD_HANDLE_DETAIL {
         /**
          * 鏂板
@@ -79,4 +82,63 @@
         String WANCHENG = "4";
     }
 
+    /**
+     * 淇濆吇鏃堕棿璁$畻瑙勫垯
+     */
+    String MAINT_TIME_RULE = "maint_time_rule";
+
+    interface MAINT_TIME_RULE_DETAIL {
+        /**
+         * 鎸夊浐瀹氬懆鏈�
+         */
+        String CYCLE = "0";
+        /**
+         * 鎸変笂娆′繚鍏绘椂闂�
+         */
+        String LAST = "1";
+    }
+
+    /**
+     * 绯荤粺鏄剧ず闅愯棌
+     */
+    String SYS_NORMAL_DISABLE = "sys_normal_disable";
+
+    interface SYS_NORMAL_DISABLE_DETAIL {
+        String NORMAL = "0";
+        String DISABLE = "1";
+    }
+
+    /**
+     * 淇濆吇鏃堕棿鍗曚綅
+     */
+    String MAINT_CYCLE_UNIT = "maint_cycle_unit";
+
+    interface MAINT_CYCLE_UNIT_DETAIL {
+        String DAY = "1";
+        String WEEK = "2";
+        String MONTH = "3";
+        String SEASON = "4";
+        String YEAR = "5";
+    }
+
+    /**
+     * 淇濆吇宸ュ崟鐘舵��
+     */
+    String MAINT_ORDER_STATUS = "maint_order_status";
+
+    interface MAINT_ORDER_STATUS_DETAIL {
+        String BAOYANG = "1";// 淇濆吇缁�
+        String DAIBAOYANG = "0"; // 寰呬繚鍏�
+        String DAIYANZHENG = "2"; // 寰呴獙璇�
+        String WANCHENG = "3"; // 瀹屾垚
+    }
+
+    /**
+     * 淇濆吇宸ュ崟椤瑰畬鎴愮姸鎬�
+     */
+    String EIMS_ORDITM_STATUS = "eims_orditm_status";
+    interface EIMS_ORDITM_STATUS_DETAIL {
+        String WEIWANCHENG = "0";// 鏈畬鎴�
+        String YIWANCHENG = "1"; // 宸插畬鎴�
+    }
 }
diff --git a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/MaintOrderService.java b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/MaintOrderService.java
new file mode 100644
index 0000000..03d6000
--- /dev/null
+++ b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/MaintOrderService.java
@@ -0,0 +1,11 @@
+package org.dromara.common.core.service;
+
+public interface MaintOrderService {
+    /**
+     * 閫氳繃淇濆吇宸ュ崟ID鏌ヨ淇濆吇宸ュ崟code
+     *
+     * @param orderIds 淇濆吇宸ュ崟ID涓查�楀彿鍒嗛殧
+     * @return 淇濆吇宸ュ崟鍚嶇О涓查�楀彿鍒嗛殧
+     */
+    String selectMaintOrderCodeByIds(String orderIds);
+}
diff --git a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
index 72178a7..e0f9ecd 100644
--- a/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
+++ b/eims/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
@@ -129,6 +129,13 @@
     }
 
     /**
+     * 璁$畻鐩稿樊澶╂暟
+     */
+    public static int differentDays(Date date1, Date date2) {
+        return  (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
+    }
+
+    /**
      * 璁$畻涓や釜鏃堕棿宸�
      */
     public static String getDatePoor(Date endDate, Date nowDate) {
diff --git a/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java b/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
index 2f7f37c..697c3c1 100644
--- a/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
+++ b/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
@@ -60,4 +60,9 @@
      */
     String REPAIR_RES_ID_TO_CODE = "repair_res_id_to_code";
 
+    /**
+     * 淇濆吇宸ュ崟id杞琧ode
+     */
+    String MAINT_ORDER_ID_TO_CODE = "maint_order_id_to_code";
+
 }
diff --git a/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/MaintOrderCodeTranslationImpl.java b/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/MaintOrderCodeTranslationImpl.java
new file mode 100644
index 0000000..51fcf67
--- /dev/null
+++ b/eims/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/MaintOrderCodeTranslationImpl.java
@@ -0,0 +1,30 @@
+package org.dromara.common.translation.core.impl;
+
+import lombok.AllArgsConstructor;
+import org.dromara.common.core.service.MaintOrderService;
+import org.dromara.common.core.service.RepairResService;
+import org.dromara.common.translation.annotation.TranslationType;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.common.translation.core.TranslationInterface;
+
+/**
+ * 淇濆吇宸ュ崟id杞琧ode
+ *
+ * @author zhuguifei
+ */
+@AllArgsConstructor
+@TranslationType(type = TransConstant.MAINT_ORDER_ID_TO_CODE)
+public class MaintOrderCodeTranslationImpl implements TranslationInterface<String> {
+
+    private final MaintOrderService orderService;
+
+    @Override
+    public String translation(Object key, String other) {
+        if (key instanceof String ids) {
+            return orderService.selectMaintOrderCodeByIds(ids);
+        } else if (key instanceof Long id) {
+            return orderService.selectMaintOrderCodeByIds(id.toString());
+        }
+        return null;
+    }
+}
diff --git a/eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 427b607..fb76424 100644
--- a/eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/eims/ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -10,3 +10,4 @@
 org.dromara.common.translation.core.impl.FixtureNameTranslationImpl
 org.dromara.common.translation.core.impl.RepairReqCodeTranslationImpl
 org.dromara.common.translation.core.impl.RepairResCodeTranslationImpl
+org.dromara.common.translation.core.impl.MaintOrderCodeTranslationImpl
diff --git a/eims/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml b/eims/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
index 3ba983c..a69cbda 100644
--- a/eims/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
+++ b/eims/ruoyi-extend/ruoyi-snailjob-server/src/main/resources/application-prod.yml
@@ -2,9 +2,9 @@
   datasource:
     type: com.zaxxer.hikari.HikariDataSource
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+    url: jdbc:mysql://localhost:3306/eims?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
     username: root
-    password: root
+    password: 123456
     hikari:
       connection-timeout: 30000
       validation-timeout: 5000
diff --git a/eims/ruoyi-modules/lb-eims/pom.xml b/eims/ruoyi-modules/lb-eims/pom.xml
index e053d4f..1609192 100644
--- a/eims/ruoyi-modules/lb-eims/pom.xml
+++ b/eims/ruoyi-modules/lb-eims/pom.xml
@@ -102,5 +102,10 @@
             <artifactId>ruoyi-system</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-job</artifactId>
+        </dependency>
+
     </dependencies>
 </project>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
new file mode 100644
index 0000000..5610c22
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrderController.java
@@ -0,0 +1,106 @@
+package org.dromara.eims.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.eims.domain.vo.EimsMaintOrderVo;
+import org.dromara.eims.domain.bo.EimsMaintOrderBo;
+import org.dromara.eims.service.IEimsMaintOrderService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 淇濆吇宸ュ崟
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/maintOrder")
+public class EimsMaintOrderController extends BaseController {
+
+    private final IEimsMaintOrderService eimsMaintOrderService;
+
+    /**
+     * 鏌ヨ淇濆吇宸ュ崟鍒楄〃
+     */
+    @SaCheckPermission("eims:maintOrder:list")
+    @GetMapping("/list")
+    public TableDataInfo<EimsMaintOrderVo> list(EimsMaintOrderBo bo, PageQuery pageQuery) {
+//        return eimsMaintOrderService.queryPageList(bo, pageQuery);
+        return eimsMaintOrderService.queryPageListCustom(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭淇濆吇宸ュ崟鍒楄〃
+     */
+    @SaCheckPermission("eims:maintOrder:export")
+    @Log(title = "淇濆吇宸ュ崟", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EimsMaintOrderBo bo, HttpServletResponse response) {
+        List<EimsMaintOrderVo> list = eimsMaintOrderService.queryList(bo);
+        ExcelUtil.exportExcel(list, "淇濆吇宸ュ崟", EimsMaintOrderVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇淇濆吇宸ュ崟璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("eims:maintOrder:query")
+    @GetMapping("/{id}")
+    public R<EimsMaintOrderVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(eimsMaintOrderService.queryById(id));
+    }
+
+    /**
+     * 鏂板淇濆吇宸ュ崟
+     */
+    @SaCheckPermission("eims:maintOrder:add")
+    @Log(title = "淇濆吇宸ュ崟", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintOrderBo bo) {
+        return toAjax(eimsMaintOrderService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼淇濆吇宸ュ崟
+     */
+    @SaCheckPermission("eims:maintOrder:edit")
+    @Log(title = "淇濆吇宸ュ崟", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintOrderBo bo) {
+        return toAjax(eimsMaintOrderService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎淇濆吇宸ュ崟
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("eims:maintOrder:remove")
+    @Log(title = "淇濆吇宸ュ崟", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(eimsMaintOrderService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrditmController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrditmController.java
new file mode 100644
index 0000000..a0ecd55
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintOrditmController.java
@@ -0,0 +1,105 @@
+package org.dromara.eims.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.eims.domain.vo.EimsMaintOrditmVo;
+import org.dromara.eims.domain.bo.EimsMaintOrditmBo;
+import org.dromara.eims.service.IEimsMaintOrditmService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 宸ュ崟鏉$洰
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/maintOrditm")
+public class EimsMaintOrditmController extends BaseController {
+
+    private final IEimsMaintOrditmService eimsMaintOrditmService;
+
+    /**
+     * 鏌ヨ宸ュ崟鏉$洰鍒楄〃
+     */
+    @SaCheckPermission("eims:maintOrditm:list")
+    @GetMapping("/list")
+    public TableDataInfo<EimsMaintOrditmVo> list(EimsMaintOrditmBo bo, PageQuery pageQuery) {
+        return eimsMaintOrditmService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭宸ュ崟鏉$洰鍒楄〃
+     */
+    @SaCheckPermission("eims:maintOrditm:export")
+    @Log(title = "宸ュ崟鏉$洰", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EimsMaintOrditmBo bo, HttpServletResponse response) {
+        List<EimsMaintOrditmVo> list = eimsMaintOrditmService.queryList(bo);
+        ExcelUtil.exportExcel(list, "宸ュ崟鏉$洰", EimsMaintOrditmVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇宸ュ崟鏉$洰璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("eims:maintOrditm:query")
+    @GetMapping("/{id}")
+    public R<EimsMaintOrditmVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(eimsMaintOrditmService.queryById(id));
+    }
+
+    /**
+     * 鏂板宸ュ崟鏉$洰
+     */
+    @SaCheckPermission("eims:maintOrditm:add")
+    @Log(title = "宸ュ崟鏉$洰", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintOrditmBo bo) {
+        return toAjax(eimsMaintOrditmService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼宸ュ崟鏉$洰
+     */
+    @SaCheckPermission("eims:maintOrditm:edit")
+    @Log(title = "宸ュ崟鏉$洰", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintOrditmBo bo) {
+        return toAjax(eimsMaintOrditmService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎宸ュ崟鏉$洰
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("eims:maintOrditm:remove")
+    @Log(title = "宸ュ崟鏉$洰", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(eimsMaintOrditmService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintPlanController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintPlanController.java
new file mode 100644
index 0000000..d2005dc
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintPlanController.java
@@ -0,0 +1,106 @@
+package org.dromara.eims.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.bo.EimsMaintPlanBo;
+import org.dromara.eims.service.IEimsMaintPlanService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 淇濆吇璁″垝
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/maintPlan")
+public class EimsMaintPlanController extends BaseController {
+
+    private final IEimsMaintPlanService eimsMaintPlanService;
+
+    /**
+     * 鏌ヨ淇濆吇璁″垝鍒楄〃
+     */
+    @SaCheckPermission("eims:maintPlan:list")
+    @GetMapping("/list")
+    public TableDataInfo<EimsMaintPlanVo> list(EimsMaintPlanBo bo, PageQuery pageQuery) {
+//        return eimsMaintPlanService.queryPageList(bo, pageQuery);
+        return eimsMaintPlanService.queryPageListCustom(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭淇濆吇璁″垝鍒楄〃
+     */
+    @SaCheckPermission("eims:maintPlan:export")
+    @Log(title = "淇濆吇璁″垝", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EimsMaintPlanBo bo, HttpServletResponse response) {
+        List<EimsMaintPlanVo> list = eimsMaintPlanService.queryList(bo);
+        ExcelUtil.exportExcel(list, "淇濆吇璁″垝", EimsMaintPlanVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇淇濆吇璁″垝璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("eims:maintPlan:query")
+    @GetMapping("/{id}")
+    public R<EimsMaintPlanVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(eimsMaintPlanService.queryById(id));
+    }
+
+    /**
+     * 鏂板淇濆吇璁″垝
+     */
+    @SaCheckPermission("eims:maintPlan:add")
+    @Log(title = "淇濆吇璁″垝", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintPlanBo bo) {
+        return toAjax(eimsMaintPlanService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼淇濆吇璁″垝
+     */
+    @SaCheckPermission("eims:maintPlan:edit")
+    @Log(title = "淇濆吇璁″垝", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintPlanBo bo) {
+        return toAjax(eimsMaintPlanService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎淇濆吇璁″垝
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("eims:maintPlan:remove")
+    @Log(title = "淇濆吇璁″垝", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(eimsMaintPlanService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintStandController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintStandController.java
new file mode 100644
index 0000000..446302c
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/EimsMaintStandController.java
@@ -0,0 +1,105 @@
+package org.dromara.eims.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.eims.domain.bo.EimsMaintStandBo;
+import org.dromara.eims.service.IEimsMaintStandService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 淇濆吇鏍囧噯
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/eims/maintStand")
+public class EimsMaintStandController extends BaseController {
+
+    private final IEimsMaintStandService eimsMaintStandService;
+
+    /**
+     * 鏌ヨ淇濆吇鏍囧噯鍒楄〃
+     */
+    @SaCheckPermission("eims:maintStand:list")
+    @GetMapping("/list")
+    public TableDataInfo<EimsMaintStandVo> list(EimsMaintStandBo bo, PageQuery pageQuery) {
+        return eimsMaintStandService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 瀵煎嚭淇濆吇鏍囧噯鍒楄〃
+     */
+    @SaCheckPermission("eims:maintStand:export")
+    @Log(title = "淇濆吇鏍囧噯", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EimsMaintStandBo bo, HttpServletResponse response) {
+        List<EimsMaintStandVo> list = eimsMaintStandService.queryList(bo);
+        ExcelUtil.exportExcel(list, "淇濆吇鏍囧噯", EimsMaintStandVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇淇濆吇鏍囧噯璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("eims:maintStand:query")
+    @GetMapping("/{id}")
+    public R<EimsMaintStandVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(eimsMaintStandService.queryById(id));
+    }
+
+    /**
+     * 鏂板淇濆吇鏍囧噯
+     */
+    @SaCheckPermission("eims:maintStand:add")
+    @Log(title = "淇濆吇鏍囧噯", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EimsMaintStandBo bo) {
+        return toAjax(eimsMaintStandService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼淇濆吇鏍囧噯
+     */
+    @SaCheckPermission("eims:maintStand:edit")
+    @Log(title = "淇濆吇鏍囧噯", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EimsMaintStandBo bo) {
+        return toAjax(eimsMaintStandService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎淇濆吇鏍囧噯
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("eims:maintStand:remove")
+    @Log(title = "淇濆吇鏍囧噯", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(eimsMaintStandService.deleteWithValidByIds(List.of(ids), true));
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/GenerateCodeController.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/GenerateCodeController.java
index 9f7aac5..d267a89 100644
--- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/GenerateCodeController.java
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/controller/GenerateCodeController.java
@@ -5,6 +5,8 @@
 import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.eims.service.IEimsRepairResService;
+import org.dromara.eims.service.IGenerateCodeService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -26,6 +28,8 @@
 @RestController
 @RequestMapping("/eims/generate")
 public class GenerateCodeController {
+
+    private final IGenerateCodeService  eimsRepairResService;
     /**
      * 鏍规嵁鍓嶇紑鐢熸垚鍚勭缂栫爜
      *
@@ -35,25 +39,9 @@
     @GetMapping("/{prefix}")
     public R<String> generateCode(@NotNull(message = "绫诲瀷涓嶈兘涓虹┖")
                                       @PathVariable String prefix) {
-        String todayStr = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDate.now());
-        String key = CacheConstants.EIMS_GENERATE_CODE + ":" + prefix;
-        String code;
-        // 浣跨敤Redis鐨勫師瀛愭�ф搷浣滈伩鍏嶅苟鍙戦棶棰�
-        String oldCode = RedisUtils.getCacheObject(key);
-        if (oldCode != null && oldCode.contains(todayStr)) {
-            int no = Integer.parseInt(oldCode.substring(oldCode.length() - 4));
-            code = String.format("%s%s%04d", prefix, todayStr, no + 1);
-        } else {
-            code = String.format("%s%s%04d", prefix, todayStr, 1);
-        }
-        // 鏇存柊缂撳瓨
-        try {
-            RedisUtils.setCacheObject(key, code);
-        } catch (Exception e) {
-            return R.fail("鐢熸垚缂栫爜澶辫触锛岃绋嶅悗閲嶈瘯锛�");
-        }
 
-        return R.ok("鐢熸垚鎴愬姛锛�", code);
+        String code = eimsRepairResService.generateCode(prefix);
+        return code == null ? R.fail("鐢熸垚澶辫触锛�") :R.ok("鐢熸垚鎴愬姛锛�", code);
 
     }
 }
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrder.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrder.java
new file mode 100644
index 0000000..6811b22
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrder.java
@@ -0,0 +1,109 @@
+package org.dromara.eims.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 淇濆吇宸ュ崟瀵硅薄 eims_maint_order
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_maint_order")
+public class EimsMaintOrder extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     *
+     */
+    private Long equId;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    private String maintType;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡
+     */
+    private Long maintCycle;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    private String maintCycleUnit;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�- 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    private String maintRule;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇浜�
+     */
+    private Long maintUser;
+
+    /**
+     * 楠岃瘉浜�
+     */
+    private Long verifyUser;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬
+     */
+    private Long maintDept;
+
+    /**
+     * 淇濆吇鍗曞彿
+     */
+    private String maintCode;
+
+    /**
+     *
+     */
+    private String status;
+
+    /**
+     * 淇濆吇璁″垝鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planTime;
+
+    /**
+     * 淇濆吇寮�濮嬫椂闂�
+     */
+    private Date startTime;
+
+    /**
+     * 淇濆吇缁撴潫鏃堕棿
+     */
+    private Date endTime;
+
+    /**
+     * 璁″垝id
+     */
+    private Long planId;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrditm.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrditm.java
new file mode 100644
index 0000000..45bd507
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintOrditm.java
@@ -0,0 +1,73 @@
+package org.dromara.eims.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 宸ュ崟鏉$洰瀵硅薄 eims_maint_orditm
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_maint_orditm")
+public class EimsMaintOrditm extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 宸ュ崟id
+     */
+    private Long orderId;
+
+    /**
+     * 璁惧id
+     */
+    private Long equId;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    private String itmName;
+
+    /**
+     * 淇濆吇椤圭洰鎿嶄綔鏍囧噯
+     */
+    private String itmAction;
+
+    /**
+     * 淇濆吇鎿嶄綔鐢ㄦ埛
+     */
+    private Long itmUser;
+
+    /**
+     * 淇濆吇鏃堕棿
+     */
+    private Date itmTime;
+
+    /**
+     * 瀹屾垚鐘舵�侊紙瀛楀吀锛�
+     */
+    private String status;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
new file mode 100644
index 0000000..8177bcb
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintPlan.java
@@ -0,0 +1,106 @@
+package org.dromara.eims.domain;
+
+import jakarta.validation.constraints.NotNull;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 淇濆吇璁″垝瀵硅薄 eims_maint_plan
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_maint_plan")
+public class EimsMaintPlan extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 璁惧id
+
+     */
+    private Long equId;
+
+    /**
+     * 淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    private String maintType;
+
+    /**
+     * 淇濆吇鍛ㄦ湡
+     */
+    private Long maintCycle;
+
+    /**
+     * 淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    private String maintCycleUnit;
+
+    /**
+     * 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    private String maintRule;
+
+    /**
+     * 淇濆吇浜�
+     */
+    private Long maintUser;
+
+    /**
+     * 淇濆吇閮ㄩ棬
+     */
+    private Long maintDept;
+
+    /**
+     * 鐘舵�侊紙瀛楀吀锛� 0-鍚敤  1-绂佺敤
+     */
+    private String status;
+
+    /**
+     * 棣栨鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintFirstTime;
+
+    /**
+     * 涓婃鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintLastTime;
+
+    /**
+     * 涓嬫鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintNextTime;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 涓婃鐢熸垚宸ュ崟鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastGenerateDate;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintStand.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintStand.java
new file mode 100644
index 0000000..d4b9754
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/EimsMaintStand.java
@@ -0,0 +1,77 @@
+package org.dromara.eims.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 淇濆吇鏍囧噯瀵硅薄 eims_maint_stand
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("eims_maint_stand")
+public class EimsMaintStand extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 璁惧id
+     */
+    private Long equId;
+
+    /**
+     * 璁惧缂栫爜
+     */
+    private String equCode;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private Long equTypeId;
+
+    /**
+     * 璧勪骇缂栧彿
+     */
+    private String assetNo;
+
+    /**
+     * 璁惧鍚嶇О
+
+     */
+    private String equName;
+
+    /**
+     * 璁惧鍨嬪彿
+     */
+    private String modelNo;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 淇濆吇椤圭洰鏍囧噯
+     */
+    private String stand;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderBo.java
new file mode 100644
index 0000000..e90b9dd
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrderBo.java
@@ -0,0 +1,118 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsMaintOrder;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 淇濆吇宸ュ崟涓氬姟瀵硅薄 eims_maint_order
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsMaintOrder.class, reverseConvertGenerate = false)
+public class EimsMaintOrderBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "id涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     *
+     */
+    @NotNull(message = "璁惧id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long equId;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    private String maintType;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡
+     */
+    private Long maintCycle;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    private String maintCycleUnit;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�- 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    private String maintRule;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇浜�
+     */
+    @NotNull(message = "璁″垝琛ㄥ啑浣�-淇濆吇浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long maintUser;
+
+    /**
+     * 楠岃瘉浜�
+     */
+    private Long verifyUser;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬
+     */
+    @NotNull(message = "璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long maintDept;
+
+    /**
+     * 淇濆吇鍗曞彿
+     */
+    @NotBlank(message = "淇濆吇鍗曞彿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String maintCode;
+
+    /**
+     *
+     */
+    @NotBlank(message = "鐘舵�佷笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 淇濆吇璁″垝鏃堕棿
+     */
+    @NotNull(message = "淇濆吇璁″垝鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planTime;
+
+    /**
+     * 淇濆吇寮�濮嬫椂闂�
+     */
+    private Date startTime;
+
+    /**
+     * 淇濆吇缁撴潫鏃堕棿
+     */
+    private Date endTime;
+
+    /**
+     * 璁″垝id
+     */
+    private Long planId;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+    // 鍏宠仈琛ㄥ瓧娈�
+    private String equName;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrditmBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrditmBo.java
new file mode 100644
index 0000000..560d523
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintOrditmBo.java
@@ -0,0 +1,76 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsMaintOrditm;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 宸ュ崟鏉$洰涓氬姟瀵硅薄 eims_maint_orditm
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsMaintOrditm.class, reverseConvertGenerate = false)
+public class EimsMaintOrditmBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 宸ュ崟id
+     */
+    @NotNull(message = "宸ュ崟id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long orderId;
+
+    /**
+     * 璁惧id
+     */
+    @NotNull(message = "璁惧id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long equId;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    @NotBlank(message = "淇濆吇椤圭洰鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String itmName;
+
+    /**
+     * 淇濆吇椤圭洰鎿嶄綔鏍囧噯
+     */
+    private String itmAction;
+
+    /**
+     * 淇濆吇鎿嶄綔鐢ㄦ埛
+     */
+    @NotNull(message = "淇濆吇鎿嶄綔鐢ㄦ埛涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long itmUser;
+
+    /**
+     * 淇濆吇鏃堕棿
+     */
+    private Date itmTime;
+
+    /**
+     * 瀹屾垚鐘舵�侊紙瀛楀吀锛�
+     */
+    private String status;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
new file mode 100644
index 0000000..97705cd
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java
@@ -0,0 +1,115 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsMaintPlan;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 淇濆吇璁″垝涓氬姟瀵硅薄 eims_maint_plan
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsMaintPlan.class, reverseConvertGenerate = false)
+public class EimsMaintPlanBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 璁惧id
+
+     */
+    @NotNull(message = "璁惧id 涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long equId;
+
+    /**
+     * 淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    @NotBlank(message = "淇濆吇绫诲瀷锛堝瓧鍏革級涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String maintType;
+
+    /**
+     * 淇濆吇鍛ㄦ湡
+     */
+    @NotNull(message = "淇濆吇鍛ㄦ湡涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long maintCycle;
+
+    /**
+     * 淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    @NotBlank(message = "淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String maintCycleUnit;
+
+    /**
+     * 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    @NotBlank(message = "淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂翠笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private String maintRule;
+
+    /**
+     * 淇濆吇浜�
+     */
+    @NotNull(message = "淇濆吇浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class })
+    private Long maintUser;
+
+    /**
+     * 淇濆吇閮ㄩ棬
+     */
+    @NotNull(message = "淇濆吇閮ㄩ棬涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long maintDept;
+
+    /**
+     * 鐘舵�侊紙瀛楀吀锛� 0-鍚敤  1-绂佺敤
+     */
+    @NotNull(message = "鐘舵�侊紙瀛楀吀锛� 0-鍚敤  1-绂佺敤涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 棣栨鎵ц鏃堕棿
+     */
+    @NotNull(message = "淇濆吇璁″垝棣栨鎵ц鏃堕棿涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintFirstTime;
+
+    /**
+     * 涓婃鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintLastTime;
+
+    /**
+     * 涓嬫鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintNextTime;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+    /**
+     * 涓婃鐢熸垚宸ュ崟鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastGenerateDate;
+
+    // 鍏宠仈琛ㄥ瓧娈�
+    private String equName;
+    private String assetNo;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintStandBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintStandBo.java
new file mode 100644
index 0000000..1240e32
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintStandBo.java
@@ -0,0 +1,78 @@
+package org.dromara.eims.domain.bo;
+
+import org.dromara.eims.domain.EimsMaintStand;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 淇濆吇鏍囧噯涓氬姟瀵硅薄 eims_maint_stand
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EimsMaintStand.class, reverseConvertGenerate = false)
+public class EimsMaintStandBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    @NotNull(message = "涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 璁惧id
+     */
+    @NotNull(message = "璁惧id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private Long equId;
+
+    /**
+     * 璁惧缂栫爜
+     */
+    private String equCode;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    private Long equTypeId;
+
+    /**
+     * 璧勪骇缂栧彿
+     */
+    private String assetNo;
+
+    /**
+     * 璁惧鍚嶇О
+
+     */
+    private String equName;
+
+    /**
+     * 璁惧鍨嬪彿
+     */
+    private String modelNo;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 淇濆吇椤圭洰鏍囧噯
+     */
+    private String stand;
+
+    /**
+     * 澶囨敞
+     */
+    @NotBlank(message = "澶囨敞涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderVo.java
new file mode 100644
index 0000000..e4b457a
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrderVo.java
@@ -0,0 +1,149 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsMaintOrder;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 淇濆吇宸ュ崟瑙嗗浘瀵硅薄 eims_maint_order
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsMaintOrder.class)
+public class EimsMaintOrderVo extends BaseEntity implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long equId;
+
+    @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
+    private String equName;
+
+    /**
+     * 璁惧璧勪骇缂栧彿
+     */
+    private String assetNo;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�-淇濆吇绫诲瀷", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "瀛�=鍏�")
+    private String maintType;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡")
+    private Long maintCycle;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�-淇濆吇鍛ㄦ湡鍗曚綅", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "瀛�=鍏�")
+    private String maintCycleUnit;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�- 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�- 淇濆吇瑙勫垯", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "瀛�=鍏�")
+    private String maintRule;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇浜�
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�-淇濆吇浜�")
+    private Long maintUser;
+
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "maintUser")
+    private String maintUserName;
+
+    /**
+     * 楠岃瘉浜�
+     */
+    private Long verifyUser;
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "verifyUser")
+    private String verifyUserName;
+
+    /**
+     * 璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬
+     */
+    @ExcelProperty(value = "璁″垝琛ㄥ啑浣�-淇濆吇閮ㄩ棬")
+    private Long maintDept;
+
+    /**
+     * 淇濆吇鍗曞彿
+     */
+    @ExcelProperty(value = "淇濆吇鍗曞彿")
+    private String maintCode;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private String status;
+
+    /**
+     * 淇濆吇璁″垝鏃堕棿
+     */
+    @ExcelProperty(value = "淇濆吇璁″垝鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planTime;
+
+    /**
+     * 淇濆吇寮�濮嬫椂闂�
+     */
+    @ExcelProperty(value = "淇濆吇寮�濮嬫椂闂�")
+    private Date startTime;
+
+    /**
+     * 淇濆吇缁撴潫鏃堕棿
+     */
+    @ExcelProperty(value = "淇濆吇缁撴潫鏃堕棿")
+    private Date endTime;
+
+    /**
+     * 璁″垝id
+     */
+    @ExcelProperty(value = "璁″垝id")
+    private Long planId;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrditmVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrditmVo.java
new file mode 100644
index 0000000..98e9d37
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintOrditmVo.java
@@ -0,0 +1,100 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsMaintOrditm;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 宸ュ崟鏉$洰瑙嗗浘瀵硅薄 eims_maint_orditm
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsMaintOrditm.class)
+public class EimsMaintOrditmVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 宸ュ崟id
+     */
+    @ExcelProperty(value = "宸ュ崟id")
+    private Long orderId;
+
+    @Translation(type = TransConstant.MAINT_ORDER_ID_TO_CODE, mapper = "orderId")
+    private String orderName;
+
+    /**
+     * 璁惧id
+     */
+    @ExcelProperty(value = "璁惧id")
+    private Long equId;
+
+    @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
+    private String equName;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    @ExcelProperty(value = "淇濆吇椤圭洰鍚嶇О")
+    private String itmName;
+
+    /**
+     * 淇濆吇椤圭洰鎿嶄綔鏍囧噯
+     */
+    @ExcelProperty(value = "淇濆吇椤圭洰鎿嶄綔鏍囧噯")
+    private String itmAction;
+
+    /**
+     * 淇濆吇鎿嶄綔鐢ㄦ埛
+     */
+    @ExcelProperty(value = "淇濆吇鎿嶄綔鐢ㄦ埛")
+    private Long itmUser;
+
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "itmUser")
+    private String itmUserName;
+
+    /**
+     * 淇濆吇鏃堕棿
+     */
+    @ExcelProperty(value = "淇濆吇鏃堕棿")
+    private Date itmTime;
+
+    /**
+     * 瀹屾垚鐘舵�侊紙瀛楀吀锛�
+     */
+    @ExcelProperty(value = "瀹屾垚鐘舵��", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "eims_orditm_status")
+    private String status;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
new file mode 100644
index 0000000..618029e
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintPlanVo.java
@@ -0,0 +1,150 @@
+package org.dromara.eims.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.NotNull;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.eims.domain.EimsMaintPlan;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 淇濆吇璁″垝瑙嗗浘瀵硅薄 eims_maint_plan
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsMaintPlan.class)
+public class EimsMaintPlanVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 璁惧id
+
+     */
+    @ExcelProperty(value = "璁惧id")
+    private Long equId;
+
+    /**
+     * 璁惧鍚嶇О
+     */
+    @Translation(type = TransConstant.EQU_ID_TO_NAME, mapper = "equId")
+    private String equName;
+
+    /**
+     * 璁惧璧勪骇缂栧彿
+     */
+    private String assetNo;
+
+    /**
+     * 淇濆吇绫诲瀷锛堝瓧鍏革級
+     */
+    @ExcelProperty(value = "淇濆吇绫诲瀷", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "eims_maint_type")
+    private String maintType;
+
+    /**
+     * 淇濆吇鍛ㄦ湡
+     */
+    @ExcelProperty(value = "淇濆吇鍛ㄦ湡")
+    private Long maintCycle;
+
+    /**
+     * 淇濆吇鍛ㄦ湡鍗曚綅锛堝瓧鍏革級
+     */
+    @ExcelProperty(value = "淇濆吇鍛ㄦ湡鍗曚綅", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "maint_cycle_unit")
+    private String maintCycleUnit;
+
+    /**
+     * 瀛楁鎷兼帴 maintCycle + maintCycleUnit鐨刣ictLabel
+     */
+    private String maintCycleUnitName;
+
+    /**
+     * 淇濆吇瑙勫垯锛堝瓧鍏革級淇濆吇鏃堕棿璁$畻锛�1-鎸夊懆鏈�  2-鎸変笂娆′繚鍏绘椂闂�
+     */
+    @ExcelProperty(value = "淇濆吇瑙勫垯", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "maint_time_rule")
+    private String maintRule;
+
+    /**
+     * 淇濆吇浜�
+     */
+    @ExcelProperty(value = "淇濆吇浜�")
+    private Long maintUser;
+
+    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "maintUser")
+    private String maintUserName;
+
+    /**
+     * 淇濆吇閮ㄩ棬
+     */
+    @ExcelProperty(value = "淇濆吇閮ㄩ棬")
+    private Long maintDept;
+
+    private String maintDeptName;
+
+    /**
+     * 鐘舵�侊紙瀛楀吀锛� 0-鍚敤  1-绂佺敤
+     */
+    @ExcelProperty(value = "鐘舵��", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_normal_disable")
+    private String status;
+
+    /**
+     * 棣栨鎵ц鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintFirstTime;
+
+    /**
+     * 涓婃鎵ц鏃堕棿
+     */
+    @ExcelProperty(value = "涓婃鎵ц鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintLastTime;
+
+    /**
+     * 涓嬫鎵ц鏃堕棿
+     */
+    @ExcelProperty(value = "涓嬫鎵ц鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date maintNextTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+    /**
+     * 涓婃鐢熸垚宸ュ崟鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date lastGenerateDate;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStandVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStandVo.java
new file mode 100644
index 0000000..2247397
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStandVo.java
@@ -0,0 +1,93 @@
+package org.dromara.eims.domain.vo;
+
+import org.dromara.eims.domain.EimsMaintStand;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 淇濆吇鏍囧噯瑙嗗浘瀵硅薄 eims_maint_stand
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EimsMaintStand.class)
+public class EimsMaintStandVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 璁惧id
+     */
+    @ExcelProperty(value = "璁惧id")
+    private Long equId;
+
+    /**
+     * 璁惧缂栫爜
+     */
+    @ExcelProperty(value = "璁惧缂栫爜")
+    private String equCode;
+
+    /**
+     * 璁惧绫诲瀷
+     */
+    @ExcelProperty(value = "璁惧绫诲瀷")
+    private Long equTypeId;
+
+    /**
+     * 璧勪骇缂栧彿
+     */
+    @ExcelProperty(value = "璧勪骇缂栧彿")
+    private String assetNo;
+
+    /**
+     * 璁惧鍚嶇О
+
+     */
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String equName;
+
+    /**
+     * 璁惧鍨嬪彿
+     */
+    @ExcelProperty(value = "璁惧鍨嬪彿")
+    private String modelNo;
+
+    /**
+     * 淇濆吇椤圭洰鍚嶇О
+     */
+    @ExcelProperty(value = "淇濆吇椤圭洰鍚嶇О")
+    private String name;
+
+    /**
+     * 淇濆吇椤圭洰鏍囧噯
+     */
+    @ExcelProperty(value = "淇濆吇椤圭洰鏍囧噯")
+    private String stand;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
new file mode 100644
index 0000000..1058f6d
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java
@@ -0,0 +1,142 @@
+package org.dromara.eims.job;
+
+import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
+import com.aizuda.snailjob.client.job.core.dto.JobArgs;
+import com.aizuda.snailjob.client.model.ExecuteResult;
+import com.aizuda.snailjob.common.core.util.JsonUtil;
+import com.aizuda.snailjob.common.log.SnailJobLog;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.eims.domain.*;
+import org.dromara.eims.domain.bo.EimsMaintPlanBo;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.eims.mapper.EimsMaintOrderMapper;
+import org.dromara.eims.mapper.EimsMaintOrditmMapper;
+import org.dromara.eims.mapper.EimsMaintPlanMapper;
+import org.dromara.eims.mapper.EimsMaintStandMapper;
+import org.dromara.eims.service.IEimsMaintOrderService;
+import org.dromara.eims.service.IEimsMaintPlanService;
+import org.dromara.eims.service.IGenerateCodeService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@RequiredArgsConstructor
+@JobExecutor(name = "maintPlanToOrderJob")
+public class MaintPlanToOrderJob {
+    private final EimsMaintOrderMapper orderMapper;
+
+    private final EimsMaintStandMapper standMapper;
+
+    private final EimsMaintOrditmMapper orditmMapper;
+
+    private final EimsMaintPlanMapper planMapper;
+
+    private final IGenerateCodeService codeService;
+
+
+    @SneakyThrows
+    @Transactional(rollbackFor = Exception.class)
+    public ExecuteResult jobExecute(JobArgs jobArgs) {
+        // 鑾峰彇浠婂ぉ鏃ユ湡
+
+        Date today = new Date();
+        LambdaQueryWrapper<EimsMaintPlan> planBoQueryWrapper = Wrappers.lambdaQuery();
+        // 鏌ヨ鍚敤鐨勪繚鍏昏鍒�
+        planBoQueryWrapper.eq(EimsMaintPlan::getStatus, DictConstants.SYS_NORMAL_DISABLE_DETAIL.NORMAL);
+        // 杩囨护娌℃湁棣栨杩愯鏃堕棿
+        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintFirstTime);
+        // 杩囨护娌℃湁涓嬫杩愯鏃堕棿
+        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintNextTime);
+        // 杩囨护娌℃湁淇濆吇鍛ㄦ湡鐨勬暟鎹�
+        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintCycle);
+        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintCycleUnit);
+        planBoQueryWrapper.isNotNull(EimsMaintPlan::getMaintRule);
+
+        List<EimsMaintPlanVo> planVoList = planMapper.selectVoList(planBoQueryWrapper);
+        for (int i = 0; i < planVoList.size(); i++) {
+            EimsMaintPlanVo planVo = planVoList.get(i);
+            // 淇濆吇璁″垝add鐨勬椂鍊欎細鑷姩鐢熸垚涓嬫杩愯鏃堕棿
+            Date createOrderTime = planVo.getMaintNextTime();
+            int day = DateUtils.differentDays(today,createOrderTime );
+            // 濡傛灉璁″垝鐢熸垚宸ュ崟鏃ユ湡澶т簬浠婂ぉ鍒欎笉鐢熸垚宸ュ崟
+            if (day >= 1) {
+                continue;
+            }
+
+            // 璁$畻鐢熸垚宸ュ崟鏃堕棿
+            Long maintCycle = planVo.getMaintCycle();
+            String maintRule = planVo.getMaintRule();
+            Date firstTime = planVo.getMaintFirstTime();
+            Date lastTime = planVo.getMaintLastTime();
+            Date nextTime = null;
+            String maintCycleUnit = planVo.getMaintCycleUnit();
+            switch (maintCycleUnit) {
+                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.DAY:
+                    break;
+                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.WEEK:
+                    maintCycle *= 7;
+                    break;
+                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.MONTH:
+                    maintCycle *= 30;
+                    break;
+                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.SEASON:
+                    maintCycle *= 90;
+                    break;
+                case DictConstants.MAINT_CYCLE_UNIT_DETAIL.YEAR:
+                    maintCycle *= 365;
+                    break;
+            }
+            // 棣栨
+            if (lastTime == null ) {
+                nextTime = DateUtils.addDays(createOrderTime, maintCycle.intValue());
+            } else {
+                nextTime = DateUtils.addDays(lastTime, maintCycle.intValue());
+            }
+            EimsMaintOrder order = new EimsMaintOrder();
+            BeanUtils.copyProperties(planVo, order);
+            order.setId(null);
+            order.setStatus(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIBAOYANG);
+            order.setPlanTime(createOrderTime);
+            order.setMaintCode(codeService.generateCode("BYZD"));
+            EimsMaintPlan plan = MapstructUtils.convert(planVo, EimsMaintPlan.class);
+            assert plan != null;
+            plan.setLastGenerateDate(new Date());
+            plan.setMaintLastTime(createOrderTime);
+            plan.setMaintNextTime(nextTime);
+            boolean flag  = orderMapper.insert(order) > 0;
+            //TODO 鐢熸垚澶辫触锛屾坊鍔犲紓甯歌褰�
+            if (!flag) continue;
+            planMapper.updateById(plan);
+
+            //鐢熸垚淇濆吇鏄庣粏
+            Long equId = plan.getEquId();
+            List<EimsMaintStandVo> standList = standMapper.selectVoList(new LambdaQueryWrapper<EimsMaintStand>().eq(EimsMaintStand::getEquId, equId));
+            //TODO 娌℃湁淇濆吇椤癸紝娣诲姞寮傚父璁板綍
+            if(standList.isEmpty()) continue;
+            for (int j = 0; j < standList.size(); j++) {
+                EimsMaintStandVo stand = standList.get(j);
+                EimsMaintOrditm itm = new EimsMaintOrditm();
+                itm.setOrderId(order.getId());
+                itm.setEquId(equId);
+                itm.setItmName(stand.getName());
+                itm.setItmAction(stand.getStand());
+                itm.setItmUser(order.getMaintUser());
+                orditmMapper.insert(itm);
+            }
+        }
+        return ExecuteResult.success("淇濆吇璁″垝鐢熸垚淇濆吇宸ュ崟鎴愬姛");
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
new file mode 100644
index 0000000..caa3aab
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrderMapper.java
@@ -0,0 +1,22 @@
+package org.dromara.eims.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.eims.domain.EimsMaintOrder;
+import org.dromara.eims.domain.EimsMaintPlan;
+import org.dromara.eims.domain.vo.EimsMaintOrderVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+
+/**
+ * 淇濆吇宸ュ崟Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+public interface EimsMaintOrderMapper extends BaseMapperPlus<EimsMaintOrder, EimsMaintOrderVo> {
+    Page<EimsMaintOrderVo> selectMaintOrderList(@Param("page") Page<EimsMaintOrderVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintOrder> queryWrapper);
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrditmMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrditmMapper.java
new file mode 100644
index 0000000..57b4cef
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintOrditmMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.eims.mapper;
+
+import org.dromara.eims.domain.EimsMaintOrditm;
+import org.dromara.eims.domain.vo.EimsMaintOrditmVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 宸ュ崟鏉$洰Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+public interface EimsMaintOrditmMapper extends BaseMapperPlus<EimsMaintOrditm, EimsMaintOrditmVo> {
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java
new file mode 100644
index 0000000..63d5e4d
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintPlanMapper.java
@@ -0,0 +1,22 @@
+package org.dromara.eims.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.eims.domain.EimsMaintPlan;
+import org.dromara.eims.domain.EimsRepairReq;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.eims.domain.vo.EimsRepairReqVo;
+
+/**
+ * 淇濆吇璁″垝Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+public interface EimsMaintPlanMapper extends BaseMapperPlus<EimsMaintPlan, EimsMaintPlanVo> {
+    Page<EimsMaintPlanVo> selectMaintPlanList(@Param("page") Page<EimsMaintPlanVo> page, @Param(Constants.WRAPPER) Wrapper<EimsMaintPlan> queryWrapper);
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintStandMapper.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintStandMapper.java
new file mode 100644
index 0000000..f98e5be
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/mapper/EimsMaintStandMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.eims.mapper;
+
+import org.dromara.eims.domain.EimsMaintStand;
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 淇濆吇鏍囧噯Mapper鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+public interface EimsMaintStandMapper extends BaseMapperPlus<EimsMaintStand, EimsMaintStandVo> {
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
new file mode 100644
index 0000000..8894366
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrderService.java
@@ -0,0 +1,77 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsMaintOrderVo;
+import org.dromara.eims.domain.bo.EimsMaintOrderBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 淇濆吇宸ュ崟Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+public interface IEimsMaintOrderService {
+
+    /**
+     * 鏌ヨ淇濆吇宸ュ崟
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇宸ュ崟
+     */
+    EimsMaintOrderVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇宸ュ崟鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇宸ュ崟鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintOrderVo> queryPageList(EimsMaintOrderBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏诲伐鍗曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇宸ュ崟鍒楄〃
+     */
+    List<EimsMaintOrderVo> queryList(EimsMaintOrderBo bo);
+
+    /**
+     * 鏂板淇濆吇宸ュ崟
+     *
+     * @param bo 淇濆吇宸ュ崟
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(EimsMaintOrderBo bo);
+
+    /**
+     * 淇敼淇濆吇宸ュ崟
+     *
+     * @param bo 淇濆吇宸ュ崟
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(EimsMaintOrderBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏诲伐鍗曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇宸ュ崟鍒楄〃-澶氳〃鏌ヨ
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇宸ュ崟鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintOrderVo> queryPageListCustom(EimsMaintOrderBo bo, PageQuery pageQuery);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrditmService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrditmService.java
new file mode 100644
index 0000000..862cbd0
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintOrditmService.java
@@ -0,0 +1,68 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsMaintOrditmVo;
+import org.dromara.eims.domain.bo.EimsMaintOrditmBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 宸ュ崟鏉$洰Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+public interface IEimsMaintOrditmService {
+
+    /**
+     * 鏌ヨ宸ュ崟鏉$洰
+     *
+     * @param id 涓婚敭
+     * @return 宸ュ崟鏉$洰
+     */
+    EimsMaintOrditmVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ宸ュ崟鏉$洰鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 宸ュ崟鏉$洰鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintOrditmVo> queryPageList(EimsMaintOrditmBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫伐鍗曟潯鐩垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 宸ュ崟鏉$洰鍒楄〃
+     */
+    List<EimsMaintOrditmVo> queryList(EimsMaintOrditmBo bo);
+
+    /**
+     * 鏂板宸ュ崟鏉$洰
+     *
+     * @param bo 宸ュ崟鏉$洰
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(EimsMaintOrditmBo bo);
+
+    /**
+     * 淇敼宸ュ崟鏉$洰
+     *
+     * @param bo 宸ュ崟鏉$洰
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(EimsMaintOrditmBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ伐鍗曟潯鐩俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintPlanService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintPlanService.java
new file mode 100644
index 0000000..e7b98ce
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintPlanService.java
@@ -0,0 +1,77 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.bo.EimsMaintPlanBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 淇濆吇璁″垝Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+public interface IEimsMaintPlanService {
+
+    /**
+     * 鏌ヨ淇濆吇璁″垝
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇璁″垝
+     */
+    EimsMaintPlanVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇璁″垝鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇璁″垝鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintPlanVo> queryPageList(EimsMaintPlanBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏昏鍒掑垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇璁″垝鍒楄〃
+     */
+    List<EimsMaintPlanVo> queryList(EimsMaintPlanBo bo);
+
+    /**
+     * 鏂板淇濆吇璁″垝
+     *
+     * @param bo 淇濆吇璁″垝
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(EimsMaintPlanBo bo);
+
+    /**
+     * 淇敼淇濆吇璁″垝
+     *
+     * @param bo 淇濆吇璁″垝
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(EimsMaintPlanBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏昏鍒掍俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇璁″垝鍒楄〃-澶氳〃鏌ヨ
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇璁″垝鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintPlanVo> queryPageListCustom(EimsMaintPlanBo bo, PageQuery pageQuery);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintStandService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintStandService.java
new file mode 100644
index 0000000..536958d
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IEimsMaintStandService.java
@@ -0,0 +1,68 @@
+package org.dromara.eims.service;
+
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.eims.domain.bo.EimsMaintStandBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 淇濆吇鏍囧噯Service鎺ュ彛
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+public interface IEimsMaintStandService {
+
+    /**
+     * 鏌ヨ淇濆吇鏍囧噯
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇鏍囧噯
+     */
+    EimsMaintStandVo queryById(Long id);
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇鏍囧噯鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇鏍囧噯鍒嗛〉鍒楄〃
+     */
+    TableDataInfo<EimsMaintStandVo> queryPageList(EimsMaintStandBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏绘爣鍑嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇鏍囧噯鍒楄〃
+     */
+    List<EimsMaintStandVo> queryList(EimsMaintStandBo bo);
+
+    /**
+     * 鏂板淇濆吇鏍囧噯
+     *
+     * @param bo 淇濆吇鏍囧噯
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    Boolean insertByBo(EimsMaintStandBo bo);
+
+    /**
+     * 淇敼淇濆吇鏍囧噯
+     *
+     * @param bo 淇濆吇鏍囧噯
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    Boolean updateByBo(EimsMaintStandBo bo);
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏绘爣鍑嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IGenerateCodeService.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IGenerateCodeService.java
new file mode 100644
index 0000000..15f9030
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/IGenerateCodeService.java
@@ -0,0 +1,5 @@
+package org.dromara.eims.service;
+
+public interface IGenerateCodeService {
+   String generateCode(String prefix);
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
new file mode 100644
index 0000000..988fc92
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrderServiceImpl.java
@@ -0,0 +1,253 @@
+package org.dromara.eims.service.impl;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.SneakyThrows;
+import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.service.MaintOrderService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.eims.domain.EimsMaintOrditm;
+import org.dromara.eims.domain.EimsMaintStand;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.eims.domain.vo.EimsRepairResVo;
+import org.dromara.eims.mapper.EimsMaintOrditmMapper;
+import org.dromara.eims.mapper.EimsMaintStandMapper;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsMaintOrderBo;
+import org.dromara.eims.domain.vo.EimsMaintOrderVo;
+import org.dromara.eims.domain.EimsMaintOrder;
+import org.dromara.eims.mapper.EimsMaintOrderMapper;
+import org.dromara.eims.service.IEimsMaintOrderService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 淇濆吇宸ュ崟Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-03-06
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsMaintOrderServiceImpl implements IEimsMaintOrderService, MaintOrderService {
+
+    private final EimsMaintOrderMapper baseMapper;
+    private final EimsMaintOrditmMapper orditmMapper;
+    private final SysDeptMapper sysDeptMapper;
+
+    private final EimsMaintStandMapper standMapper;
+    /**
+     * 鏌ヨ淇濆吇宸ュ崟
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇宸ュ崟
+     */
+    @Override
+    public EimsMaintOrderVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇宸ュ崟鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇宸ュ崟鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<EimsMaintOrderVo> queryPageList(EimsMaintOrderBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EimsMaintOrder> lqw = buildQueryWrapper(bo);
+        Page<EimsMaintOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public TableDataInfo<EimsMaintOrderVo> queryPageListCustom(EimsMaintOrderBo bo, PageQuery pageQuery) {
+        Page<EimsMaintOrderVo> page = baseMapper.selectMaintOrderList(pageQuery.build(), buildWrapper(bo));
+        return TableDataInfo.build(page);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏诲伐鍗曞垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇宸ュ崟鍒楄〃
+     */
+    @Override
+    public List<EimsMaintOrderVo> queryList(EimsMaintOrderBo bo) {
+        LambdaQueryWrapper<EimsMaintOrder> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+    private QueryWrapper<EimsMaintOrder> buildWrapper(EimsMaintOrderBo bo) {
+        Map<String, Object> params = bo.getParams();
+        QueryWrapper<EimsMaintOrder> qw =  Wrappers.query();
+        qw.like(StringUtils.isNotBlank(bo.getMaintCode()),"mo.maint_code", bo.getMaintCode());
+        qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mo.maint_type", bo.getMaintType());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mo.maint_cycle_unit", bo.getMaintCycleUnit());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mo.maint_rule", bo.getMaintRule());
+        qw.eq(bo.getMaintUser() != null, "mo.maint_user", bo.getMaintUser());
+        qw.in(bo.getMaintDept() != null, "mo.maint_dept", getAllDescendantIds(bo.getMaintDept()));
+        qw.eq(bo.getStatus() != null, "mo.status", bo.getStatus());
+        qw.orderByDesc("mo.create_time");
+        return qw;
+    }
+
+    /**
+     * 鏍规嵁id锛岃幏鍙栨墍鏈夊悗浠d
+     *
+     * @param rootId
+     * @return
+     */
+    public List<Long> getAllDescendantIds(Long rootId) {
+        List<Long> result = new ArrayList<>();
+        result.add(rootId);
+        collectDescendants(rootId, result);
+        return result;
+    }
+
+    private void collectDescendants(Long currentId, List<Long> collector) {
+        QueryWrapper<SysDept> sysDeptWrapper = new QueryWrapper<>();
+        sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId);
+
+        List<SysDeptVo> children = sysDeptMapper.selectVoList(sysDeptWrapper);
+        if (children != null && !children.isEmpty()) {
+            for (SysDeptVo child : children) {
+                Long childId = child.getDeptId();
+                collector.add(childId);
+                collectDescendants(childId, collector);
+            }
+        }
+    }
+
+    private LambdaQueryWrapper<EimsMaintOrder> buildQueryWrapper(EimsMaintOrderBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EimsMaintOrder> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getEquId() != null, EimsMaintOrder::getEquId, bo.getEquId());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintType()), EimsMaintOrder::getMaintType, bo.getMaintType());
+        lqw.eq(bo.getMaintCycle() != null, EimsMaintOrder::getMaintCycle, bo.getMaintCycle());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), EimsMaintOrder::getMaintCycleUnit, bo.getMaintCycleUnit());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintRule()), EimsMaintOrder::getMaintRule, bo.getMaintRule());
+        lqw.eq(bo.getMaintUser() != null, EimsMaintOrder::getMaintUser, bo.getMaintUser());
+        lqw.eq(bo.getMaintDept() != null, EimsMaintOrder::getMaintDept, bo.getMaintDept());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintCode()), EimsMaintOrder::getMaintCode, bo.getMaintCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsMaintOrder::getStatus, bo.getStatus());
+        lqw.eq(bo.getPlanTime() != null, EimsMaintOrder::getPlanTime, bo.getPlanTime());
+        lqw.eq(bo.getPlanId() != null, EimsMaintOrder::getPlanId, bo.getPlanId());
+        return lqw;
+    }
+
+    /**
+     * 鏂板淇濆吇宸ュ崟
+     *
+     * @param bo 淇濆吇宸ュ崟
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(EimsMaintOrderBo bo) {
+        EimsMaintOrder add = MapstructUtils.convert(bo, EimsMaintOrder.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+
+            //鐢熸垚淇濆吇鏄庣粏
+            Long equId = bo.getEquId();
+            List<EimsMaintStandVo> standList = standMapper.selectVoList(new LambdaQueryWrapper<EimsMaintStand>().eq(EimsMaintStand::getEquId, equId));
+            //TODO 娌℃湁淇濆吇椤癸紝娣诲姞寮傚父璁板綍
+            for (int j = 0; j < standList.size(); j++) {
+                EimsMaintStandVo stand = standList.get(j);
+                EimsMaintOrditm itm = new EimsMaintOrditm();
+                itm.setOrderId(bo.getId());
+                itm.setEquId(equId);
+                itm.setItmName(stand.getName());
+                itm.setItmAction(stand.getStand());
+                itm.setItmUser(bo.getMaintUser());
+                orditmMapper.insert(itm);
+            }
+
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼淇濆吇宸ュ崟
+     *
+     * @param bo 淇濆吇宸ュ崟
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @SneakyThrows
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean updateByBo(EimsMaintOrderBo bo) {
+        EimsMaintOrder update = MapstructUtils.convert(bo, EimsMaintOrder.class);
+
+        EimsMaintOrder old = baseMapper.selectById(bo.getId());
+
+        // 淇濆吇鐘舵�佸彉鏇村緟瀹℃牳鏃堕渶瑕佹牎楠屼繚鍏婚」鏁版嵁
+        if(old.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.BAOYANG)&&bo.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIYANZHENG)){
+            LambdaQueryWrapper<EimsMaintOrditm>  itmQueryWrapper = Wrappers.lambdaQuery();
+            itmQueryWrapper.eq(EimsMaintOrditm::getOrderId, bo.getId());
+            List<EimsMaintOrditm> eimsMaintOrditms = orditmMapper.selectList(itmQueryWrapper);
+            List<EimsMaintOrditm> wwc = eimsMaintOrditms.stream().filter(item->!item.getStatus().equals(DictConstants.EIMS_ORDITM_STATUS_DETAIL.YIWANCHENG)).toList();
+             if(!wwc.isEmpty()){
+                return false;
+             }
+        }
+
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(EimsMaintOrder entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏诲伐鍗曚俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+
+    @Override
+    public String selectMaintOrderCodeByIds(String orderIds) {
+        List<String> list = new ArrayList<>();
+        for (Long id : StringUtils.splitTo(orderIds, Convert::toLong)) {
+            EimsMaintOrderVo vo = SpringUtils.getAopProxy(this).queryById(id);
+            if (ObjectUtil.isNotNull(vo)) {
+                list.add(vo.getMaintCode());
+            }
+        }
+        return String.join(StringUtils.SEPARATOR, list);
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrditmServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrditmServiceImpl.java
new file mode 100644
index 0000000..b3dfde2
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintOrditmServiceImpl.java
@@ -0,0 +1,170 @@
+package org.dromara.eims.service.impl;
+
+import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.eims.domain.EimsMaintOrder;
+import org.dromara.eims.mapper.EimsMaintOrderMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsMaintOrditmBo;
+import org.dromara.eims.domain.vo.EimsMaintOrditmVo;
+import org.dromara.eims.domain.EimsMaintOrditm;
+import org.dromara.eims.mapper.EimsMaintOrditmMapper;
+import org.dromara.eims.service.IEimsMaintOrditmService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 宸ュ崟鏉$洰Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-03-10
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsMaintOrditmServiceImpl implements IEimsMaintOrditmService {
+
+    private final EimsMaintOrditmMapper baseMapper;
+    private final EimsMaintOrderMapper orderMapper;
+
+    /**
+     * 鏌ヨ宸ュ崟鏉$洰
+     *
+     * @param id 涓婚敭
+     * @return 宸ュ崟鏉$洰
+     */
+    @Override
+    public EimsMaintOrditmVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ宸ュ崟鏉$洰鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 宸ュ崟鏉$洰鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<EimsMaintOrditmVo> queryPageList(EimsMaintOrditmBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EimsMaintOrditm> lqw = buildQueryWrapper(bo);
+        Page<EimsMaintOrditmVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勫伐鍗曟潯鐩垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 宸ュ崟鏉$洰鍒楄〃
+     */
+    @Override
+    public List<EimsMaintOrditmVo> queryList(EimsMaintOrditmBo bo) {
+        LambdaQueryWrapper<EimsMaintOrditm> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<EimsMaintOrditm> buildQueryWrapper(EimsMaintOrditmBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EimsMaintOrditm> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getOrderId() != null, EimsMaintOrditm::getOrderId, bo.getOrderId());
+        lqw.eq(bo.getEquId() != null, EimsMaintOrditm::getEquId, bo.getEquId());
+        lqw.like(StringUtils.isNotBlank(bo.getItmName()), EimsMaintOrditm::getItmName, bo.getItmName());
+        lqw.eq(StringUtils.isNotBlank(bo.getItmAction()), EimsMaintOrditm::getItmAction, bo.getItmAction());
+        lqw.eq(bo.getItmUser() != null, EimsMaintOrditm::getItmUser, bo.getItmUser());
+        lqw.eq(bo.getItmTime() != null, EimsMaintOrditm::getItmTime, bo.getItmTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EimsMaintOrditm::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 鏂板宸ュ崟鏉$洰
+     *
+     * @param bo 宸ュ崟鏉$洰
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(EimsMaintOrditmBo bo) {
+        EimsMaintOrditm add = MapstructUtils.convert(bo, EimsMaintOrditm.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼宸ュ崟鏉$洰
+     *
+     * @param bo 宸ュ崟鏉$洰
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean updateByBo(EimsMaintOrditmBo bo) {
+        EimsMaintOrditm update = MapstructUtils.convert(bo, EimsMaintOrditm.class);
+        // 瀹屾垚宸ュ崟鏄庣粏鍚屾淇敼宸ュ崟鐘舵��
+        //1.绗竴娆″畬鎴愪繚鍏诲伐鍗曟槑缁嗘妸淇濆吇宸ュ崟鐘舵�佷慨鏀逛负 淇濆吇涓�
+        Long orderId = bo.getOrderId();
+        EimsMaintOrder order = orderMapper.selectById(orderId);
+        if(bo.getStatus().equals(DictConstants.EIMS_ORDITM_STATUS_DETAIL.YIWANCHENG)){
+            //娌℃湁瀹屾垚鏃堕棿鑷姩娣诲姞瀹屾垚鏃堕棿
+            if(bo.getItmTime()==null){
+                update.setItmTime(new Date());
+            }
+            if(order.getStatus().equals(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIBAOYANG)){
+                order.setStatus(DictConstants.MAINT_ORDER_STATUS_DETAIL.BAOYANG);
+                if(order.getStartTime()==null){
+                    order.setStartTime(new Date());
+                }
+                orderMapper.updateById(order);
+            }
+        }
+        validEntityBeforeSave(update);
+        boolean flag = baseMapper.updateById(update) > 0;
+        //2.鏌ヨ鎵�鏈変繚鍏婚」鏄惁閮藉凡瀹屾垚
+        LambdaQueryWrapper<EimsMaintOrditm> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(EimsMaintOrditm::getOrderId, bo.getOrderId());
+        List<EimsMaintOrditm> eimsMaintOrditms = baseMapper.selectList(queryWrapper);
+        List<EimsMaintOrditm> wwc = eimsMaintOrditms.stream().filter(item->!item.getStatus().equals(DictConstants.EIMS_ORDITM_STATUS_DETAIL.YIWANCHENG)).toList();
+        if(wwc.isEmpty()){
+            order.setStatus(DictConstants.MAINT_ORDER_STATUS_DETAIL.DAIYANZHENG);
+            orderMapper.updateById(order);
+        }
+
+        return flag;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(EimsMaintOrditm entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄ゅ伐鍗曟潯鐩俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
new file mode 100644
index 0000000..8cbc9af
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintPlanServiceImpl.java
@@ -0,0 +1,235 @@
+package org.dromara.eims.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.SneakyThrows;
+import org.dromara.common.core.constant.DictConstants;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.eims.domain.vo.EimsRepairResVo;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsMaintPlanBo;
+import org.dromara.eims.domain.vo.EimsMaintPlanVo;
+import org.dromara.eims.domain.EimsMaintPlan;
+import org.dromara.eims.mapper.EimsMaintPlanMapper;
+import org.dromara.eims.service.IEimsMaintPlanService;
+
+import java.util.*;
+
+/**
+ * 淇濆吇璁″垝Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsMaintPlanServiceImpl implements IEimsMaintPlanService {
+
+    private final EimsMaintPlanMapper baseMapper;
+    private final SysDeptMapper sysDeptMapper;
+
+    /**
+     * 鏌ヨ淇濆吇璁″垝
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇璁″垝
+     */
+    @Override
+    public EimsMaintPlanVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇璁″垝鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇璁″垝鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<EimsMaintPlanVo> queryPageList(EimsMaintPlanBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EimsMaintPlan> lqw = buildQueryWrapper(bo);
+        Page<EimsMaintPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public TableDataInfo<EimsMaintPlanVo> queryPageListCustom(EimsMaintPlanBo bo, PageQuery pageQuery) {
+        Page<EimsMaintPlanVo> page = baseMapper.selectMaintPlanList(pageQuery.build(), buildWrapper(bo));
+        return TableDataInfo.build(page);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏昏鍒掑垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇璁″垝鍒楄〃
+     */
+    @Override
+    public List<EimsMaintPlanVo> queryList(EimsMaintPlanBo bo) {
+        LambdaQueryWrapper<EimsMaintPlan> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<EimsMaintPlan> buildQueryWrapper(EimsMaintPlanBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EimsMaintPlan> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getEquId() != null, EimsMaintPlan::getEquId, bo.getEquId());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintType()), EimsMaintPlan::getMaintType, bo.getMaintType());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), EimsMaintPlan::getMaintCycleUnit, bo.getMaintCycleUnit());
+        lqw.eq(StringUtils.isNotBlank(bo.getMaintRule()), EimsMaintPlan::getMaintRule, bo.getMaintRule());
+        lqw.eq(bo.getMaintUser() != null, EimsMaintPlan::getMaintUser, bo.getMaintUser());
+        lqw.eq(bo.getMaintDept() != null, EimsMaintPlan::getMaintDept, bo.getMaintDept());
+        lqw.eq(bo.getStatus() != null, EimsMaintPlan::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    private QueryWrapper<EimsMaintPlan> buildWrapper(EimsMaintPlanBo bo) {
+        Map<String, Object> params = bo.getParams();
+        QueryWrapper<EimsMaintPlan> qw = Wrappers.query();
+        qw.eq(bo.getEquId() != null, "mp.equ_id", bo.getEquId());
+        qw.like(bo.getEquName() != null, "equ.equ_name", bo.getEquName());
+        qw.like(bo.getAssetNo() != null, "equ.asset_no", bo.getAssetNo());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintType()), "mp.maint_type", bo.getMaintType());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintCycleUnit()), "mp.maint_cycle_unit", bo.getMaintCycleUnit());
+        qw.eq(StringUtils.isNotBlank(bo.getMaintRule()), "mp.maint_rule", bo.getMaintRule());
+        qw.eq(bo.getMaintUser() != null, "mp.maint_user", bo.getMaintUser());
+        qw.in(bo.getMaintDept() != null, "mp.maint_dept", getAllDescendantIds(bo.getMaintDept()));
+        qw.eq(bo.getStatus() != null, "mp.status", bo.getStatus());
+        return qw;
+    }
+
+    /**
+     * 鏍规嵁id锛岃幏鍙栨墍鏈夊悗浠d
+     *
+     * @param rootId
+     * @return
+     */
+    public List<Long> getAllDescendantIds(Long rootId) {
+        List<Long> result = new ArrayList<>();
+        result.add(rootId);
+        collectDescendants(rootId, result);
+        return result;
+    }
+
+    private void collectDescendants(Long currentId, List<Long> collector) {
+        QueryWrapper<SysDept> sysDeptWrapper = new QueryWrapper<>();
+        sysDeptWrapper.lambda().eq(SysDept::getParentId, currentId);
+
+        List<SysDeptVo> children = sysDeptMapper.selectVoList(sysDeptWrapper);
+        if (children != null && !children.isEmpty()) {
+            for (SysDeptVo child : children) {
+                Long childId = child.getDeptId();
+                collector.add(childId);
+                collectDescendants(childId, collector);
+            }
+        }
+    }
+
+    /**
+     * 鏂板淇濆吇璁″垝
+     *
+     * @param bo 淇濆吇璁″垝
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(EimsMaintPlanBo bo) {
+        setMaintNextTime(bo);
+        EimsMaintPlan add = MapstructUtils.convert(bo, EimsMaintPlan.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 璁$畻淇濆吇璁″垝涓嬫鎵ц鏃堕棿
+     */
+    @SneakyThrows
+    private void setMaintNextTime(EimsMaintPlanBo bo) {
+        Date maintFirstTime = bo.getMaintFirstTime();
+        Date maintLastTime = bo.getMaintLastTime();
+        //涓嬫淇濆吇鏃堕棿璁$畻瑙勫垯 0-鎸夊浐瀹氬懆鏈�  1-鎸変笂娆′繚鍏绘椂闂�
+        Date nextDate = (maintLastTime != null && bo.getMaintRule().equals(DictConstants.MAINT_TIME_RULE_DETAIL.LAST)) ? maintLastTime :maintFirstTime;
+
+        //棣栨鎵ц鏃堕棿涓虹┖鎶涘嚭寮傚父
+        if (maintFirstTime == null) {
+            throw new Exception("棣栨鎵ц鏃堕棿涓嶈兘涓虹┖!");
+        }
+        //鍛ㄦ湡
+        Long maintCycle = bo.getMaintCycle();
+        //鍗曚綅 1-澶� 2-鍛� 3-鏈� 4-瀛� 5-骞�
+        String maintCycleUnit = bo.getMaintCycleUnit();
+        switch (maintCycleUnit) {
+            case "1":
+                nextDate = DateUtils.addDays(nextDate, maintCycle.intValue());
+                break;
+            case "2":
+                nextDate = DateUtils.addWeeks(nextDate, maintCycle.intValue());
+                break;
+            case "3":
+                nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue());
+                break;
+            case "4":
+                nextDate = DateUtils.addMonths(nextDate, maintCycle.intValue() * 3);
+                break;
+            case "5":
+                nextDate = DateUtils.addYears(nextDate, maintCycle.intValue());
+                break;
+
+        }
+        bo.setMaintNextTime(nextDate);
+
+
+    }
+
+    /**
+     * 淇敼淇濆吇璁″垝
+     *
+     * @param bo 淇濆吇璁″垝
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(EimsMaintPlanBo bo) {
+        //setMaintNextTime(bo);
+        EimsMaintPlan update = MapstructUtils.convert(bo, EimsMaintPlan.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(EimsMaintPlan entity) {
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏昏鍒掍俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintStandServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintStandServiceImpl.java
new file mode 100644
index 0000000..d1e76d2
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/EimsMaintStandServiceImpl.java
@@ -0,0 +1,135 @@
+package org.dromara.eims.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.eims.domain.bo.EimsMaintStandBo;
+import org.dromara.eims.domain.vo.EimsMaintStandVo;
+import org.dromara.eims.domain.EimsMaintStand;
+import org.dromara.eims.mapper.EimsMaintStandMapper;
+import org.dromara.eims.service.IEimsMaintStandService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 淇濆吇鏍囧噯Service涓氬姟灞傚鐞�
+ *
+ * @author zhuguifei
+ * @date 2025-03-04
+ */
+@RequiredArgsConstructor
+@Service
+public class EimsMaintStandServiceImpl implements IEimsMaintStandService {
+
+    private final EimsMaintStandMapper baseMapper;
+
+    /**
+     * 鏌ヨ淇濆吇鏍囧噯
+     *
+     * @param id 涓婚敭
+     * @return 淇濆吇鏍囧噯
+     */
+    @Override
+    public EimsMaintStandVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ淇濆吇鏍囧噯鍒楄〃
+     *
+     * @param bo        鏌ヨ鏉′欢
+     * @param pageQuery 鍒嗛〉鍙傛暟
+     * @return 淇濆吇鏍囧噯鍒嗛〉鍒楄〃
+     */
+    @Override
+    public TableDataInfo<EimsMaintStandVo> queryPageList(EimsMaintStandBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EimsMaintStand> lqw = buildQueryWrapper(bo);
+        Page<EimsMaintStandVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 鏌ヨ绗﹀悎鏉′欢鐨勪繚鍏绘爣鍑嗗垪琛�
+     *
+     * @param bo 鏌ヨ鏉′欢
+     * @return 淇濆吇鏍囧噯鍒楄〃
+     */
+    @Override
+    public List<EimsMaintStandVo> queryList(EimsMaintStandBo bo) {
+        LambdaQueryWrapper<EimsMaintStand> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<EimsMaintStand> buildQueryWrapper(EimsMaintStandBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EimsMaintStand> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getEquId() != null, EimsMaintStand::getEquId, bo.getEquId());
+        lqw.eq(bo.getEquTypeId() != null, EimsMaintStand::getEquTypeId, bo.getEquTypeId());
+        lqw.like(StringUtils.isNotBlank(bo.getAssetNo()), EimsMaintStand::getAssetNo, bo.getAssetNo());
+        lqw.like(StringUtils.isNotBlank(bo.getEquName()), EimsMaintStand::getEquName, bo.getEquName());
+        lqw.like(StringUtils.isNotBlank(bo.getModelNo()), EimsMaintStand::getModelNo, bo.getModelNo());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), EimsMaintStand::getName, bo.getName());
+        lqw.like(StringUtils.isNotBlank(bo.getStand()), EimsMaintStand::getStand, bo.getStand());
+        return lqw;
+    }
+
+    /**
+     * 鏂板淇濆吇鏍囧噯
+     *
+     * @param bo 淇濆吇鏍囧噯
+     * @return 鏄惁鏂板鎴愬姛
+     */
+    @Override
+    public Boolean insertByBo(EimsMaintStandBo bo) {
+        EimsMaintStand add = MapstructUtils.convert(bo, EimsMaintStand.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼淇濆吇鏍囧噯
+     *
+     * @param bo 淇濆吇鏍囧噯
+     * @return 鏄惁淇敼鎴愬姛
+     */
+    @Override
+    public Boolean updateByBo(EimsMaintStandBo bo) {
+        EimsMaintStand update = MapstructUtils.convert(bo, EimsMaintStand.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 淇濆瓨鍓嶇殑鏁版嵁鏍¢獙
+     */
+    private void validEntityBeforeSave(EimsMaintStand entity){
+        //TODO 鍋氫竴浜涙暟鎹牎楠�,濡傚敮涓�绾︽潫
+    }
+
+    /**
+     * 鏍¢獙骞舵壒閲忓垹闄や繚鍏绘爣鍑嗕俊鎭�
+     *
+     * @param ids     寰呭垹闄ょ殑涓婚敭闆嗗悎
+     * @param isValid 鏄惁杩涜鏈夋晥鎬ф牎楠�
+     * @return 鏄惁鍒犻櫎鎴愬姛
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠�
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/GenerateCodeServiceImpl.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/GenerateCodeServiceImpl.java
new file mode 100644
index 0000000..07d1301
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/service/impl/GenerateCodeServiceImpl.java
@@ -0,0 +1,39 @@
+package org.dromara.eims.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheConstants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.eims.service.IGenerateCodeService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+@RequiredArgsConstructor
+@Service
+public class GenerateCodeServiceImpl implements IGenerateCodeService {
+    @Override
+    public String generateCode(String prefix) {
+        String key = CacheConstants.EIMS_GENERATE_CODE + ":" + prefix;
+        String todayStr = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDate.now());
+        String code;
+        // 浣跨敤Redis鐨勫師瀛愭�ф搷浣滈伩鍏嶅苟鍙戦棶棰�
+        String oldCode = RedisUtils.getCacheObject(key);
+        if (oldCode != null && oldCode.contains(todayStr)) {
+            int no = Integer.parseInt(oldCode.substring(oldCode.length() - 4));
+            code = String.format("%s%s%04d", prefix, todayStr, no + 1);
+        } else {
+            code = String.format("%s%s%04d", prefix, todayStr, 1);
+        }
+
+        // 鏇存柊缂撳瓨
+        try {
+            RedisUtils.setCacheObject(key, code);
+            return code;
+        } catch (Exception e) {
+            return null;
+        }
+
+
+    }
+}
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
new file mode 100644
index 0000000..e320526
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrderMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.eims.mapper.EimsMaintOrderMapper">
+    <resultMap type="org.dromara.eims.domain.vo.EimsMaintOrderVo" id="EimsMaintOrderResult">
+    </resultMap>
+    <select id="selectMaintOrderList" resultMap="EimsMaintOrderResult">
+        SELECT mo.*,equ.equ_name equName,equ.equ_code equCode,equ.asset_no assetNo,equ.model_no modelNo,mo.create_time createTime,
+               us.nick_name maintUserName,dp.dept_name maintDeptName,ue.nick_name verifyUserName,
+               CONCAT_WS('', mo.maint_cycle, dd.dict_label) maintCycleUnitName
+        FROM eims_maint_order mo
+                 LEFT JOIN eims_equ equ ON mo.equ_id = equ.equ_id
+                 LEFT JOIN sys_user us ON mo.maint_user = us.user_id
+                 LEFT JOIN sys_user ue ON mo.verify_user = ue.user_id
+                 LEFT JOIN sys_dept dp ON mo.maint_dept = dp.dept_id
+                 LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = mo.maint_cycle_unit
+            ${ew.getCustomSqlSegment}
+    </select>
+</mapper>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrditmMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrditmMapper.xml
new file mode 100644
index 0000000..0fe9238
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintOrditmMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.eims.mapper.EimsMaintOrditmMapper">
+
+</mapper>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml
new file mode 100644
index 0000000..0987499
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintPlanMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.eims.mapper.EimsMaintPlanMapper">
+    <resultMap type="org.dromara.eims.domain.vo.EimsMaintPlanVo" id="EimsMaintPlanResult">
+    </resultMap>
+    <select id="selectMaintPlanList" resultMap="EimsMaintPlanResult">
+        SELECT mp.*,equ.equ_name equName,equ.equ_code equCode,equ.asset_no assetNo,equ.model_no modelNo,
+               us.nick_name maintUserName,dp.dept_name maintDeptName,
+               CONCAT_WS('', mp.maint_cycle, dd.dict_label) maintCycleUnitName
+        FROM eims_maint_plan mp
+                 LEFT JOIN eims_equ equ ON mp.equ_id = equ.equ_id
+                 LEFT JOIN sys_user us ON mp.maint_user = us.user_id
+                 LEFT JOIN sys_dept dp ON mp.maint_dept = dp.dept_id
+                 LEFT JOIN sys_dict_data dd on dd.dict_type = 'maint_cycle_unit' and dd.dict_value = mp.maint_cycle_unit
+            ${ew.getCustomSqlSegment}
+    </select>
+</mapper>
diff --git a/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintStandMapper.xml b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintStandMapper.xml
new file mode 100644
index 0000000..92692fa
--- /dev/null
+++ b/eims/ruoyi-modules/lb-eims/src/main/resources/mapper/eims/EimsMaintStandMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.eims.mapper.EimsMaintStandMapper">
+
+</mapper>

--
Gitblit v1.9.3