From 141e304a60c73dc9d6b367fff140ffba5949bb8d Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期二, 03 二月 2026 13:52:04 +0800
Subject: [PATCH] 隐患排查上报模块开发

---
 src/pages/index.vue                                         |   17 
 src/api/safeProduction/dangerInvestigation.js               |   61 +
 src/pages.json                                              |   35 +
 src/pages/safeProduction/dangerInvestigation/acceptance.vue |  376 ++++++++++++
 src/pages/safeProduction/dangerInvestigation/detail.vue     |  446 ++++++++++++++
 src/pages/safeProduction/dangerInvestigation/view.vue       |  203 ++++++
 src/pages/safeProduction/dangerInvestigation/index.vue      |  353 +++++++++++
 src/pages/safeProduction/dangerInvestigation/rectify.vue    |  312 ++++++++++
 8 files changed, 1,799 insertions(+), 4 deletions(-)

diff --git a/src/api/safeProduction/dangerInvestigation.js b/src/api/safeProduction/dangerInvestigation.js
new file mode 100644
index 0000000..e6ec3d0
--- /dev/null
+++ b/src/api/safeProduction/dangerInvestigation.js
@@ -0,0 +1,61 @@
+// 鍙戣揣鍙拌处椤甸潰鎺ュ彛
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function dangerInvestigationListPage(query) {
+  return request({
+    url: "/safeHidden/page",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�
+export function safeHiddenAdd(query) {
+    return request({
+        url: '/safeHidden',
+        method: 'post',
+        data: query
+    })
+}
+// 淇敼瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�
+export function safeHiddenUpdate(query) {
+    return request({
+        url: '/safeHidden',
+        method: 'put',
+        data: query
+    })
+}
+// 鍒犻櫎瀹夊叏瑙勭▼涓庤祫璐ㄧ鐞�
+export function safeHiddenDel(ids) {
+    return request({
+        url: '/safeHidden/' + ids,
+        method: 'delete',
+        data: ids
+    })
+}
+
+// 鏌ヨ闄勪欢鍒楄〃
+export function fileListPage(query) {
+  return request({
+    url: "/safeHiddenFile/listPage",
+    method: "get",
+    params: query,
+  });
+}
+// 娣诲姞闄勪欢
+export function safeHiddenFileAdd(query) {
+    return request({
+        url: '/safeHiddenFile/add',
+        method: 'post',
+        data: query
+    })
+}
+// 鍒犻櫎闄勪欢
+export function safeHiddenFileDel(ids) {
+    return request({
+        url: '/safeHiddenFile/del',
+        method: 'delete',
+        data: ids
+    })
+}
\ No newline at end of file
diff --git a/src/pages.json b/src/pages.json
index b8d4389..702f25d 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -717,6 +717,41 @@
         "navigationStyle": "custom"
       }
     },
+    {
+      "path": "pages/safeProduction/dangerInvestigation/index",
+      "style": {
+        "navigationBarTitleText": "闅愭偅鎺掓煡涓婃姤",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/safeProduction/dangerInvestigation/detail",
+      "style": {
+        "navigationBarTitleText": "闅愭偅涓婃姤璇︽儏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/safeProduction/dangerInvestigation/view",
+      "style": {
+        "navigationBarTitleText": "闅愭偅璇︽儏",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/safeProduction/dangerInvestigation/rectify",
+      "style": {
+        "navigationBarTitleText": "闅愭偅鏁存敼",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/safeProduction/dangerInvestigation/acceptance",
+      "style": {
+        "navigationBarTitleText": "闅愭偅楠屾敹",
+        "navigationStyle": "custom"
+      }
+    },
   ],
   "subPackages": [
     {
diff --git a/src/pages/index.vue b/src/pages/index.vue
index dab005e..10d6a58 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -311,6 +311,14 @@
       icon: "/static/images/icon/caigoutaizhang@2x.png",
       label: "鍗遍櫓浣滀笟",
     },
+    {
+      icon: "/static/images/icon/xunjianshangchuan@2x.png",
+      label: "宸℃涓婁紶",
+    },
+    {
+      icon: "/static/images/icon/guzhangfenxi@2x.png",
+      label: "闅愭偅鎺掓煡",
+    },
   ]);
   // 鍗忓悓鍔炲叕鍔熻兘鏁版嵁
   const collaborationItems = reactive([
@@ -398,10 +406,6 @@
     {
       icon: "/static/images/icon/shbeibaoyang@2x.png",
       label: "璁惧淇濆吇",
-    },
-    {
-      icon: "/static/images/icon/xunjianshangchuan@2x.png",
-      label: "宸℃涓婁紶",
     },
     {
       icon: "/static/images/icon/guzhangfenxi@2x.png",
@@ -688,6 +692,11 @@
           url: "/pages/cooperativeOffice/collaborativeApproval/index8",
         });
         break;
+      case "闅愭偅鎺掓煡":
+        uni.navigateTo({
+          url: "/pages/safeProduction/dangerInvestigation/index",
+        });
+        break;
       default:
         uni.showToast({
           title: `鐐瑰嚮浜�${item.label}`,
diff --git a/src/pages/safeProduction/dangerInvestigation/acceptance.vue b/src/pages/safeProduction/dangerInvestigation/acceptance.vue
new file mode 100644
index 0000000..e9caa35
--- /dev/null
+++ b/src/pages/safeProduction/dangerInvestigation/acceptance.vue
@@ -0,0 +1,376 @@
+<template>
+  <view class="danger-investigation-acceptance">
+    <PageHeader title="闅愭偅楠屾敹"
+                @back="goBack" />
+    <view class="section">
+      <view class="section-title">闅愭偅淇℃伅</view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅缂栧彿</text>
+        <text class="info-value">{{ form.hiddenCode || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅绫诲瀷</text>
+        <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">椋庨櫓绛夌骇</text>
+        <text class="info-value">{{ form.riskLevel || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅鎻忚堪</text>
+        <text class="info-value">{{ form.hiddenDesc || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅鍏蜂綋浣嶇疆</text>
+        <text class="info-value">{{ form.location || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">涓婃姤浜�</text>
+        <text class="info-value">{{ form.createUserName || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">涓婃姤鏃堕棿</text>
+        <text class="info-value">{{ form.createTime || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼瀹屾垚鏈熼檺</text>
+        <text class="info-value">{{ form.rectifyTime || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼璐d换浜�</text>
+        <text class="info-value">{{ form.rectifyUserName || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼璐d换浜鸿仈绯绘柟寮�</text>
+        <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼鍏蜂綋鎺柦</text>
+        <text class="info-value">{{ form.rectifyMeasures || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">瀹為檯鏁存敼瀹屾垚鏃堕棿</text>
+        <text class="info-value">{{ form.rectifyActualTime || '-' }}</text>
+      </view>
+    </view>
+    <u-form @submit="handleSubmit"
+            ref="formRef"
+            label-width="110">
+      <!-- 楠屾敹淇℃伅 -->
+      <u-cell-group title="楠屾敹淇℃伅">
+        <u-form-item label="楠屾敹鏃堕棿"
+                     prop="verifyTime"
+                     border-bottom>
+          <u-input v-model="form.verifyTime"
+                   placeholder="璇烽�夋嫨楠屾敹鏃堕棿"
+                   disabled />
+        </u-form-item>
+        <u-form-item label="楠屾敹浜�"
+                     prop="verifyUserName"
+                     border-bottom>
+          <u-input v-model="form.verifyUserName"
+                   disabled
+                   placeholder="璇疯緭鍏ラ獙鏀朵汉" />
+        </u-form-item>
+        <u-form-item label="楠屾敹缁撴灉"
+                     prop="verifyResult"
+                     required
+                     border-bottom>
+          <u-input v-model="verifyResultName"
+                   placeholder="璇烽�夋嫨楠屾敹缁撴灉"
+                   @click="showVerifyResultSheet"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showVerifyResultSheet"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="楠屾敹鎰忚"
+                     prop="verifyRemark"
+                     required
+                     border-bottom>
+          <u-textarea v-model="form.verifyRemark"
+                      placeholder="璇疯緭鍏ラ獙鏀舵剰瑙�"
+                      :maxlength="200"
+                      count
+                      :autoHeight="true" />
+        </u-form-item>
+      </u-cell-group>
+      <!-- 鎻愪氦鎸夐挳 -->
+      <view class="footer-btns">
+        <u-button class="cancel-btn"
+                  @click="goBack">鍙栨秷</u-button>
+        <u-button class="sign-btn"
+                  type="primary"
+                  @click="handleSubmit"
+                  :loading="loading">鎻愪氦楠屾敹</u-button>
+      </view>
+    </u-form>
+    <!-- 鏃堕棿閫夋嫨鍣� -->
+    <up-datetime-picker :show="showTime"
+                        v-model="currentTime"
+                        @confirm="onTimeConfirm"
+                        @cancel="showTime = false"
+                        mode="date" />
+    <!-- 楠屾敹缁撴灉閫夋嫨鍣� -->
+    <up-action-sheet :show="verifyResultSheetVisible"
+                     :actions="verifyResultOptions"
+                     @select="handleVerifyResultSelect"
+                     title="閫夋嫨楠屾敹缁撴灉" />
+  </view>
+</template>
+
+<script setup>
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "danger-investigation-acceptance" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  import { ref, onMounted } from "vue";
+  import PageHeader from "@/components/PageHeader.vue";
+  import { safeHiddenUpdate } from "@/api/safeProduction/dangerInvestigation";
+  import useUserStore from "@/store/modules/user";
+  import dayjs from "dayjs";
+  import { onLoad } from "@dcloudio/uni-app";
+  import { useDict } from "@/utils/dict";
+
+  const { hidden_danger_type } = useDict("hidden_danger_type");
+  const userStore = useUserStore();
+
+  // 琛ㄥ崟鏁版嵁
+  const form = ref({
+    id: "",
+    hiddenCode: "",
+    hiddenDesc: "",
+    location: "",
+    rectifyTime: "",
+    rectifyActualTime: "",
+    rectifyResult: "",
+    verifyTime: "",
+    verifyRemark: "",
+    verifyResult: "",
+  });
+
+  // 椤甸潰鐘舵��
+  const loading = ref(false);
+  const formRef = ref(null);
+
+  // 鏃堕棿鐩稿叧
+  const currentTime = ref(Date.now());
+  const showTime = ref(false);
+
+  // 楠屾敹缁撴灉閫夋嫨鍣�
+  const verifyResultSheetVisible = ref(false);
+  const verifyResultName = ref("");
+  const verifyResultOptions = ref([
+    { value: "閫氳繃", name: "閫氳繃" },
+    { value: "涓嶉�氳繃", name: "涓嶉�氳繃" },
+  ]);
+  const showVerifyResultSheet = () => {
+    verifyResultSheetVisible.value = true;
+  };
+  const handleVerifyResultSelect = item => {
+    form.value.verifyResult = item.value;
+    verifyResultName.value = item.name;
+    verifyResultSheetVisible.value = false;
+  };
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    // 杩斿洖鏃舵竻闄ゆ湰鍦板瓨鍌ㄧ殑鏁版嵁
+    uni.removeStorageSync("dangerInvestigation");
+    uni.navigateBack();
+  };
+
+  // 鏄剧ず鏃堕棿閫夋嫨鍣�
+  const showTimePicker = () => {
+    showTime.value = true;
+  };
+
+  // 纭鏃堕棿閫夋嫨
+  const onTimeConfirm = e => {
+    form.value.verifyTime = dayjs(e.value).format("YYYY-MM-DD");
+    currentTime.value = e.value;
+    showTime.value = false;
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const handleSubmit = async () => {
+    if (!form.value.verifyRemark) {
+      showToast("璇疯緭鍏ラ獙鏀舵剰瑙�");
+      return;
+    }
+
+    if (!form.value.verifyResult) {
+      showToast("璇烽�夋嫨楠屾敹缁撴灉");
+      return;
+    }
+
+    try {
+      loading.value = true;
+
+      // 浣跨敤瀹夊叏娴呮嫹璐濓紝閬垮厤瀵硅薄灞曞紑鍦ㄦ煇浜涜繍琛屾椂鎶涢敊
+      const source =
+        form.value && typeof form.value === "object" ? form.value : {};
+      const submitData = {};
+      Object.keys(source).forEach(k => {
+        submitData[k] = source[k];
+      });
+      console.log("submitData", submitData);
+
+      const { code } = await safeHiddenUpdate(submitData);
+      if (code === 200) {
+        showToast("楠屾敹鎻愪氦鎴愬姛");
+        setTimeout(() => {
+          goBack();
+        }, 500);
+      } else {
+        loading.value = false;
+        showToast("楠屾敹鎻愪氦澶辫触锛岃閲嶈瘯");
+      }
+    } catch (e) {
+      loading.value = false;
+      console.error("鎻愪氦澶辫触:", e);
+      showToast("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  };
+
+  onLoad(() => {
+    // 浠庢湰鍦板瓨鍌ㄨ幏鍙栭殣鎮f暟鎹�
+    const dangerInvestigation = uni.getStorageSync("dangerInvestigation");
+    if (dangerInvestigation && dangerInvestigation.id) {
+      form.value = dangerInvestigation;
+      console.log("form.value", form.value);
+    } else {
+      showToast("鏆傛棤闅愭偅鏁版嵁");
+    }
+  });
+
+  // 鍒濆鍖栭〉闈㈡暟鎹�
+  const initPageData = () => {
+    // 璁剧疆榛樿楠屾敹鏃堕棿涓哄綋鍓嶆椂闂�
+    if (!form.value.verifyTime) {
+      form.value.verifyTime = dayjs().format("YYYY-MM-DD");
+      currentTime.value = Date.now();
+    }
+    // 璁剧疆宸查�夐獙鏀剁粨鏋滅殑鏄剧ず鏂囨湰
+    if (form.value.verifyResult) {
+      verifyResultName.value =
+        verifyResultOptions.value.find(
+          item => item.value === form.value.verifyResult
+        )?.name || "";
+    }
+    // 璁剧疆楠屾敹浜�
+    if (!form.value.verifyUserName) {
+      userStore.getInfo().then(res => {
+        form.value.verifyUserId = res.user.userId;
+        form.value.verifyUserName = res.user.nickName;
+      });
+    }
+    console.log("form.value", form.value);
+  };
+
+  onMounted(() => {
+    initPageData();
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "@/static/scss/form-common.scss";
+  .danger-investigation-acceptance {
+    min-height: 100vh;
+    background-color: #f8f9fa;
+    padding-bottom: 160rpx;
+  }
+  .footer-btns {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    padding: 0.75rem 0;
+    box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05);
+    z-index: 1000;
+  }
+
+  .cancel-btn {
+    font-weight: 400;
+    font-size: 1rem;
+    color: #666;
+    background: #f5f5f5;
+    border: 1px solid #ddd;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+
+  .sign-btn {
+    font-weight: 500;
+    font-size: 1rem;
+    color: #fff;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    border: none;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+
+  .section {
+    background-color: #ffffff;
+    margin-bottom: 16px;
+    overflow: hidden;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+  }
+
+  .section-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    padding: 16px 16px 12px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .info-item {
+    display: flex;
+    padding: 14px 16px;
+    border-bottom: 1px solid #f8f8f8;
+    align-items: flex-start;
+  }
+
+  .info-item:last-child {
+    border-bottom: none;
+  }
+
+  .info-label {
+    font-size: 14px;
+    color: #666666;
+    min-width: 80px;
+    flex-shrink: 0;
+    line-height: 22px;
+  }
+
+  .info-value {
+    font-size: 14px;
+    color: #333333;
+    flex: 1;
+    line-height: 22px;
+    text-align: right;
+  }
+
+  .multi-line {
+    text-align: left;
+    word-break: break-all;
+    line-height: 1.6;
+  }
+
+  .remark-item {
+    padding-bottom: 16px;
+  }
+</style>
\ No newline at end of file
diff --git a/src/pages/safeProduction/dangerInvestigation/detail.vue b/src/pages/safeProduction/dangerInvestigation/detail.vue
new file mode 100644
index 0000000..1bff840
--- /dev/null
+++ b/src/pages/safeProduction/dangerInvestigation/detail.vue
@@ -0,0 +1,446 @@
+<template>
+  <view class="danger-investigation-detail">
+    <PageHeader :title="isEdit ? '缂栬緫闅愭偅' : '鏂板闅愭偅'"
+                @back="goBack" />
+    <u-form @submit="handleSubmit"
+            ref="formRef"
+            label-width="110">
+      <!-- 闅愭偅淇℃伅 -->
+      <u-cell-group title="闅愭偅淇℃伅">
+        <u-form-item label="闅愭偅缂栧彿"
+                     prop="hiddenCode"
+                     border-bottom>
+          <u-input v-model="form.hiddenCode"
+                   placeholder="绯荤粺鑷姩鐢熸垚"
+                   readonly />
+        </u-form-item>
+        <u-form-item label="闅愭偅绫诲瀷"
+                     prop="type"
+                     required
+                     border-bottom>
+          <u-input v-model="hiddenTypeName"
+                   placeholder="璇烽�夋嫨闅愭偅绫诲瀷"
+                   @click="showHiddenTypeSheet"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showHiddenTypeSheet"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="椋庨櫓绛夌骇"
+                     prop="riskLevel"
+                     required
+                     border-bottom>
+          <u-input v-model="riskLevelName"
+                   placeholder="璇烽�夋嫨椋庨櫓绛夌骇"
+                   @click="showRiskLevelSheet"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showRiskLevelSheet"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="闅愭偅鎻忚堪"
+                     prop="hiddenDesc"
+                     required
+                     border-bottom>
+          <u-textarea v-model="form.hiddenDesc"
+                      placeholder="璇疯緭鍏ラ殣鎮f弿杩�"
+                      :maxlength="200"
+                      count
+                      :autoHeight="true" />
+        </u-form-item>
+        <u-form-item label="闅愭偅鍏蜂綋浣嶇疆"
+                     prop="location"
+                     required
+                     border-bottom>
+          <u-input v-model="form.location"
+                   placeholder="璇疯緭鍏ラ殣鎮e叿浣撲綅缃�" />
+        </u-form-item>
+        <u-form-item label="鏁存敼瀹屾垚鏈熼檺"
+                     prop="rectifyTime"
+                     required
+                     border-bottom>
+          <u-input v-model="form.rectifyTime"
+                   placeholder="璇烽�夋嫨鏁存敼瀹屾垚鏈熼檺"
+                   @click="showTimePicker" />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showTimePicker"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="鏁存敼璐d换浜�"
+                     prop="rectifyUserName"
+                     required
+                     border-bottom>
+          <u-input v-model="form.rectifyUserName"
+                   placeholder="璇烽�夋嫨鏁存敼璐d换浜�"
+                   @click="showPrincipalSheet"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showPrincipalSheet"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="涓婃姤浜�"
+                     prop="createUserName"
+                     border-bottom>
+          <u-input v-model="form.createUserName"
+                   disabled
+                   placeholder="璇疯緭鍏ヤ笂鎶ヤ汉" />
+        </u-form-item>
+        <u-form-item label="涓婃姤鏃堕棿"
+                     prop="createTime"
+                     border-bottom>
+          <u-input v-model="form.createTime"
+                   disabled
+                   placeholder="璇疯緭鍏ヤ笂鎶ユ椂闂�" />
+        </u-form-item>
+      </u-cell-group>
+      <!-- 鎻愪氦鎸夐挳 -->
+      <view class="footer-btns">
+        <u-button class="cancel-btn"
+                  @click="goBack">鍙栨秷</u-button>
+        <u-button class="sign-btn"
+                  type="primary"
+                  @click="handleSubmit"
+                  :loading="loading">{{ isEdit ? '淇濆瓨淇敼' : '鎻愪氦' }}</u-button>
+      </view>
+    </u-form>
+    <!-- 鏃堕棿閫夋嫨鍣� -->
+    <up-datetime-picker :show="showTime"
+                        v-model="currentTime"
+                        @confirm="onTimeConfirm"
+                        @cancel="showTime = false"
+                        mode="date" />
+    <!-- 闅愭偅绫诲瀷閫夋嫨鍣� -->
+    <up-action-sheet :show="hiddenTypeSheetVisible"
+                     :actions="hiddenTypeOptions"
+                     @select="handleHiddenTypeSelect"
+                     title="閫夋嫨闅愭偅绫诲瀷" />
+    <!-- 椋庨櫓绛夌骇閫夋嫨鍣� -->
+    <up-action-sheet :show="riskLevelSheetVisible"
+                     :actions="riskLevelOptions"
+                     @select="handleRiskLevelSelect"
+                     title="閫夋嫨椋庨櫓绛夌骇" />
+    <!-- 鏁存敼璐d换浜洪�夋嫨鍣� -->
+    <up-action-sheet :show="principalSheetVisible"
+                     :actions="principalOptions"
+                     @select="handlePrincipalSelect"
+                     title="閫夋嫨鏁存敼璐d换浜�" />
+  </view>
+</template>
+
+<script setup>
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "danger-investigation-detail" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  import { ref, onMounted } from "vue";
+  import PageHeader from "@/components/PageHeader.vue";
+  import {
+    safeHiddenAdd,
+    safeHiddenUpdate,
+  } from "@/api/safeProduction/dangerInvestigation";
+  import { userListNoPageByTenantId } from "@/api/system/user";
+  import useUserStore from "@/store/modules/user";
+  import { useDict } from "@/utils/dict";
+  import dayjs from "dayjs";
+  import { onLoad } from "@dcloudio/uni-app";
+
+  // 鑾峰彇瀛楀吀鏁版嵁
+  const { hidden_danger_type } = useDict("hidden_danger_type");
+
+  const userStore = useUserStore();
+
+  // 琛ㄥ崟鏁版嵁
+  const form = ref({
+    hiddenCode: "",
+    type: "",
+    riskLevel: "",
+    hiddenDesc: "",
+    location: "",
+    rectifyTime: "",
+    rectifyUserName: "",
+    rectifyUserMobile: "",
+    rectifyMeasures: "",
+  });
+
+  // 椤甸潰鐘舵��
+  const loading = ref(false);
+  const formRef = ref(null);
+  const isEdit = ref(false);
+
+  // 鏃堕棿鐩稿叧
+  const currentTime = ref(Date.now());
+  const showTime = ref(false);
+
+  // 闅愭偅绫诲瀷閫夋嫨鍣�
+  const hiddenTypeSheetVisible = ref(false);
+  const hiddenTypeName = ref("");
+  const hiddenTypeOptions = ref([]);
+  const showHiddenTypeSheet = () => {
+    hiddenTypeSheetVisible.value = true;
+  };
+  const handleHiddenTypeSelect = item => {
+    form.value.type = item.value;
+    hiddenTypeName.value = item.name;
+    hiddenTypeSheetVisible.value = false;
+  };
+
+  // 椋庨櫓绛夌骇閫夋嫨鍣�
+  const riskLevelSheetVisible = ref(false);
+  const riskLevelName = ref("");
+  const riskLevelOptions = ref([]);
+  const showRiskLevelSheet = () => {
+    riskLevelSheetVisible.value = true;
+  };
+  const handleRiskLevelSelect = item => {
+    form.value.riskLevel = item.value;
+    riskLevelName.value = item.name;
+    riskLevelSheetVisible.value = false;
+  };
+
+  // 鏁存敼璐d换浜洪�夋嫨鍣�
+  const principalSheetVisible = ref(false);
+  const userList = ref([]);
+  const principalOptions = ref([]);
+  const showPrincipalSheet = () => {
+    if (principalOptions.value.length === 0) {
+      getUserList();
+    } else {
+      principalSheetVisible.value = true;
+    }
+  };
+  const handlePrincipalSelect = item => {
+    form.value.rectifyUserId = item.value;
+    form.value.rectifyUserName = item.name;
+    form.value.rectifyUserMobile = item.mobile;
+    principalSheetVisible.value = false;
+  };
+
+  // 鑾峰彇鐢ㄦ埛鍒楄〃
+  const getUserList = () => {
+    userListNoPageByTenantId().then(res => {
+      if (res.code === 200) {
+        userList.value = res.data;
+        principalOptions.value = res.data.map(user => ({
+          value: user.userId,
+          name: user.nickName,
+          mobile: user.phonenumber,
+        }));
+        principalSheetVisible.value = true;
+      }
+    });
+  };
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    // 杩斿洖鏃舵竻闄ゆ湰鍦板瓨鍌ㄧ殑鏁版嵁
+    uni.removeStorageSync("dangerInvestigation");
+    uni.navigateBack();
+  };
+
+  // 鏄剧ず鏃堕棿閫夋嫨鍣�
+  const showTimePicker = () => {
+    showTime.value = true;
+  };
+
+  // 纭鏃堕棿閫夋嫨
+  const onTimeConfirm = e => {
+    form.value.rectifyTime = dayjs(e.value).format("YYYY-MM-DD");
+    currentTime.value = e.value;
+    showTime.value = false;
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const handleSubmit = async () => {
+    console.log("form.value", form.value);
+    if (!form.value.type) {
+      showToast("璇烽�夋嫨闅愭偅绫诲瀷");
+      return;
+    }
+
+    if (!form.value.riskLevel) {
+      showToast("璇烽�夋嫨椋庨櫓绛夌骇");
+      return;
+    }
+
+    if (!form.value.hiddenDesc) {
+      showToast("璇疯緭鍏ラ殣鎮f弿杩�");
+      return;
+    }
+
+    if (!form.value.location) {
+      showToast("璇疯緭鍏ラ殣鎮e叿浣撲綅缃�");
+      return;
+    }
+
+    if (!form.value.rectifyTime) {
+      showToast("璇烽�夋嫨鏁存敼瀹屾垚鏈熼檺");
+      return;
+    }
+
+    if (!form.value.rectifyUserName) {
+      showToast("璇烽�夋嫨鏁存敼璐d换浜�");
+      return;
+    }
+
+    if (!form.value.rectifyUserMobile) {
+      showToast("璇疯緭鍏ユ暣鏀硅矗浠讳汉鑱旂郴鏂瑰紡");
+      return;
+    }
+
+    try {
+      loading.value = true;
+
+      // 浣跨敤瀹夊叏娴呮嫹璐濓紝閬垮厤瀵硅薄灞曞紑鍦ㄦ煇浜涜繍琛屾椂鎶涢敊
+      const source =
+        form.value && typeof form.value === "object" ? form.value : {};
+      const submitData = {};
+      Object.keys(source).forEach(k => {
+        submitData[k] = source[k];
+      });
+      console.log("submitData", submitData);
+      if (isEdit.value) {
+        const { code } = await safeHiddenUpdate(submitData);
+        if (code === 200) {
+          showToast("淇敼鎴愬姛");
+          setTimeout(() => {
+            goBack();
+          }, 500);
+        } else {
+          loading.value = false;
+          showToast("淇敼澶辫触锛岃閲嶈瘯");
+        }
+      } else {
+        const { code } = await safeHiddenAdd(submitData);
+        if (code === 200) {
+          showToast("鏂板鎴愬姛");
+          setTimeout(() => {
+            goBack();
+          }, 500);
+        } else {
+          loading.value = false;
+          showToast("鏂板澶辫触锛岃閲嶈瘯");
+        }
+      }
+    } catch (e) {
+      loading.value = false;
+      console.error("鎻愪氦澶辫触:", e);
+      showToast("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  };
+
+  onLoad(() => {
+    // 缂栬緫闅愭偅鏃讹紝浠庢湰鍦板瓨鍌ㄨ幏鍙栨暟鎹�
+    const dangerInvestigation = uni.getStorageSync("dangerInvestigation");
+    if (dangerInvestigation && dangerInvestigation.id) {
+      form.value = dangerInvestigation;
+      isEdit.value = true;
+    } else {
+      isEdit.value = false;
+    }
+    userStore.getInfo().then(res => {
+      form.value.createUser = res.user.userId;
+      form.value.createUserName = res.user.nickName;
+    });
+    form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  });
+
+  // 鍒濆鍖栭〉闈㈡暟鎹�
+  const initPageData = () => {
+    // 璁剧疆榛樿鏁存敼瀹屾垚鏈熼檺涓哄綋鍓嶆椂闂�
+    if (!isEdit.value) {
+      form.value.rectifyTime = dayjs().format("YYYY-MM-DD");
+      currentTime.value = Date.now();
+    }
+  };
+
+  onMounted(() => {
+    initPageData();
+    // 鍒濆鍖栭�夐」鏁版嵁
+    hiddenTypeOptions.value = hidden_danger_type.value.map(item => ({
+      value: item.value,
+      name: item.label,
+    }));
+    riskLevelOptions.value = [
+      {
+        value: "閲嶅ぇ椋庨櫓",
+        name: "閲嶅ぇ椋庨櫓",
+      },
+      {
+        value: "杈冨ぇ椋庨櫓",
+        name: "杈冨ぇ椋庨櫓",
+      },
+      {
+        value: "涓�鑸闄�",
+        name: "涓�鑸闄�",
+      },
+      {
+        value: "浣庨闄�",
+        name: "浣庨闄�",
+      },
+    ];
+    // 璁剧疆宸查�夊�肩殑鏄剧ず鏂囨湰
+    if (form.value.type) {
+      hiddenTypeName.value =
+        hiddenTypeOptions.value.find(item => item.value == form.value.type)
+          ?.name || "";
+    }
+    if (form.value.riskLevel) {
+      riskLevelName.value =
+        riskLevelOptions.value.find(item => item.value == form.value.riskLevel)
+          ?.name || "";
+    }
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "@/static/scss/form-common.scss";
+  .danger-investigation-detail {
+    min-height: 100vh;
+    background-color: #f8f9fa;
+  }
+
+  .footer-btns {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    padding: 0.75rem 0;
+    box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05);
+    z-index: 1000;
+  }
+
+  .cancel-btn {
+    font-weight: 400;
+    font-size: 1rem;
+    color: #666;
+    background: #f5f5f5;
+    border: 1px solid #ddd;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+
+  .sign-btn {
+    font-weight: 500;
+    font-size: 1rem;
+    color: #fff;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    border: none;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+</style>
\ No newline at end of file
diff --git a/src/pages/safeProduction/dangerInvestigation/index.vue b/src/pages/safeProduction/dangerInvestigation/index.vue
new file mode 100644
index 0000000..d4e32ba
--- /dev/null
+++ b/src/pages/safeProduction/dangerInvestigation/index.vue
@@ -0,0 +1,353 @@
+<template>
+  <view class="sales-accoun">
+    <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+    <PageHeader title="闅愭偅鎺掓煡涓婃姤"
+                @back="goBack" />
+    <!-- 鎼滅储鍜岀瓫閫夊尯鍩� -->
+    <!-- <view class="search-section">
+      <view class="search-bar">
+        <view class="search-input">
+          <up-input class="search-text"
+                    placeholder="璇疯緭鍏ュ嵄闄╂簮鍚嶇О"
+                    v-model="customerName"
+                    @blur="getList"
+                    clearable />
+        </view>
+        <view class="filter-button"
+              @click="getList">
+          <u-icon name="search"
+                  size="24"
+                  color="#999"></u-icon>
+        </view>
+      </view>
+    </view> -->
+    <!-- 鎷滆璁板綍鍒楄〃 -->
+    <view class="ledger-list"
+          v-if="visitList.length > 0">
+      <view v-for="(item, index) in visitList"
+            :key="index">
+        <view class="ledger-item">
+          <view class="item-header">
+            <view class="item-left">
+              <view class="document-icon">
+                <up-icon name="file-text"
+                         size="16"
+                         color="#ffffff"></up-icon>
+              </view>
+              <text class="item-id">闅愭偅缂栧彿锛歿{ item.hiddenCode }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="item-details"
+                @click="viewDetail(item)">
+            <view class="detail-row">
+              <text class="detail-label">闅愭偅鎻忚堪</text>
+              <text class="detail-value">{{ item.hiddenDesc || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">闅愭偅绫诲瀷</text>
+              <text class="detail-value">{{ hidden_danger_type.find(i => String(i.value) === String(item.type))?.label || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">椋庨櫓绛夌骇</text>
+              <u-tag :type="getRiskLevelType(item.riskLevel)">
+                {{ item.riskLevel || '-' }}
+              </u-tag>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">闅愭偅鍏蜂綋浣嶇疆</text>
+              <text class="detail-value">{{ item.location || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">涓婃姤浜�</text>
+              <text class="detail-value">{{ item.createUserName || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">涓婃姤鏃堕棿</text>
+              <text class="detail-value">{{ item.createTime || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鏁存敼瀹屾垚鏈熼檺</text>
+              <text class="detail-value">{{ item.rectifyTime || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鏁存敼璐d换浜�</text>
+              <text class="detail-value">{{ item.rectifyUserName || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鏁存敼璐d换浜鸿仈绯绘柟寮�</text>
+              <text class="detail-value">{{ item.rectifyUserMobile || '-' }}</text>
+            </view>
+            <view v-if="item.rectifyActualTime"
+                  class="detail-row">
+              <text class="detail-label">鏁存敼鍏蜂綋鎺柦</text>
+              <text class="detail-value">{{ item.rectifyMeasures || '-' }}</text>
+            </view>
+            <view v-if="item.rectifyActualTime"
+                  class="detail-row">
+              <text class="detail-label">瀹為檯鏁存敼瀹屾垚鏃堕棿</text>
+              <text class="detail-value">{{ item.rectifyActualTime || '-' }}</text>
+            </view>
+            <view v-if="item.verifyTime"
+                  class="detail-row">
+              <text class="detail-label">楠屾敹鎰忚</text>
+              <text class="detail-value">{{ item.verifyRemark || '-' }}</text>
+            </view>
+            <view v-if="item.verifyTime"
+                  class="detail-row">
+              <text class="detail-label">楠屾敹鏃堕棿</text>
+              <text class="detail-value">{{ item.verifyTime || '-' }}</text>
+            </view>
+            <view v-if="item.verifyTime"
+                  class="detail-row">
+              <text class="detail-label">楠屾敹浜�</text>
+              <text class="detail-value">{{ item.verifyUserName || '-' }}</text>
+            </view>
+            <view v-if="item.verifyTime"
+                  class="detail-row">
+              <text class="detail-label">楠屾敹缁撴灉</text>
+              <text class="detail-value">{{ item.verifyResult || '-' }}</text>
+            </view>
+          </view>
+          <!-- 鎸夐挳鍖哄煙 -->
+          <view class="action-buttons">
+            <!-- <u-button type="info"
+                      size="small"
+                      class="action-btn"
+                      @click="viewDetail(item)">
+              鏌ョ湅璇︽儏
+            </u-button> -->
+            <u-button type="primary"
+                      size="small"
+                      class="action-btn"
+                      @click="editVisit(item)">
+              缂栬緫
+            </u-button>
+            <u-button type="warning"
+                      size="small"
+                      class="action-btn"
+                      :disabled="item.isRectify"
+                      @click="rectifyVisit(item)">
+              鏁存敼
+            </u-button>
+            <u-button type="success"
+                      size="small"
+                      class="action-btn"
+                      :disabled="!item.rectifyActualTime"
+                      @click="acceptanceVisit(item)">
+              楠屾敹
+            </u-button>
+            <u-button type="error"
+                      size="small"
+                      class="action-btn"
+                      @click="deleteVisit(item)">
+              鍒犻櫎
+            </u-button>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view v-else
+          class="no-data">
+      <text>鏆傛棤鎷滆璁板綍</text>
+    </view>
+    <!-- 娴姩鏂板鎸夐挳 -->
+    <view class="fab-button"
+          @click="addVisit">
+      <up-icon name="plus"
+               size="24"
+               color="#ffffff"></up-icon>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  import { ref, onMounted } from "vue";
+
+  import { onShow } from "@dcloudio/uni-app";
+  import PageHeader from "@/components/PageHeader.vue";
+  import {
+    dangerInvestigationListPage,
+    safeHiddenDel,
+  } from "@/api/safeProduction/dangerInvestigation";
+  import useUserStore from "@/store/modules/user";
+  import { useDict } from "@/utils/dict";
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "client-visit-index" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+  const getRiskLevelType = riskLevel => {
+    const typeMap = {
+      浣庨闄�: "info",
+      涓�鑸闄�: "info",
+      杈冨ぇ椋庨櫓: "warning",
+      閲嶅ぇ椋庨櫓: "error",
+    };
+    return typeMap[riskLevel] || "info";
+  };
+
+  import dayjs from "dayjs";
+
+  const userStore = useUserStore();
+
+  // 鎼滅储鍏抽敭璇�
+  const customerName = ref("");
+
+  // 鎷滆璁板綍鏁版嵁
+  const visitList = ref([]);
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    uni.navigateBack();
+  };
+
+  // 鏌ヨ鍒楄〃
+  const getList = () => {
+    showLoadingToast("鍔犺浇涓�...");
+    const params = {
+      current: -1,
+      size: -1,
+    };
+    dangerInvestigationListPage(params)
+      .then(res => {
+        visitList.value = res.records || res.data?.records || [];
+        userStore.getInfo().then(res => {
+          visitList.value.forEach(item => {
+            console.log(item.rectifyUserId, res.user.userId);
+            if (Number(item.rectifyUserId) != Number(res.user.userId)) {
+              item.isRectify = true;
+            } else {
+              item.isRectify = false;
+            }
+          });
+        });
+
+        closeToast();
+      })
+      .catch(() => {
+        closeToast();
+        showToast("鑾峰彇鏁版嵁澶辫触");
+      });
+  };
+
+  // 鏄剧ず鍔犺浇鎻愮ず
+  const showLoadingToast = message => {
+    uni.showLoading({
+      title: message,
+      mask: true,
+    });
+  };
+
+  // 鍏抽棴鎻愮ず
+  const closeToast = () => {
+    uni.hideLoading();
+  };
+
+  // 鏂板闅愭偅
+  const addVisit = () => {
+    uni.setStorageSync("dangerInvestigation", {});
+    uni.navigateTo({
+      url: "/pages/safeProduction/dangerInvestigation/detail",
+    });
+  };
+  // 缂栬緫闅愭偅
+  const editVisit = item => {
+    uni.setStorageSync("dangerInvestigation", item);
+    uni.navigateTo({
+      url: "/pages/safeProduction/dangerInvestigation/detail",
+    });
+  };
+  // 鏁存敼闅愭偅
+  const rectifyVisit = item => {
+    uni.setStorageSync("dangerInvestigation", item);
+    uni.navigateTo({
+      url: "/pages/safeProduction/dangerInvestigation/rectify",
+    });
+  };
+  // 楠屾敹闅愭偅
+  const acceptanceVisit = item => {
+    uni.setStorageSync("dangerInvestigation", item);
+    uni.navigateTo({
+      url: "/pages/safeProduction/dangerInvestigation/acceptance",
+    });
+  };
+  // 鍒犻櫎闅愭偅
+  const deleteVisit = item => {
+    uni.showModal({
+      title: "鍒犻櫎纭",
+      content: `纭畾瑕佸垹闄よ闅愭偅鍚楋紵`,
+      success: res => {
+        if (res.confirm) {
+          deleteClientVisit(item.id);
+        }
+      },
+    });
+  };
+  const { hidden_danger_type } = useDict("hidden_danger_type");
+  // 鍒犻櫎闅愭偅璁板綍
+  const deleteClientVisit = id => {
+    showLoadingToast("鍒犻櫎涓�...");
+    safeHiddenDel([id])
+      .then(() => {
+        closeToast();
+        showToast("鍒犻櫎鎴愬姛");
+        getList();
+      })
+      .catch(() => {
+        closeToast();
+        showToast("鍒犻櫎澶辫触");
+      });
+  };
+  // 鏌ョ湅璇︽儏
+  const viewDetail = item => {
+    uni.setStorageSync("dangerInvestigation", item);
+    uni.navigateTo({
+      url: "/pages/safeProduction/dangerInvestigation/view",
+    });
+  };
+
+  onMounted(() => {
+    getList();
+  });
+
+  onShow(() => {
+    getList();
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "../../../styles/sales-common.scss";
+
+  // 椤甸潰鐗瑰畾鐨勬牱寮忚鐩�
+  .sales-accoun {
+    min-height: 100vh;
+    background: #f8f9fa;
+    position: relative;
+    padding-bottom: 80px;
+  }
+
+  // 鐗瑰畾鐨勫浘鏍囨牱寮�
+  .document-icon {
+    background: #667eea; // 淇濇寔椤甸潰鐗规湁鐨勮儗鏅壊
+  }
+
+  // 鐗规湁鏍峰紡
+  .visit-status {
+    display: flex;
+    align-items: center;
+  }
+
+  .detail-value {
+    word-break: break-all; // 淇濈暀椤甸潰鐗规湁鐨勬枃鏈崲琛屾牱寮�
+  }
+
+  // 鐗瑰畾鐨勬诞鍔ㄦ寜閽牱寮�
+  .fab-button {
+    background: #667eea; // 淇濇寔椤甸潰鐗规湁鐨勮儗鏅壊
+    box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // 淇濇寔椤甸潰鐗规湁鐨勯槾褰辨晥鏋�
+  }
+</style>
+
diff --git a/src/pages/safeProduction/dangerInvestigation/rectify.vue b/src/pages/safeProduction/dangerInvestigation/rectify.vue
new file mode 100644
index 0000000..1e814ec
--- /dev/null
+++ b/src/pages/safeProduction/dangerInvestigation/rectify.vue
@@ -0,0 +1,312 @@
+<template>
+  <view class="danger-investigation-rectify">
+    <PageHeader title="闅愭偅鏁存敼"
+                @back="goBack" />
+    <view class="section">
+      <view class="section-title">闅愭偅淇℃伅</view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅缂栧彿</text>
+        <text class="info-value">{{ form.hiddenCode || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅绫诲瀷</text>
+        <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">椋庨櫓绛夌骇</text>
+        <text class="info-value">{{ form.riskLevel || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅鎻忚堪</text>
+        <text class="info-value">{{ form.hiddenDesc || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">闅愭偅鍏蜂綋浣嶇疆</text>
+        <text class="info-value">{{ form.location || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">涓婃姤浜�</text>
+        <text class="info-value">{{ form.createUserName || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">涓婃姤鏃堕棿</text>
+        <text class="info-value">{{ form.createTime || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼瀹屾垚鏈熼檺</text>
+        <text class="info-value">{{ form.rectifyTime || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼璐d换浜�</text>
+        <text class="info-value">{{ form.rectifyUserName || '-' }}</text>
+      </view>
+      <view class="info-item">
+        <text class="info-label">鏁存敼璐d换浜鸿仈绯绘柟寮�</text>
+        <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text>
+      </view>
+    </view>
+    <u-form @submit="handleSubmit"
+            ref="formRef"
+            label-width="130">
+      <!-- 鏁存敼淇℃伅 -->
+      <u-cell-group title="鏁存敼淇℃伅">
+        <u-form-item label="瀹為檯鏁存敼瀹屾垚鏃堕棿"
+                     prop="rectifyActualTime"
+                     required
+                     border-bottom>
+          <u-input v-model="form.rectifyActualTime"
+                   placeholder="璇烽�夋嫨瀹為檯鏁存敼瀹屾垚鏃堕棿"
+                   @click="showTimePicker" />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showTimePicker"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="鏁存敼鍏蜂綋鎺柦"
+                     required
+                     border-bottom>
+          <u-textarea v-model="form.rectifyMeasures"
+                      readonly
+                      :autoHeight="true" />
+        </u-form-item>
+      </u-cell-group>
+      <!-- 鎻愪氦鎸夐挳 -->
+      <view class="footer-btns">
+        <u-button class="cancel-btn"
+                  @click="goBack">鍙栨秷</u-button>
+        <u-button class="sign-btn"
+                  type="primary"
+                  @click="handleSubmit"
+                  :loading="loading">鎻愪氦鏁存敼</u-button>
+      </view>
+    </u-form>
+    <!-- 鏃堕棿閫夋嫨鍣� -->
+    <up-datetime-picker :show="showTime"
+                        v-model="currentTime"
+                        @confirm="onTimeConfirm"
+                        @cancel="showTime = false"
+                        mode="date" />
+  </view>
+</template>
+
+<script setup>
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "danger-investigation-rectify" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  import { ref, onMounted } from "vue";
+  import PageHeader from "@/components/PageHeader.vue";
+  import { safeHiddenUpdate } from "@/api/safeProduction/dangerInvestigation";
+  import useUserStore from "@/store/modules/user";
+  import dayjs from "dayjs";
+  import { onLoad } from "@dcloudio/uni-app";
+  import { useDict } from "@/utils/dict";
+
+  const userStore = useUserStore();
+  const { hidden_danger_type } = useDict("hidden_danger_type");
+  // 琛ㄥ崟鏁版嵁
+  const form = ref({
+    id: "",
+    hiddenCode: "",
+    hiddenDesc: "",
+    location: "",
+    rectifyTime: "",
+    rectifyUserName: "",
+    rectifyUserMobile: "",
+    rectifyMeasures: "",
+    rectifyActualTime: "",
+    rectifyResult: "",
+  });
+
+  // 椤甸潰鐘舵��
+  const loading = ref(false);
+  const formRef = ref(null);
+
+  // 鏃堕棿鐩稿叧
+  const currentTime = ref(Date.now());
+  const showTime = ref(false);
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    // 杩斿洖鏃舵竻闄ゆ湰鍦板瓨鍌ㄧ殑鏁版嵁
+    uni.removeStorageSync("dangerInvestigation");
+    uni.navigateBack();
+  };
+
+  // 鏄剧ず鏃堕棿閫夋嫨鍣�
+  const showTimePicker = () => {
+    showTime.value = true;
+  };
+
+  // 纭鏃堕棿閫夋嫨
+  const onTimeConfirm = e => {
+    form.value.rectifyActualTime = dayjs(e.value).format("YYYY-MM-DD");
+    currentTime.value = e.value;
+    showTime.value = false;
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const handleSubmit = async () => {
+    if (!form.value.rectifyActualTime) {
+      showToast("璇烽�夋嫨瀹為檯鏁存敼瀹屾垚鏃堕棿");
+      return;
+    }
+    if (!form.value.rectifyMeasures) {
+      showToast("璇疯緭鍏ユ暣鏀瑰叿浣撴帾鏂�");
+      return;
+    }
+
+    try {
+      loading.value = true;
+
+      // 浣跨敤瀹夊叏娴呮嫹璐濓紝閬垮厤瀵硅薄灞曞紑鍦ㄦ煇浜涜繍琛屾椂鎶涢敊
+      const source =
+        form.value && typeof form.value === "object" ? form.value : {};
+      const submitData = {};
+      Object.keys(source).forEach(k => {
+        submitData[k] = source[k];
+      });
+      console.log("submitData", submitData);
+
+      const { code } = await safeHiddenUpdate(submitData);
+      if (code === 200) {
+        showToast("鏁存敼鎻愪氦鎴愬姛");
+        setTimeout(() => {
+          goBack();
+        }, 500);
+      } else {
+        loading.value = false;
+        showToast("鏁存敼鎻愪氦澶辫触锛岃閲嶈瘯");
+      }
+    } catch (e) {
+      loading.value = false;
+      console.error("鎻愪氦澶辫触:", e);
+      showToast("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  };
+
+  onLoad(() => {
+    // 浠庢湰鍦板瓨鍌ㄨ幏鍙栭殣鎮f暟鎹�
+    const dangerInvestigation = uni.getStorageSync("dangerInvestigation");
+    if (dangerInvestigation && dangerInvestigation.id) {
+      form.value = dangerInvestigation;
+      console.log("form.value", form.value);
+    } else {
+      showToast("鏆傛棤闅愭偅鏁版嵁");
+    }
+  });
+
+  // 鍒濆鍖栭〉闈㈡暟鎹�
+  const initPageData = () => {
+    // 璁剧疆榛樿瀹為檯鏁存敼瀹屾垚鏃堕棿涓哄綋鍓嶆椂闂�
+    if (!form.value.rectifyActualTime) {
+      form.value.rectifyActualTime = dayjs().format("YYYY-MM-DD");
+      currentTime.value = Date.now();
+    }
+  };
+
+  onMounted(() => {
+    initPageData();
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "@/static/scss/form-common.scss";
+  .danger-investigation-rectify {
+    min-height: 100vh;
+    background-color: #f8f9fa;
+    padding-bottom: 160rpx;
+  }
+  .footer-btns {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: #fff;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    padding: 0.75rem 0;
+    box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05);
+    z-index: 1000;
+  }
+
+  .cancel-btn {
+    font-weight: 400;
+    font-size: 1rem;
+    color: #666;
+    background: #f5f5f5;
+    border: 1px solid #ddd;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+
+  .sign-btn {
+    font-weight: 500;
+    font-size: 1rem;
+    color: #fff;
+    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+    border: none;
+    width: 45%;
+    height: 2.5rem;
+    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
+  }
+
+  .section {
+    background-color: #ffffff;
+    margin-bottom: 16px;
+    overflow: hidden;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+  }
+
+  .section-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    padding: 16px 16px 12px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .info-item {
+    display: flex;
+    padding: 14px 16px;
+    border-bottom: 1px solid #f8f8f8;
+    align-items: flex-start;
+  }
+
+  .info-item:last-child {
+    border-bottom: none;
+  }
+
+  .info-label {
+    font-size: 14px;
+    color: #666666;
+    min-width: 80px;
+    flex-shrink: 0;
+    line-height: 22px;
+  }
+
+  .info-value {
+    font-size: 14px;
+    color: #333333;
+    flex: 1;
+    line-height: 22px;
+    text-align: right;
+  }
+
+  .multi-line {
+    text-align: left;
+    word-break: break-all;
+    line-height: 1.6;
+  }
+
+  .remark-item {
+    padding-bottom: 16px;
+  }
+</style>
\ No newline at end of file
diff --git a/src/pages/safeProduction/dangerInvestigation/view.vue b/src/pages/safeProduction/dangerInvestigation/view.vue
new file mode 100644
index 0000000..0be7245
--- /dev/null
+++ b/src/pages/safeProduction/dangerInvestigation/view.vue
@@ -0,0 +1,203 @@
+<template>
+  <view class="danger-investigation-view">
+    <PageHeader title="闅愭偅璇︽儏"
+                @back="goBack" />
+    <!-- 鍐呭瀹瑰櫒 -->
+    <view class="content-container">
+      <!-- 闅愭偅淇℃伅 -->
+      <view class="section">
+        <view class="section-title">闅愭偅淇℃伅</view>
+        <view class="info-item">
+          <text class="info-label">闅愭偅缂栧彿</text>
+          <text class="info-value">{{ form.hiddenCode || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">闅愭偅绫诲瀷</text>
+          <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">椋庨櫓绛夌骇</text>
+          <text class="info-value">{{ form.riskLevel || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">闅愭偅鎻忚堪</text>
+          <text class="info-value">{{ form.hiddenDesc || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">闅愭偅鍏蜂綋浣嶇疆</text>
+          <text class="info-value">{{ form.location || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">涓婃姤浜�</text>
+          <text class="info-value">{{ form.createUserName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">涓婃姤鏃堕棿</text>
+          <text class="info-value">{{ form.createTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">鏁存敼瀹屾垚鏈熼檺</text>
+          <text class="info-value">{{ form.rectifyTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">鏁存敼璐d换浜�</text>
+          <text class="info-value">{{ form.rectifyUserName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">鏁存敼璐d换浜鸿仈绯绘柟寮�</text>
+          <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">鏁存敼鍏蜂綋鎺柦</text>
+          <text class="info-value">{{ form.rectifyMeasures || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">瀹為檯鏁存敼瀹屾垚鏃堕棿</text>
+          <text class="info-value">{{ form.rectifyActualTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">楠屾敹鏃堕棿</text>
+          <text class="info-value">{{ form.verifyTime || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">楠屾敹浜�</text>
+          <text class="info-value">{{ form.verifyUserName || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">楠屾敹缁撴灉</text>
+          <text class="info-value">{{ form.verifyResult || '-' }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">楠屾敹鎰忚</text>
+          <text class="info-value">{{ form.verifyRemark || '-' }}</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+  // 鏇挎崲 toast 鏂规硶
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  import { ref, onMounted } from "vue";
+  import PageHeader from "@/components/PageHeader.vue";
+  import useUserStore from "@/store/modules/user";
+  import { onLoad } from "@dcloudio/uni-app";
+  import { useDict } from "@/utils/dict";
+
+  const { hidden_danger_type } = useDict("hidden_danger_type");
+  const userStore = useUserStore();
+
+  // 琛ㄥ崟鏁版嵁
+  const form = ref({
+    hiddenCode: "",
+    hiddenType: "",
+    riskLevel: "",
+    hiddenDesc: "",
+    location: "",
+    createUserName: "",
+    createTime: "",
+    rectifyTime: "",
+    rectifyUserName: "",
+    rectifyUserMobile: "",
+    rectifyMeasures: "",
+    rectifyActualTime: "",
+    rectifyResult: "",
+    acceptanceTime: "",
+    acceptanceOpinion: "",
+    verifyResult: "",
+  });
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    // 杩斿洖鏃舵竻闄ゆ湰鍦板瓨鍌ㄧ殑鏁版嵁
+    uni.removeStorageSync("dangerInvestigation");
+    uni.navigateBack();
+  };
+
+  // 鍒濆鍖栭〉闈㈡暟鎹�
+  const initPageData = () => {
+    // 浠庢湰鍦板瓨鍌ㄨ幏鍙栭殣鎮h鎯�
+    const row = uni.getStorageSync("dangerInvestigation");
+    if (row) {
+      form.value = { ...row };
+    } else {
+      showToast("鏆傛棤闅愭偅鏁版嵁");
+    }
+  };
+
+  onMounted(() => {
+    initPageData();
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "@/static/scss/form-common.scss";
+  .danger-investigation-view {
+    min-height: 100vh;
+    background-color: #f8f9fa;
+  }
+
+  .content-container {
+    padding: 16px;
+  }
+
+  .section {
+    background-color: #ffffff;
+    border-radius: 12px;
+    margin-bottom: 16px;
+    overflow: hidden;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+  }
+
+  .section-title {
+    font-size: 16px;
+    font-weight: 600;
+    color: #333333;
+    padding: 16px 16px 12px;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  .info-item {
+    display: flex;
+    padding: 14px 16px;
+    border-bottom: 1px solid #f8f8f8;
+    align-items: flex-start;
+  }
+
+  .info-item:last-child {
+    border-bottom: none;
+  }
+
+  .info-label {
+    font-size: 14px;
+    color: #666666;
+    min-width: 80px;
+    flex-shrink: 0;
+    line-height: 22px;
+  }
+
+  .info-value {
+    font-size: 14px;
+    color: #333333;
+    flex: 1;
+    line-height: 22px;
+    text-align: right;
+  }
+
+  .multi-line {
+    text-align: left;
+    word-break: break-all;
+    line-height: 1.6;
+  }
+
+  .remark-item {
+    padding-bottom: 16px;
+  }
+</style>
\ No newline at end of file

--
Gitblit v1.9.3