Browse Source

入口页

yanghao 1 month ago
parent
commit
1fc0073f2e
9 changed files with 1959 additions and 531 deletions
  1. 12 0
      api/ruiHengReport.js
  2. 1 0
      api/ruihen.js
  3. 533 524
      pages.json
  4. 801 0
      pages/entry/index.vue
  5. 6 1
      pages/home/index.vue
  6. 177 0
      pages/ruiHengReport/data.js
  7. 420 0
      pages/ruiHengReport/index.vue
  8. 9 6
      pages/user/login.vue
  9. BIN
      static/entry/bg.png

+ 12 - 0
api/ruiHengReport.js

@@ -0,0 +1,12 @@
+
+import { request } from "@/utils/request";
+
+
+// 瑞恒日报
+export const getRhRate = (params) => {
+  return request({
+    url: "/rq/stat/rh/device/utilizationRate",
+    method: "get",
+    params,
+  });
+};

+ 1 - 0
api/ruihen.js

@@ -121,3 +121,4 @@ export const selectedDeptsEmployee = (params) => {
     params,
   });
 };
+

+ 533 - 524
pages.json

@@ -1,527 +1,536 @@
 {
-  "pages": [
-    //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
-    {
-      // 登录
-      "path": "pages/user/login",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 首页
-      "path": "pages/home/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 我的
-      "path": "pages/user/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 修改手机和密码
-      "path": "pages/user/change",
-      "style": {
-        "navigationBarTitleText": "%user.modifyPhoneAndPassword%"
-      }
-    },
-    {
-      // 运行记录填报
-      "path": "pages/recordFilling/list",
-      "style": {
-        "navigationBarTitleText": "%home.operationRecordFilling%"
-      }
-    },
+	"pages": [
+		//pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			// 登录
+			"path": "pages/user/login",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 入口
+			"path": "pages/entry/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 首页
+			"path": "pages/home/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 我的
+			"path": "pages/user/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 修改手机和密码
+			"path": "pages/user/change",
+			"style": {
+				"navigationBarTitleText": "%user.modifyPhoneAndPassword%"
+			}
+		},
+		{
+			// 运行记录填报
+			"path": "pages/recordFilling/list",
+			"style": {
+				"navigationBarTitleText": "%home.operationRecordFilling%"
+			}
+		},
 
-    {
-      // 运行记录填报详情
-      "path": "pages/recordFilling/detail",
-      "style": {
-        "navigationBarTitleText": "%home.operationRecordFilling%"
-      }
-    },
-    {
-      // 选择设备
-      "path": "pages/devide/multiple",
-      "style": {
-        "navigationBarTitleText": "%device.selectDevice%"
-      }
-    },
-    {
-      // 物料详情
-      "path": "pages/material/view",
-      "style": {
-        "navigationBarTitleText": "%workOrder.materialDetails%"
-      }
-    },
-    {
-      // 物料详情 - 维修工单
-      "path": "pages/material/repair-view",
-      "style": {
-        "navigationBarTitleText": "%workOrder.materialDetails%"
-      }
-    },
-    {
-      // 保养工单
-      "path": "pages/maintenance/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 保养工单创建
-      "path": "pages/maintenance/create",
-      "style": {
-        "navigationBarTitleText": "%maintenanceWorkOrder.createMaintenanceWorkOrder%"
-      }
-    },
-    {
-      // 保养工单 - 去保养
-      "path": "pages/maintenance/edit",
-      "style": {
-        "navigationBarTitleText": "%maintenanceWorkOrder.editMaintenanceWorkOrder%"
-      }
-    },
-    {
-      // 保养工单详情
-      "path": "pages/maintenance/detail",
-      "style": {
-        "navigationBarTitleText": "%maintenanceWorkOrder.viewMaintenanceWorkOrder%"
-      }
-    },
-    {
-      // 保养查询
-      "path": "pages/maintenance/search",
-      "style": {
-        "navigationBarTitleText": "%maintenanceSearch.title%"
-      }
-    },
-    {
-      // 设备维修
-      "path": "pages/repair/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 设备维修详情
-      "path": "pages/repair/detail",
-      "style": {
-        "navigationBarTitleText": "%equipmentMaintenance.viewWorkOrder%"
-      }
-    },
-    {
-      // 设备维修创建
-      "path": "pages/repair/create",
-      "style": {
-        "navigationBarTitleText": "%equipmentMaintenance.createWorkOrder%"
-      }
-    },
-    {
-      // 设备维修创建
-      "path": "pages/repair/edit",
-      "style": {
-        "navigationBarTitleText": "%equipmentMaintenance.editWorkOrder%"
-      }
-    },
-    {
-      // 故障上报
-      "path": "pages/fault/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 故障上报详情
-      "path": "pages/fault/detail",
-      "style": {
-        "navigationBarTitleText": "%fault.viewWorkOrder%"
-      }
-    },
-    {
-      // 故障上报创建
-      "path": "pages/fault/create",
-      "style": {
-        "navigationBarTitleText": "%fault.createWorkOrder%"
-      }
-    },
-    {
-      // 故障上报编辑
-      "path": "pages/fault/edit",
-      "style": {
-        "navigationBarTitleText": "%fault.editWorkOrder%"
-      }
-    },
-    {
-      // 巡检工单
-      "path": "pages/inspection/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 巡检工单详情
-      "path": "pages/inspection/detail",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 巡检工单详情
-      "path": "pages/inspection/edit",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      "path": "pages/ruihen-task/index",
-      "style": {
-        "navigationBarTitleText": "%ruihen.taskTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen-task/create",
-      "style": {
-        "navigationBarTitleText": "%ruihen.taskCreateTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen-task/detail",
-      "style": {
-        "navigationBarTitleText": "%ruihen.taskDetailTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen-task/edit",
-      "style": {
-        "navigationBarTitleText": "%ruihen.taskEditTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen/index",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.indexTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen/detail",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.detailTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen/edit",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.editTitle%"
-      }
-    },
-    {
-      "path": "pages/ruihen/approval",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.approvalTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiying/index",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.indexTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiying/detail",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.detailTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiying/edit",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.editTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiying/approval",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.approvalTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiyingx/index",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.indexTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiyingx/detail",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.detailTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiyingx/edit",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.editTitle%"
-      }
-    },
-    {
-      "path": "pages/ruiyingx/approval",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.approvalTitle%"
-      }
-    },
-    {
-      // 瑞都日报-列表
-      "path": "pages/ruiDu/index",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.indexTitle%"
-      }
-    },
-    {
-      // 瑞都日报-列表
-      "path": "pages/ruiDu/create",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.createTitle%"
-      }
-    },
-    {
-      // 瑞都日报-编辑
-      "path": "pages/ruiDu/approval",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.approvalTitle%"
-      }
-    },
-    {
-      // 瑞都日报-详情
-      "path": "pages/ruiDu/detail",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.detailTitle%"
-      }
-    },
-    {
-      // 瑞都日报-编辑
-      "path": "pages/ruiDu/edit",
-      "style": {
-        "navigationBarTitleText": "%ruiDu.editTitle%"
-      }
-    },
-    {
-      // 瑞都报表-日报详情
-      "path": "pages/ruiDuReport/daily-detail",
-      "style": {
-        "navigationBarTitleText": "%ruiDuReport.dailyDetail%"
-      }
-    },
-    {
-      // 瑞都报表-日报单井队统计
-      "path": "pages/ruiDuReport/daily-team-statistic",
-      "style": {
-        "navigationBarTitleText": "%ruiDuReport.dailyTeamStatistic%"
-      }
-    },
-    {
-      // 库存查询
-      "path": "pages/inventory/index",
-      "style": {
-        "navigationBarTitleText": "%inventory.title%"
-      }
-    },
-    {
-      // 库存查询-筛选
-      "path": "pages/inventory/search/index",
-      "style": {
-        "navigationBarTitleText": "%inventory.search.title%"
-      }
-    },
-    {
-      // 消息管理
-      "path": "pages/message/index",
-      "style": {
-        "navigationBarTitleText": "%message.title%"
-      }
-    },
-    {
-      // 消息管理详情
-      "path": "pages/message/detail/index",
-      "style": {
-        "navigationBarTitleText": "%message.title%"
-      }
-    },
-    {
-      // 状态变更列表
-      "path": "pages/statusChange/index",
-      "style": {
-        "navigationBarTitleText": "%statusChange.title%",
-        "app-plus": {
-          "titleNView": {
-            "buttons": [
-              {
-                "text": "%statusChange.insert%",
-                "color": "#004098",
-                "fontSize": "14px",
-                "width": "80px"
-              }
-            ]
-          }
-        }
-      }
-    },
-    {
-      // 状态变更列调整记录
-      "path": "pages/statusChange/history/index",
-      "style": {
-        "navigationBarTitleText": "%statusChange.history.title%"
-      }
-    },
-    {
-      // 状态变更新增
-      "path": "pages/statusChange/form/index",
-      "style": {
-        "navigationBarTitleText": "%statusChange.form.title%"
-      }
-    },
-    {
-      // 设备责任人列表
-      "path": "pages/deviceUser/index",
-      "style": {
-        "navigationBarTitleText": "%deviceUser.title%",
-        "app-plus": {
-          "titleNView": {
-            "buttons": [
-              {
-                "text": "%statusChange.insert%",
-                "color": "#004098",
-                "fontSize": "14px",
-                "width": "80px"
-              }
-            ]
-          }
-        }
-      }
-    },
-    {
-      // 设备责任人调整记录
-      "path": "pages/deviceUser/history/index",
-      "style": {
-        "navigationBarTitleText": "%deviceUser.history.title%"
-      }
-    },
-    {
-      // 设备责任人新增
-      "path": "pages/deviceUser/form/index",
-      "style": {
-        "navigationBarTitleText": "%deviceUser.form.title%"
-      }
-    },
-    {
-      // 实时数据监控
-      "path": "pages/realTimeData/index",
-      "style": {
-        "navigationBarTitleText": "%realTimeData.title%"
-      }
-    },
-    {
-      // 实时数据监控详情
-      "path": "pages/realTimeData/detail/index",
-      "style": {
-        "navigationBarTitleText": "%realTimeData.detail.title%"
-      }
-    },
-    {
-      // 实时数据监控详情
-      "path": "pages/realTimeData/chart/index",
-      "style": {
-        "navigationBarTitleText": "%realTimeData.detail.title%"
-      }
-    },
-    {
-      // 设备台账
-      "path": "pages/ledger/index",
-      "style": {
-        "navigationBarTitleText": "%ledger.title%"
-      }
-    },
-    {
-      // 新建设备台账
-      "path": "pages/ledger/form/index",
-      "style": {
-        "navigationBarTitleText": "%ledger.form.title%"
-      }
-    },
-    {
-      // 设备台账详情
-      "path": "pages/ledger/detail/index",
-      "style": {
-        "navigationBarTitleText": "%ledger.detail.title%"
-      }
-    },
-    {
-      // 统计分析
-      "path": "pages/statistic/index",
-      "style": {
-        "navigationStyle": "custom"
-      }
-    },
-    {
-      // 超时工单列表
-      "path": "pages/overtime/index",
-      "style": {
-        "navigationBarTitleText": "%overtime.title%"
-      }
-    },
-    {
-      // qhse详情
-      "path": "pages/qhse/detail",
-      "style": {
-        "navigationBarTitleText": "%qhse.detail.title%"
-      }
-    }
-  ],
+		{
+			// 运行记录填报详情
+			"path": "pages/recordFilling/detail",
+			"style": {
+				"navigationBarTitleText": "%home.operationRecordFilling%"
+			}
+		},
+		{
+			// 选择设备
+			"path": "pages/devide/multiple",
+			"style": {
+				"navigationBarTitleText": "%device.selectDevice%"
+			}
+		},
+		{
+			// 物料详情
+			"path": "pages/material/view",
+			"style": {
+				"navigationBarTitleText": "%workOrder.materialDetails%"
+			}
+		},
+		{
+			// 物料详情 - 维修工单
+			"path": "pages/material/repair-view",
+			"style": {
+				"navigationBarTitleText": "%workOrder.materialDetails%"
+			}
+		},
+		{
+			// 保养工单
+			"path": "pages/maintenance/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 保养工单创建
+			"path": "pages/maintenance/create",
+			"style": {
+				"navigationBarTitleText": "%maintenanceWorkOrder.createMaintenanceWorkOrder%"
+			}
+		},
+		{
+			// 保养工单 - 去保养
+			"path": "pages/maintenance/edit",
+			"style": {
+				"navigationBarTitleText": "%maintenanceWorkOrder.editMaintenanceWorkOrder%"
+			}
+		},
+		{
+			// 保养工单详情
+			"path": "pages/maintenance/detail",
+			"style": {
+				"navigationBarTitleText": "%maintenanceWorkOrder.viewMaintenanceWorkOrder%"
+			}
+		},
+		{
+			// 保养查询
+			"path": "pages/maintenance/search",
+			"style": {
+				"navigationBarTitleText": "%maintenanceSearch.title%"
+			}
+		},
+		{
+			// 设备维修
+			"path": "pages/repair/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 设备维修详情
+			"path": "pages/repair/detail",
+			"style": {
+				"navigationBarTitleText": "%equipmentMaintenance.viewWorkOrder%"
+			}
+		},
+		{
+			// 设备维修创建
+			"path": "pages/repair/create",
+			"style": {
+				"navigationBarTitleText": "%equipmentMaintenance.createWorkOrder%"
+			}
+		},
+		{
+			// 设备维修创建
+			"path": "pages/repair/edit",
+			"style": {
+				"navigationBarTitleText": "%equipmentMaintenance.editWorkOrder%"
+			}
+		},
+		{
+			// 故障上报
+			"path": "pages/fault/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 故障上报详情
+			"path": "pages/fault/detail",
+			"style": {
+				"navigationBarTitleText": "%fault.viewWorkOrder%"
+			}
+		},
+		{
+			// 故障上报创建
+			"path": "pages/fault/create",
+			"style": {
+				"navigationBarTitleText": "%fault.createWorkOrder%"
+			}
+		},
+		{
+			// 故障上报编辑
+			"path": "pages/fault/edit",
+			"style": {
+				"navigationBarTitleText": "%fault.editWorkOrder%"
+			}
+		},
+		{
+			// 巡检工单
+			"path": "pages/inspection/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 巡检工单详情
+			"path": "pages/inspection/detail",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 巡检工单详情
+			"path": "pages/inspection/edit",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			"path": "pages/ruihen-task/index",
+			"style": {
+				"navigationBarTitleText": "%ruihen.taskTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen-task/create",
+			"style": {
+				"navigationBarTitleText": "%ruihen.taskCreateTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen-task/detail",
+			"style": {
+				"navigationBarTitleText": "%ruihen.taskDetailTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen-task/edit",
+			"style": {
+				"navigationBarTitleText": "%ruihen.taskEditTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen/index",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.indexTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen/detail",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.detailTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen/edit",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.editTitle%"
+			}
+		},
+		{
+			"path": "pages/ruihen/approval",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.approvalTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiying/index",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.indexTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiying/detail",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.detailTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiying/edit",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.editTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiying/approval",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.approvalTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiyingx/index",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.indexTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiyingx/detail",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.detailTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiyingx/edit",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.editTitle%"
+			}
+		},
+		{
+			"path": "pages/ruiyingx/approval",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.approvalTitle%"
+			}
+		},
+		{
+			// 瑞都日报-列表
+			"path": "pages/ruiDu/index",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.indexTitle%"
+			}
+		},
+		{
+			// 瑞都日报-列表
+			"path": "pages/ruiDu/create",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.createTitle%"
+			}
+		},
+		{
+			// 瑞都日报-编辑
+			"path": "pages/ruiDu/approval",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.approvalTitle%"
+			}
+		},
+		{
+			// 瑞都日报-详情
+			"path": "pages/ruiDu/detail",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.detailTitle%"
+			}
+		},
+		{
+			// 瑞都日报-编辑
+			"path": "pages/ruiDu/edit",
+			"style": {
+				"navigationBarTitleText": "%ruiDu.editTitle%"
+			}
+		},
+		{
+			// 瑞都报表-日报详情
+			"path": "pages/ruiDuReport/daily-detail",
+			"style": {
+				"navigationBarTitleText": "%ruiDuReport.dailyDetail%"
+			}
+		},
+		{
+			// 瑞都报表-日报单井队统计
+			"path": "pages/ruiDuReport/daily-team-statistic",
+			"style": {
+				"navigationBarTitleText": "%ruiDuReport.dailyTeamStatistic%"
+			}
+		},
+		{
+			// 瑞恒报表-日报详情
+			"path": "pages/ruiHengReport/index",
+			"style": {
+				"navigationBarTitleText": "%ruiDuReport.dailyDetail%"
+			}
+		},
+		{
+			// 库存查询
+			"path": "pages/inventory/index",
+			"style": {
+				"navigationBarTitleText": "%inventory.title%"
+			}
+		},
+		{
+			// 库存查询-筛选
+			"path": "pages/inventory/search/index",
+			"style": {
+				"navigationBarTitleText": "%inventory.search.title%"
+			}
+		},
+		{
+			// 消息管理
+			"path": "pages/message/index",
+			"style": {
+				"navigationBarTitleText": "%message.title%"
+			}
+		},
+		{
+			// 消息管理详情
+			"path": "pages/message/detail/index",
+			"style": {
+				"navigationBarTitleText": "%message.title%"
+			}
+		},
+		{
+			// 状态变更列表
+			"path": "pages/statusChange/index",
+			"style": {
+				"navigationBarTitleText": "%statusChange.title%",
+				"app-plus": {
+					"titleNView": {
+						"buttons": [{
+							"text": "%statusChange.insert%",
+							"color": "#004098",
+							"fontSize": "14px",
+							"width": "80px"
+						}]
+					}
+				}
+			}
+		},
+		{
+			// 状态变更列调整记录
+			"path": "pages/statusChange/history/index",
+			"style": {
+				"navigationBarTitleText": "%statusChange.history.title%"
+			}
+		},
+		{
+			// 状态变更新增
+			"path": "pages/statusChange/form/index",
+			"style": {
+				"navigationBarTitleText": "%statusChange.form.title%"
+			}
+		},
+		{
+			// 设备责任人列表
+			"path": "pages/deviceUser/index",
+			"style": {
+				"navigationBarTitleText": "%deviceUser.title%",
+				"app-plus": {
+					"titleNView": {
+						"buttons": [{
+							"text": "%statusChange.insert%",
+							"color": "#004098",
+							"fontSize": "14px",
+							"width": "80px"
+						}]
+					}
+				}
+			}
+		},
+		{
+			// 设备责任人调整记录
+			"path": "pages/deviceUser/history/index",
+			"style": {
+				"navigationBarTitleText": "%deviceUser.history.title%"
+			}
+		},
+		{
+			// 设备责任人新增
+			"path": "pages/deviceUser/form/index",
+			"style": {
+				"navigationBarTitleText": "%deviceUser.form.title%"
+			}
+		},
+		{
+			// 实时数据监控
+			"path": "pages/realTimeData/index",
+			"style": {
+				"navigationBarTitleText": "%realTimeData.title%"
+			}
+		},
+		{
+			// 实时数据监控详情
+			"path": "pages/realTimeData/detail/index",
+			"style": {
+				"navigationBarTitleText": "%realTimeData.detail.title%"
+			}
+		},
+		{
+			// 实时数据监控详情
+			"path": "pages/realTimeData/chart/index",
+			"style": {
+				"navigationBarTitleText": "%realTimeData.detail.title%"
+			}
+		},
+		{
+			// 设备台账
+			"path": "pages/ledger/index",
+			"style": {
+				"navigationBarTitleText": "%ledger.title%"
+			}
+		},
+		{
+			// 新建设备台账
+			"path": "pages/ledger/form/index",
+			"style": {
+				"navigationBarTitleText": "%ledger.form.title%"
+			}
+		},
+		{
+			// 设备台账详情
+			"path": "pages/ledger/detail/index",
+			"style": {
+				"navigationBarTitleText": "%ledger.detail.title%"
+			}
+		},
+		{
+			// 统计分析
+			"path": "pages/statistic/index",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
+			// 超时工单列表
+			"path": "pages/overtime/index",
+			"style": {
+				"navigationBarTitleText": "%overtime.title%"
+			}
+		},
+		{
+			// qhse详情
+			"path": "pages/qhse/detail",
+			"style": {
+				"navigationBarTitleText": "%qhse.detail.title%"
+			}
+		}
+	],
 
-  "tabBar": {
-    // "height": "50px", //总高45 - 9px顶部padding
-    "height": "45px",
-    "iconWidth": "15px",
-    "fontSize": "14px",
-    "borderStyle": "white",
-    "backgroundColor": "white",
-    "color": "#999999",
-    "selectedColor": "#004098",
-    "list": [
-      {
-        "pagePath": "pages/home/index",
-        "iconPath": "/static/tabbar/shouye-weixuanzhong.png",
-        "selectedIconPath": "/static/tabbar/shouye-xuanzhong.png",
-        "text": "%app.home%"
-      },
-      {
-        "pagePath": "pages/user/index",
-        "iconPath": "/static/tabbar/wode-weixuanzhong.png",
-        "selectedIconPath": "/static/tabbar/wode-xuanzhong.png",
-        "text": "%app.user%"
-      }
-    ]
-  },
-  "globalStyle": {
-    "navigationBarTextStyle": "black",
-    "navigationBarTitleText": "%app.appName%",
-    "navigationBarBackgroundColor": "#F3F5F9",
-    "backgroundColor": "#F3F5F9",
-    "rpxCalcMaxDeviceWidth": 960,
-    "rpxCalcBaseDeviceWidth": 375,
-    "rpxCalcIncludeWidth": 750
-  },
-  "uniIdRouter": {},
-  "easycom": {
-    // 配置easycom组件自动引入
-    "autoscan": true, // 是否开启easycom组件的自动扫描
-    "custom": {
-      // 自定义扫描规则
-      // "^uni-(.*)": "uni_modules/uni-$1/uni-$1.vue"
-      "^global-(.*)": "@/components/global/$1.vue"
-    }
-  }
-}
+	"tabBar": {
+		// "height": "50px", //总高45 - 9px顶部padding
+		"height": "45px",
+		"iconWidth": "15px",
+		"fontSize": "14px",
+		"borderStyle": "white",
+		"backgroundColor": "white",
+		"color": "#999999",
+		"selectedColor": "#004098",
+		"list": [{
+				"pagePath": "pages/entry/index",
+				"iconPath": "/static/tabbar/shouye-weixuanzhong.png",
+				"selectedIconPath": "/static/tabbar/shouye-xuanzhong.png",
+				"text": "%app.home%"
+			},
+			{
+				"pagePath": "pages/user/index",
+				"iconPath": "/static/tabbar/wode-weixuanzhong.png",
+				"selectedIconPath": "/static/tabbar/wode-xuanzhong.png",
+				"text": "%app.user%"
+			}
+		]
+	},
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "%app.appName%",
+		"navigationBarBackgroundColor": "#F3F5F9",
+		"backgroundColor": "#F3F5F9",
+		"rpxCalcMaxDeviceWidth": 960,
+		"rpxCalcBaseDeviceWidth": 375,
+		"rpxCalcIncludeWidth": 750
+	},
+	"uniIdRouter": {},
+	"easycom": {
+		// 配置easycom组件自动引入
+		"autoscan": true, // 是否开启easycom组件的自动扫描
+		"custom": {
+			// 自定义扫描规则
+			// "^uni-(.*)": "uni_modules/uni-$1/uni-$1.vue"
+			"^global-(.*)": "@/components/global/$1.vue"
+		}
+	}
+}

+ 801 - 0
pages/entry/index.vue

@@ -0,0 +1,801 @@
+<template>
+  <scroll-view class="entry-page" scroll-y>
+    <view class="hero">
+      <image class="hero-bg" src="/static/entry/bg.png" mode="widthFix" />
+      <!-- <view class="hero-mask"></view> -->
+      <view class="hero-content">
+        <view class="status-row"> </view>
+
+        <view class="profile-row">
+          <view class="avatar-wrap">
+            <text class="avatar-text">{{ avatarText }}</text>
+          </view>
+          <view class="profile-main">
+            <view class="greeting">{{ greetingText }},{{ displayName }}</view>
+            <view class="project-pill">
+              <text class="project-name">{{ projectName }}</text>
+              <uni-icons type="down" size="13" color="#ffffff" />
+            </view>
+          </view>
+          <view
+            class="notice-wrap"
+            @click="navigatorTo('/pages/message/index')"
+          >
+            <uni-badge :text="messageCount" absolute="rightTop" size="small">
+              <view class="notice-button">
+                <image
+                  src="~@/static/home/message.png"
+                  style="
+                    width: 15px;
+                    height: 15px;
+                    background-color: transparent;
+                  "
+                  @click="navigatorTo('/pages/message/index')"
+                />
+              </view>
+            </uni-badge>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <view class="content-shell">
+      <view class="section-card">
+        <view class="section-title">核心功能</view>
+        <scroll-view class="core-scroll" scroll-x show-scrollbar="false">
+          <view class="core-list">
+            <view
+              v-for="item in coreFeatures"
+              :key="item.title"
+              class="core-item"
+              :class="{ active: item.active }"
+            >
+              <view class="core-icon" :style="{ background: item.iconBg }">
+                <text :style="{ color: item.iconColor }">{{
+                  item.iconText
+                }}</text>
+              </view>
+              <view class="core-name">{{ item.title }}</view>
+              <view class="core-desc">{{ item.desc }}</view>
+              <view class="core-indicator" v-if="item.active"></view>
+            </view>
+          </view>
+        </scroll-view>
+      </view>
+
+      <view class="section-card">
+        <view class="section-title">PMS常用</view>
+        <view class="tool-grid">
+          <view
+            v-for="item in commonTools"
+            :key="item.title"
+            class="tool-item"
+            @click="navigatorTo(item.path)"
+          >
+            <image class="tool-icon" :src="item.icon" mode="aspectFit" />
+            <view class="tool-title">{{ item.title }}</view>
+          </view>
+        </view>
+      </view>
+
+      <view class="section-card">
+        <view class="section-head">
+          <view class="section-title">日报入口</view>
+          <view class="section-tip">
+            <uni-icons type="personadd" size="16" color="#246BFF" />
+            <text>按角色显示</text>
+          </view>
+        </view>
+        <view class="daily-list">
+          <view
+            v-for="item in visibleDailyEntries"
+            :key="item.title"
+            class="daily-item"
+            @click="navigatorTo(item.path)"
+          >
+            <image class="daily-icon" :src="item.icon" mode="aspectFit" />
+            <view class="daily-content">
+              <view class="daily-title">{{ item.title }}</view>
+              <view class="daily-subtitle">{{ item.subtitle }}</view>
+            </view>
+            <uni-icons type="right" size="16" color="#8090a8" />
+          </view>
+        </view>
+      </view>
+    </view>
+  </scroll-view>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import { onShow } from "@dcloudio/uni-app";
+import dayjs from "dayjs";
+import { getLoginUserInfo } from "@/api/login";
+import { getUnreadMessageCount } from "@/api/message";
+import { getOvertimeTaskList } from "@/api/task";
+import { getUserInfo } from "@/utils/auth";
+
+const userInfo = ref({});
+const messageCount = ref(0);
+const todoStats = ref({
+  maintenance: 0,
+  fault: 0,
+});
+
+const coreFeatures = [
+  {
+    title: "PMS",
+    desc: "设备全生命周期管理",
+    iconText: "P",
+    iconBg: "linear-gradient(135deg, #eaf2ff 0%, #d8e7ff 100%)",
+    iconColor: "#246BFF",
+    active: true,
+  },
+  {
+    title: "QHSE",
+    desc: "质量·健康·安全·环境",
+    iconText: "Q",
+    iconBg: "linear-gradient(135deg, #ecfff7 0%, #d8f8ea 100%)",
+    iconColor: "#1eb980",
+  },
+  {
+    title: "组态管理",
+    desc: "流程与仪表组态",
+    iconText: "组",
+    iconBg: "linear-gradient(135deg, #f1edff 0%, #e0d9ff 100%)",
+    iconColor: "#6d5efc",
+  },
+  {
+    title: "智慧连油",
+    desc: "润滑管理平台",
+    iconText: "油",
+    iconBg: "linear-gradient(135deg, #e7fbff 0%, #d4f7fb 100%)",
+    iconColor: "#10a8c6",
+  },
+  {
+    title: "生产运营双周会",
+    desc: "双周会管理与跟踪",
+    iconText: "会",
+    iconBg: "linear-gradient(135deg, #fff3e8 0%, #ffe3cc 100%)",
+    iconColor: "#ff8a1f",
+  },
+];
+
+const commonTools = [
+  {
+    title: "运行记录",
+    icon: "/static/home/yunxingjilu.png",
+    path: "/pages/recordFilling/list",
+  },
+  {
+    title: "保养工单",
+    icon: "/static/home/baoyang.png",
+    path: "/pages/maintenance/index",
+  },
+  {
+    title: "设备维修",
+    icon: "/static/home/shebeiweixiu.png",
+    path: "/pages/repair/index",
+  },
+  {
+    title: "巡检工单",
+    icon: "/static/home/xunjian.png",
+    path: "/pages/inspection/index",
+  },
+  {
+    title: "故障上报",
+    icon: "/static/home/guzhang.png",
+    path: "/pages/fault/index",
+  },
+  {
+    title: "库存管理",
+    icon: "/static/home/kucun.svg",
+    path: "/pages/inventory/index",
+  },
+  {
+    title: "保养查询",
+    icon: "/static/home/baoyang.png",
+    path: "/pages/maintenance/search",
+  },
+  {
+    title: "设备台账",
+    icon: "/static/home/taizhang.svg",
+    path: "/pages/ledger/index",
+  },
+  {
+    title: "设备状态变更",
+    icon: "/static/home/zhuangtaibiangeng.svg",
+    path: "/pages/statusChange/index",
+  },
+  {
+    title: "设备责任人",
+    icon: "/static/home/deviceUser.svg",
+    path: "/pages/deviceUser/index",
+  },
+];
+
+const dailyEntries = computed(() => [
+  {
+    title: "瑞恒日报",
+    subtitle: "进入瑞恒日报",
+    path: "/pages/ruihen/index?type=edit",
+    icon: "/static/home/ribao.svg",
+    visible: !!userInfo.value.rhReportFlag,
+  },
+  {
+    title: "瑞都日报",
+    subtitle: "进入瑞都日报",
+    path: "/pages/ruiDu/index",
+    icon: "/static/home/ribao.svg",
+    visible: !!userInfo.value.rdReportFlag,
+  },
+  {
+    title: "瑞鹰日报",
+    subtitle: "进入瑞鹰日报",
+    path: "/pages/ruiying/index?type=edit",
+    icon: "/static/home/rh.png",
+    visible: !!userInfo.value.ryReportFlag,
+  },
+]);
+
+const visibleDailyEntries = computed(() => {
+  const list = dailyEntries.value.filter((item) => item.visible);
+  if (list.length) return list.slice(0, 3);
+  return dailyEntries.value
+    .map((item) => ({ ...item, visible: true }))
+    .slice(0, 3);
+});
+
+const todoCards = computed(() => [
+  {
+    title: "保养工单",
+    icon: "/static/home/baoyang.png",
+    count: todoStats.value.maintenance,
+    color: "#1eb980",
+  },
+  {
+    title: "故障上报",
+    icon: "/static/home/guzhang.png",
+    count: todoStats.value.fault,
+    color: "#ff4d4f",
+  },
+]);
+
+const currentTimeText = computed(() => dayjs().format("H:mm"));
+
+const greetingText = computed(() => {
+  const hour = dayjs().hour();
+  if (hour < 12) return "上午好";
+  if (hour < 18) return "下午好";
+  return "晚上好";
+});
+
+const displayName = computed(
+  () => userInfo.value.nickname || userInfo.value.username || "张工",
+);
+const avatarText = computed(() =>
+  String(displayName.value || "张").slice(0, 1),
+);
+
+const projectName = computed(
+  () =>
+    userInfo.value.deptName ||
+    userInfo.value.postGroup ||
+    userInfo.value.stationName ||
+    "智慧工厂示例项目",
+);
+
+const parseCachedUserInfo = () => {
+  const cache = getUserInfo();
+  if (!cache) return {};
+  try {
+    const parsed = typeof cache === "string" ? JSON.parse(cache) : cache;
+    if (typeof parsed === "string") {
+      return JSON.parse(parsed)?.user || {};
+    }
+    return parsed?.user || parsed || {};
+  } catch (error) {
+    return {};
+  }
+};
+
+const buildTodoStats = (list) => {
+  const stats = {
+    maintenance: 0,
+    fault: 0,
+  };
+
+  list.forEach((item) => {
+    const typeText = String(item?.type || "");
+    if (typeText.includes("保养")) {
+      stats.maintenance += 1;
+    }
+    if (typeText.includes("故障")) {
+      stats.fault += 1;
+    }
+  });
+
+  return stats;
+};
+
+const loadPageData = async () => {
+  userInfo.value = parseCachedUserInfo();
+
+  try {
+    const [userRes, messageRes, todoRes] = await Promise.all([
+      getLoginUserInfo(),
+      getUnreadMessageCount(),
+      getOvertimeTaskList({ pageNo: 1, pageSize: 50 }),
+    ]);
+
+    if (userRes?.code === 0 && userRes.data) {
+      userInfo.value = userRes.data;
+    }
+    if (messageRes?.code === 0) {
+      messageCount.value = messageRes.data || 0;
+    }
+    if (todoRes?.code === 0) {
+      const todoList = todoRes.data?.list || [];
+      todoStats.value = buildTodoStats(todoList);
+    }
+  } catch (error) {
+    messageCount.value = messageCount.value || 0;
+  }
+};
+
+const navigatorTo = (url) => {
+  if (!url) return;
+  uni.navigateTo({ url });
+};
+
+onShow(() => {
+  loadPageData();
+});
+</script>
+
+<style lang="scss" scoped>
+.entry-page {
+  height: 100vh;
+  background: linear-gradient(180deg, #edf4ff 0%, #f7f9fc 28%, #f6f8fb 100%);
+}
+
+.hero {
+  position: relative;
+  height: 640rpx;
+  overflow: hidden;
+}
+
+.hero-bg {
+  position: absolute;
+  inset: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.hero-mask {
+  position: absolute;
+  inset: 0;
+  background:
+    linear-gradient(
+      180deg,
+      rgba(10, 92, 222, 0.1) 0%,
+      rgba(10, 92, 222, 0.18) 100%
+    ),
+    linear-gradient(
+      180deg,
+      rgba(0, 61, 153, 0.72) 0%,
+      rgba(0, 61, 153, 0.22) 72%,
+      rgba(255, 255, 255, 0) 100%
+    );
+}
+
+.hero-content {
+  position: relative;
+  z-index: 1;
+  padding: calc(var(--status-bar-height) + 24rpx) 28rpx 0;
+}
+
+.status-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 42rpx;
+}
+
+.status-time {
+  color: #ffffff;
+  font-size: 30rpx;
+  font-weight: 700;
+  letter-spacing: 1rpx;
+}
+
+.status-icons {
+  display: flex;
+  align-items: center;
+  gap: 14rpx;
+}
+
+.signal {
+  display: flex;
+  align-items: flex-end;
+  gap: 4rpx;
+
+  text {
+    display: block;
+    width: 5rpx;
+    border-radius: 4rpx;
+    background: rgba(255, 255, 255, 0.96);
+  }
+
+  text:nth-child(1) {
+    height: 10rpx;
+  }
+
+  text:nth-child(2) {
+    height: 15rpx;
+  }
+
+  text:nth-child(3) {
+    height: 20rpx;
+  }
+
+  text:nth-child(4) {
+    height: 25rpx;
+  }
+}
+
+.battery {
+  width: 42rpx;
+  height: 22rpx;
+  padding: 2rpx;
+  border: 2rpx solid rgba(255, 255, 255, 0.92);
+  border-radius: 6rpx;
+  position: relative;
+  box-sizing: border-box;
+
+  &::after {
+    content: "";
+    position: absolute;
+    right: -5rpx;
+    top: 6rpx;
+    width: 3rpx;
+    height: 8rpx;
+    border-radius: 0 2rpx 2rpx 0;
+    background: rgba(255, 255, 255, 0.92);
+  }
+}
+
+.battery-level {
+  width: 75%;
+  height: 100%;
+  border-radius: 3rpx;
+  background: #ffffff;
+}
+
+.profile-row {
+  display: flex;
+  align-items: center;
+}
+
+.avatar-wrap {
+  width: 82rpx;
+  height: 82rpx;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.3);
+  border: 2rpx solid rgba(255, 255, 255, 0.7);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  backdrop-filter: blur(8px);
+}
+
+.avatar-text {
+  color: #ffffff;
+  font-size: 34rpx;
+  font-weight: 700;
+}
+
+.profile-main {
+  flex: 1;
+  min-width: 0;
+  margin-left: 22rpx;
+}
+
+.greeting {
+  color: #ffffff;
+  font-size: 30rpx;
+  font-weight: 700;
+  line-height: 1.2;
+  text-shadow: 0 6rpx 18rpx rgba(0, 31, 90, 0.18);
+}
+
+.project-pill {
+  display: inline-flex;
+  align-items: center;
+  gap: 12rpx;
+  max-width: 100%;
+  margin-top: 18rpx;
+  padding: 12rpx 18rpx;
+  border-radius: 18rpx;
+  background: rgba(255, 255, 255, 0.18);
+  color: #ffffff;
+  backdrop-filter: blur(8px);
+}
+
+.project-name {
+  max-width: 360rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 20rpx;
+}
+
+.notice-wrap {
+  margin-left: 12rpx;
+  padding-right: 28rpx;
+}
+
+.notice-button {
+  width: 30rpx;
+  height: 30rpx;
+  display: flex;
+
+  align-items: center;
+  justify-content: center;
+}
+
+.notice-glyph {
+  font-size: 32rpx;
+  line-height: 1;
+}
+
+.content-shell {
+  position: relative;
+  z-index: 2;
+  margin-top: -300rpx;
+  padding: 0 24rpx calc(env(safe-area-inset-bottom) + 34rpx);
+}
+
+.page-title {
+  margin: 0 6rpx 22rpx;
+  color: #071426;
+  font-size: 72rpx;
+  font-weight: 800;
+  letter-spacing: 1rpx;
+}
+
+.section-card {
+  margin-bottom: 22rpx;
+  padding: 26rpx 22rpx 24rpx;
+  border-radius: 20rpx;
+  background: rgba(255, 255, 255, 0.94);
+  box-shadow: 0 14rpx 24rpx rgba(13, 43, 91, 0.02);
+  border: 1rpx solid #eef3fc;
+}
+
+.section-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 16rpx;
+}
+
+.section-title {
+  color: #101c2e;
+  font-size: 36rpx;
+  font-weight: 700;
+}
+
+.section-tip {
+  display: flex;
+  align-items: center;
+  gap: 8rpx;
+  color: #5572a3;
+  font-size: 24rpx;
+}
+
+.core-scroll {
+  margin-top: 22rpx;
+  white-space: nowrap;
+}
+
+.core-list {
+  display: inline-flex;
+  gap: 18rpx;
+  padding-bottom: 4rpx;
+}
+
+.core-item {
+  position: relative;
+  width: 188rpx;
+  min-height: 238rpx;
+  padding: 24rpx 18rpx 20rpx;
+  border-radius: 22rpx;
+  background: #ffffff;
+  border: 1rpx solid #e5edf8;
+  box-sizing: border-box;
+}
+
+.core-item.active {
+  border-color: #246bff;
+  background: linear-gradient(180deg, #ffffff 0%, #eef5ff 100%);
+  box-shadow: inset 0 0 0 2rpx rgba(36, 107, 255, 0.08);
+}
+
+.core-icon {
+  width: 84rpx;
+  height: 84rpx;
+  border-radius: 24rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+  text {
+    font-size: 42rpx;
+    font-weight: 800;
+  }
+}
+
+.core-name {
+  margin-top: 22rpx;
+  color: #111d2f;
+  font-size: 26rpx;
+  font-weight: 700;
+  white-space: normal;
+}
+
+.core-desc {
+  margin-top: 10rpx;
+  color: #6f7f96;
+  font-size: 22rpx;
+  line-height: 1.5;
+  white-space: normal;
+}
+
+.core-indicator {
+  position: absolute;
+  left: 50%;
+  bottom: 16rpx;
+  width: 34rpx;
+  height: 8rpx;
+  margin-left: -17rpx;
+  border-radius: 999rpx;
+  background: #246bff;
+}
+
+.tool-grid {
+  display: grid;
+  grid-template-columns: repeat(5, minmax(0, 1fr));
+  gap: 18rpx;
+  margin-top: 22rpx;
+}
+
+.tool-item {
+  min-height: 140rpx;
+  padding: 22rpx 10rpx 18rpx;
+  border-radius: 20rpx;
+  background: linear-gradient(180deg, #ffffff 0%, #fbfcff 100%);
+  border: 1rpx solid #e5edf8;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  box-sizing: border-box;
+}
+
+.tool-icon {
+  width: 54rpx;
+  height: 54rpx;
+}
+
+.tool-title {
+  margin-top: 16rpx;
+  color: #111d2f;
+  font-size: 22rpx;
+  line-height: 1.3;
+  text-align: center;
+}
+
+.daily-list {
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 16rpx;
+  margin-top: 22rpx;
+}
+
+.daily-item {
+  padding: 22rpx 18rpx;
+  border-radius: 22rpx;
+  background: linear-gradient(180deg, #ffffff 0%, #fbfcff 100%);
+  border: 1rpx solid #e5edf8;
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+  min-width: 0;
+}
+
+.daily-icon {
+  width: 54rpx;
+  height: 54rpx;
+  flex-shrink: 0;
+}
+
+.daily-content {
+  flex: 1;
+  min-width: 0;
+}
+
+.daily-title {
+  color: #111d2f;
+  font-size: 26rpx;
+  font-weight: 700;
+}
+
+.daily-subtitle {
+  margin-top: 8rpx;
+  color: #6f7f96;
+  font-size: 22rpx;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.todo-list {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 18rpx;
+  margin-top: 22rpx;
+}
+
+.todo-item {
+  min-width: 0;
+  padding: 22rpx 20rpx;
+  border-radius: 22rpx;
+  background: linear-gradient(180deg, #ffffff 0%, #fbfcff 100%);
+  border: 1rpx solid #e5edf8;
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+}
+
+.todo-icon {
+  width: 58rpx;
+  height: 58rpx;
+  flex-shrink: 0;
+}
+
+.todo-content {
+  flex: 1;
+  min-width: 0;
+}
+
+.todo-title {
+  color: #111d2f;
+  font-size: 26rpx;
+  font-weight: 700;
+}
+
+.todo-subtitle {
+  margin-top: 8rpx;
+  color: #6f7f96;
+  font-size: 22rpx;
+}
+
+.todo-right {
+  display: flex;
+  align-items: flex-end;
+  gap: 6rpx;
+}
+
+.todo-count {
+  font-size: 48rpx;
+  font-weight: 800;
+  line-height: 1;
+}
+
+.todo-unit {
+  margin-bottom: 6rpx;
+  color: #6f7f96;
+  font-size: 22rpx;
+}
+</style>

+ 6 - 1
pages/home/index.vue

@@ -519,7 +519,7 @@
         </view>
         <view
           class="report-popup-item"
-          @click="navigateToRuiHengReport('/pages/ruiDuReport/daily-detail')"
+          @click="navigateToRuiHengReport('/pages/ruiHengReport/index')"
         >
           {{ $t("ruiDuReport.dailyDetail") }}
         </view>
@@ -579,6 +579,11 @@ const navigateToRuiDuReport = (url) => {
   uni.navigateTo({ url });
 };
 
+const navigateToRuiHengReport = (url) => {
+  closeRuiHengReportPopup();
+  uni.navigateTo({ url });
+};
+
 const messageCount = ref(0);
 onMounted(async () => {
   await Promise.all([

+ 177 - 0
pages/ruiHengReport/data.js

@@ -0,0 +1,177 @@
+{
+    "code": 0,
+    "data": [
+        {
+            "projectDeptId": 157,
+            "projectDeptName": "合计",
+            "teamCount": 101,
+            "sgTeamCount": 63,
+            "zbTeamCount": 13,
+            "dmTeamCount": 25,
+            "cumulativeDays": null,
+            "constructionDays": null,
+            "utilizationRate": null,
+            "hourUtilizationRate": 0.4908,
+            "yearHourUtilizationRate": 0.5789,
+            "waterInjection": 0.39,
+            "yearWaterInjection": 38.09,
+            "gasInjection": 222.86,
+            "yearGasInjection": 41473.15,
+            "sort": 0,
+            "productionSummary": null
+        },
+        {
+            "projectDeptId": 164,
+            "projectDeptName": "塔河项目部",
+            "teamCount": 49,
+            "sgTeamCount": 37,
+            "zbTeamCount": 6,
+            "dmTeamCount": 6,
+            "cumulativeDays": 49,
+            "constructionDays": 37,
+            "utilizationRate": 0.7551,
+            "hourUtilizationRate": 0.7024,
+            "yearHourUtilizationRate": 0.692,
+            "waterInjection": 0.39,
+            "yearWaterInjection": 36.98,
+            "gasInjection": 165.52,
+            "yearGasInjection": 25593.15,
+            "sort": 1,
+            "productionSummary": "三厂:施工6套设备,准备1套设备(共7套设备)\nTK1078CH,;\n二厂:施工4套设备,准备1套设备(共5套设备)\nT什10398X,;\n四厂:施工13套设备,准备6套设备(共19套设备)\nSHB1-11,D5设备6月2日16:00至6月3日16:00 ,因油压上限暂停注气24小时;\nSHB1-3,;\nSHB1-31H,;\nSHZ4-1X,6月2日接通知收拾井场,准备搬迁至SHZ4-7X井;\n雅厂:施工1套设备,准备3套设备(共4套设备)\nDLK21X,5月29日接生产指挥中心通知14点停止注气;\nYD1-2H,现场待命;\nYK16,接甲方通知待命24小时;\n"
+        },
+        {
+            "projectDeptId": 165,
+            "projectDeptName": "塔里木项目部",
+            "teamCount": 17,
+            "sgTeamCount": 11,
+            "zbTeamCount": 3,
+            "dmTeamCount": 3,
+            "cumulativeDays": 17,
+            "constructionDays": 11,
+            "utilizationRate": 0.6471,
+            "hourUtilizationRate": 0.3252,
+            "yearHourUtilizationRate": 0.8111,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 24.72,
+            "yearGasInjection": 9918.91,
+            "sort": 2,
+            "productionSummary": "哈得:施工11套设备,准备3套设备(共14套设备)\nGL301H,;\n满深502-H5,线路断电,停止注气;\n满深809,甲方电力检修 现场待命 施工0小时;\n"
+        },
+        {
+            "projectDeptId": 160,
+            "projectDeptName": "吐哈项目部",
+            "teamCount": 14,
+            "sgTeamCount": 9,
+            "zbTeamCount": 2,
+            "dmTeamCount": 3,
+            "cumulativeDays": 14,
+            "constructionDays": 9,
+            "utilizationRate": 0.6429,
+            "hourUtilizationRate": 0.3958,
+            "yearHourUtilizationRate": 0.436,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 20.78,
+            "yearGasInjection": 3840.66,
+            "sort": 3,
+            "productionSummary": null
+        },
+        {
+            "projectDeptId": 256,
+            "projectDeptName": "川庆项目部",
+            "teamCount": 6,
+            "sgTeamCount": 1,
+            "zbTeamCount": 0,
+            "dmTeamCount": 5,
+            "cumulativeDays": 6,
+            "constructionDays": 1,
+            "utilizationRate": 0.1667,
+            "hourUtilizationRate": 0.0208,
+            "yearHourUtilizationRate": 0.2743,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 0.36,
+            "yearGasInjection": 817.35,
+            "sort": 9,
+            "productionSummary": "海洋平台:施工0套设备,准备1套设备(共1套设备)\nHY2-2平台,待维修;\n西南:施工1套设备,准备3套设备(共4套设备)\n宁209H33-2,待命;\n宁209H50-3,驻地待命,等待施工通知;\n文页1井,待命;\n陕蒙:施工0套设备,准备1套设备(共1套设备)\n苏59-17-48-X1,无施工 ;\n"
+        },
+        {
+            "projectDeptId": 269,
+            "projectDeptName": "非洲项目部",
+            "teamCount": 5,
+            "sgTeamCount": 4,
+            "zbTeamCount": 0,
+            "dmTeamCount": 1,
+            "cumulativeDays": 5,
+            "constructionDays": 4,
+            "utilizationRate": 0.8,
+            "hourUtilizationRate": 0.725,
+            "yearHourUtilizationRate": 0.3962,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 10.53,
+            "yearGasInjection": 962.9,
+            "sort": 8,
+            "productionSummary": null
+        },
+        {
+            "projectDeptId": 273,
+            "projectDeptName": "南美项目部",
+            "teamCount": 1,
+            "sgTeamCount": 0,
+            "zbTeamCount": 0,
+            "dmTeamCount": 1,
+            "cumulativeDays": 1,
+            "constructionDays": null,
+            "utilizationRate": 0,
+            "hourUtilizationRate": null,
+            "yearHourUtilizationRate": 0.5098,
+            "waterInjection": 0,
+            "yearWaterInjection": 1.12,
+            "gasInjection": 0,
+            "yearGasInjection": 136.04,
+            "sort": 10,
+            "productionSummary": "巴西:施工0套设备,准备1套设备(共1套设备)\nFZB-936,现场待命;\n"
+        },
+        {
+            "projectDeptId": 275,
+            "projectDeptName": "中东项目部",
+            "teamCount": 5,
+            "sgTeamCount": 0,
+            "zbTeamCount": 1,
+            "dmTeamCount": 4,
+            "cumulativeDays": 5,
+            "constructionDays": null,
+            "utilizationRate": 0,
+            "hourUtilizationRate": null,
+            "yearHourUtilizationRate": 0.0438,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 0,
+            "yearGasInjection": 65.52,
+            "sort": 11,
+            "productionSummary": "ABQAIQ:施工0套设备,准备1套设备(共1套设备)\nABQAIQ,现场待命;\n沙特:施工0套设备,准备2套设备(共2套设备)\nS1AFANIYA,6月3日吊装回基地;\n"
+        },
+        {
+            "projectDeptId": 282,
+            "projectDeptName": "中亚项目部",
+            "teamCount": 4,
+            "sgTeamCount": 1,
+            "zbTeamCount": 1,
+            "dmTeamCount": 2,
+            "cumulativeDays": 4,
+            "constructionDays": 1,
+            "utilizationRate": 0.25,
+            "hourUtilizationRate": 0.0833,
+            "yearHourUtilizationRate": 0.0788,
+            "waterInjection": 0,
+            "yearWaterInjection": 0,
+            "gasInjection": 0.96,
+            "yearGasInjection": 138.61,
+            "sort": 12,
+            "productionSummary": null
+        }
+    ],
+    "msg": ""
+}

+ 420 - 0
pages/ruiHengReport/index.vue

@@ -0,0 +1,420 @@
+<template>
+  <view class="report-page">
+    <view class="filter-bar">
+      <view class="filter-main">
+        <text class="filter-label">统计日期</text>
+        <uni-datetime-picker
+          v-model="selectedDate"
+          class="date-picker"
+          type="date"
+          return-type="string"
+          :clear-icon="false"
+          :border="false"
+          @change="handleDateChange"
+        />
+      </view>
+      <button
+        class="filter-button"
+        type="primary"
+        size="mini"
+        @click="loadList"
+      >
+        查询
+      </button>
+    </view>
+
+    <view class="filter-tip">查询范围:{{ queryRangeText }}</view>
+
+    <scroll-view class="report-scroll" scroll-y>
+      <view v-if="loading" class="state-card">
+        <text class="state-text">数据加载中...</text>
+      </view>
+
+      <view v-else-if="!dataList.length" class="state-card empty">
+        <text class="state-text">当前日期暂无数据</text>
+      </view>
+
+      <view v-else class="report-list">
+        <view
+          v-for="item in sortedList"
+          :key="item.projectDeptId"
+          class="report-card"
+        >
+          <view class="card-header">
+            <view>
+              <view class="dept-name">{{ item.projectDeptName || "--" }}</view>
+              <view class="dept-meta">排序 {{ item.sort ?? "--" }}</view>
+            </view>
+            <view class="rate-badge">
+              {{ formatPercent(item.utilizationRate) }}
+            </view>
+          </view>
+
+          <view class="metrics-grid">
+            <view class="metric-item">
+              <text class="metric-label">队伍总数</text>
+              <text class="metric-value">{{
+                formatNumber(item.teamCount)
+              }}</text>
+            </view>
+            <view class="metric-item">
+              <text class="metric-label">施工队伍</text>
+              <text class="metric-value">{{
+                formatNumber(item.sgTeamCount)
+              }}</text>
+            </view>
+            <view class="metric-item">
+              <text class="metric-label">值班队伍</text>
+              <text class="metric-value">{{
+                formatNumber(item.zbTeamCount)
+              }}</text>
+            </view>
+            <view class="metric-item">
+              <text class="metric-label">待命队伍</text>
+              <text class="metric-value">{{
+                formatNumber(item.dmTeamCount)
+              }}</text>
+            </view>
+            <view class="metric-item">
+              <text class="metric-label">累计天数</text>
+              <text class="metric-value">{{
+                formatNumber(item.cumulativeDays)
+              }}</text>
+            </view>
+            <view class="metric-item">
+              <text class="metric-label">施工天数</text>
+              <text class="metric-value">{{
+                formatNumber(item.constructionDays)
+              }}</text>
+            </view>
+          </view>
+
+          <view class="summary-panel">
+            <view class="summary-row">
+              <text class="summary-label">小时利用率</text>
+              <text class="summary-value">
+                {{ formatPercent(item.hourUtilizationRate) }}
+              </text>
+            </view>
+            <view class="summary-row">
+              <text class="summary-label">年小时利用率</text>
+              <text class="summary-value">
+                {{ formatPercent(item.yearHourUtilizationRate) }}
+              </text>
+            </view>
+            <view class="summary-row">
+              <text class="summary-label">注水量</text>
+              <text class="summary-value">
+                {{ formatDecimal(item.waterInjection) }}
+              </text>
+            </view>
+            <view class="summary-row">
+              <text class="summary-label">年注水量</text>
+              <text class="summary-value">
+                {{ formatDecimal(item.yearWaterInjection) }}
+              </text>
+            </view>
+            <view class="summary-row">
+              <text class="summary-label">注气量</text>
+              <text class="summary-value">
+                {{ formatDecimal(item.gasInjection) }}
+              </text>
+            </view>
+            <view class="summary-row">
+              <text class="summary-label">年注气量</text>
+              <text class="summary-value">
+                {{ formatDecimal(item.yearGasInjection) }}
+              </text>
+            </view>
+          </view>
+
+          <view class="desc-panel">
+            <view class="desc-title">生产情况</view>
+            <text class="desc-text">
+              {{ item.productionSummary || "暂无生产情况说明" }}
+            </text>
+          </view>
+        </view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import { onMounted } from "vue";
+import dayjs from "dayjs";
+import { getRhRate } from "@/api/ruiHengReport";
+
+const selectedDate = ref(dayjs().subtract(1, "day").format("YYYY-MM-DD"));
+const dataList = ref([]);
+const loading = ref(false);
+
+const buildQueryParams = () => {
+  const baseDate = selectedDate.value
+    ? dayjs(selectedDate.value)
+    : dayjs().subtract(1, "day");
+
+  return {
+    createTime: [
+      baseDate.startOf("day").format("YYYY-MM-DD HH:mm:ss"),
+      baseDate.endOf("day").format("YYYY-MM-DD HH:mm:ss"),
+    ],
+  };
+};
+
+const queryRangeText = computed(() => {
+  const [startTime, endTime] = buildQueryParams().createTime;
+  return `${startTime} - ${endTime}`;
+});
+
+const sortedList = computed(() =>
+  [...dataList.value].sort((a, b) => (a.sort ?? 999999) - (b.sort ?? 999999)),
+);
+
+const loadList = async () => {
+  loading.value = true;
+  try {
+    const response = await getRhRate(buildQueryParams());
+    dataList.value = Array.isArray(response?.data) ? response.data : [];
+  } catch (error) {
+    dataList.value = [];
+    uni.showToast({
+      title: "数据加载失败",
+      icon: "none",
+    });
+  } finally {
+    loading.value = false;
+  }
+};
+
+const handleDateChange = () => {
+  loadList();
+};
+
+const formatNumber = (value) => {
+  if (value === null || value === undefined || value === "") return "--";
+  return value;
+};
+
+const formatDecimal = (value) => {
+  if (value === null || value === undefined || value === "") return "--";
+  return Number(value).toFixed(2);
+};
+
+const formatPercent = (value) => {
+  if (value === null || value === undefined || value === "") return "--";
+  return `${(Number(value) * 100).toFixed(2)}%`;
+};
+
+onMounted(() => {
+  loadList();
+});
+</script>
+
+<style lang="scss" scoped>
+.report-page {
+  min-height: 100vh;
+  padding: 12px;
+  box-sizing: border-box;
+  background:
+    radial-gradient(
+      circle at top left,
+      rgba(0, 64, 152, 0.14),
+      transparent 28%
+    ),
+    linear-gradient(180deg, #f4f7fb 0%, #eef2f8 100%);
+}
+
+.filter-bar {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  padding: 14px;
+  border-radius: 18px;
+  background: rgba(255, 255, 255, 0.94);
+  box-shadow: 0 14px 32px rgba(25, 56, 104, 0.08);
+  backdrop-filter: blur(10px);
+}
+
+.filter-main {
+  flex: 1;
+  min-width: 0;
+}
+
+.filter-label {
+  display: block;
+  margin-bottom: 8px;
+  color: #5f6f87;
+  font-size: 12px;
+  letter-spacing: 1px;
+}
+
+.date-picker {
+  padding: 0 12px;
+  border: 1px solid rgba(0, 64, 152, 0.1);
+  border-radius: 12px;
+  background: #f8fbff;
+}
+
+.filter-button {
+  width: 76px;
+  height: 40px;
+  line-height: 40px;
+  margin: 20px 0 0;
+  border-radius: 12px;
+  background: linear-gradient(135deg, #004098 0%, #1f68d8 100%);
+  font-size: 14px;
+  box-shadow: 0 10px 22px rgba(0, 64, 152, 0.22);
+}
+
+.filter-tip {
+  margin: 10px 4px 0;
+  color: #6d7c91;
+  font-size: 12px;
+}
+
+.report-scroll {
+  height: calc(100vh - 110px);
+  padding-top: 12px;
+  box-sizing: border-box;
+}
+
+.report-list {
+  display: flex;
+  flex-direction: column;
+  gap: 14px;
+  padding-bottom: 18px;
+}
+
+.report-card {
+  padding: 16px;
+  border: 1px solid rgba(0, 64, 152, 0.08);
+  border-radius: 20px;
+  background: rgba(255, 255, 255, 0.96);
+  box-shadow: 0 18px 38px rgba(31, 57, 90, 0.08);
+}
+
+.card-header {
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  gap: 12px;
+  margin-bottom: 14px;
+}
+
+.dept-name {
+  color: #122033;
+  font-size: 18px;
+  font-weight: 700;
+  line-height: 26px;
+}
+
+.dept-meta {
+  margin-top: 4px;
+  color: #7f8ca0;
+  font-size: 12px;
+}
+
+.rate-badge {
+  flex-shrink: 0;
+  min-width: 84px;
+  padding: 8px 12px;
+  border-radius: 999px;
+  background: linear-gradient(135deg, #e6f0ff 0%, #d8e7ff 100%);
+  color: #004098;
+  font-size: 14px;
+  font-weight: 700;
+  text-align: center;
+}
+
+.metrics-grid {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 10px;
+  margin-bottom: 14px;
+}
+
+.metric-item {
+  padding: 12px;
+  border-radius: 14px;
+  background: #f6f9fd;
+}
+
+.metric-label {
+  display: block;
+  color: #6e7e95;
+  font-size: 12px;
+}
+
+.metric-value {
+  display: block;
+  margin-top: 6px;
+  color: #18273b;
+  font-size: 20px;
+  font-weight: 700;
+}
+
+.summary-panel {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 8px 14px;
+  padding: 14px 0;
+  border-top: 1px solid #edf2f7;
+  border-bottom: 1px solid #edf2f7;
+}
+
+.summary-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 10px;
+}
+
+.summary-label {
+  color: #6d7c91;
+  font-size: 12px;
+}
+
+.summary-value {
+  color: #17253a;
+  font-size: 13px;
+  font-weight: 600;
+}
+
+.desc-panel {
+  padding-top: 14px;
+}
+
+.desc-title {
+  margin-bottom: 8px;
+  color: #1f2f46;
+  font-size: 14px;
+  font-weight: 700;
+}
+
+.desc-text {
+  color: #5f6f87;
+  font-size: 13px;
+  line-height: 22px;
+  white-space: pre-wrap;
+}
+
+.state-card {
+  margin-top: 18px;
+  padding: 40px 20px;
+  border-radius: 18px;
+  background: rgba(255, 255, 255, 0.92);
+  text-align: center;
+  box-shadow: 0 12px 28px rgba(30, 54, 88, 0.06);
+}
+
+.state-card.empty {
+  border: 1px dashed rgba(0, 64, 152, 0.16);
+}
+
+.state-text {
+  color: #73839a;
+  font-size: 14px;
+}
+</style>

+ 9 - 6
pages/user/login.vue

@@ -16,7 +16,8 @@
         class="login-form"
         ref="formRef"
         :modelValue="loginData"
-        :rules="loginRules">
+        :rules="loginRules"
+      >
         <uni-forms-item name="username" class="margin-bt">
           <!-- type="number" -->
           <uni-easyinput
@@ -24,7 +25,8 @@
             v-model="loginData.username"
             :placeholder="$t('login.enterUsername')"
             :placeholderStyle="placeholderStyle"
-            :styles="inputStyles" />
+            :styles="inputStyles"
+          />
         </uni-forms-item>
         <uni-forms-item name="password" class="margin-bt">
           <uni-easyinput
@@ -32,7 +34,8 @@
             v-model="loginData.password"
             :placeholder="$t('login.enterPassword')"
             :placeholderStyle="placeholderStyle"
-            :styles="inputStyles" />
+            :styles="inputStyles"
+          />
         </uni-forms-item>
       </uni-forms>
       <button type="primary" @click="formSubmit(formRef)">
@@ -240,7 +243,7 @@ onLoad(async (options) => {
     "onLoad Login",
     uni.getLocale(),
     11,
-    uni.getStorageSync("language")
+    uni.getStorageSync("language"),
   );
 
   console.log(options);
@@ -279,7 +282,7 @@ onMounted(() => {
   // console.log("isLoggedIn", isLoggedIn);
   if (isLoggedIn) {
     uni.switchTab({
-      url: "/pages/home/index",
+      url: "/pages/entry/index",
     });
   }
 });
@@ -365,7 +368,7 @@ const handleLoginSuccess = async (result) => {
       await setDeptId(res.data.user.deptId);
 
       await uni.switchTab({
-        url: "/pages/home/index",
+        url: "/pages/entry/index",
       });
     });
   }

BIN
static/entry/bg.png