From c61bc857b627a58cd741207cb9e93d8e446e357e Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期二, 10 二月 2026 10:28:07 +0800
Subject: [PATCH] 人员薪资

---
 src/pages/index.vue                                   |   47 ++-
 src/pages/humanResources/attendance/checkin.vue       |    2 
 src/pages.json                                        |   18 +
 src/pages/humanResources/attendance/report.vue        |    0 
 src/pages/humanResources/monthlyStatistics/detail.vue |  357 +++++++++++++++++++++++++++
 src/api/personnelManagement/monthlyStatistics.js      |   65 +++++
 src/pages/humanResources/monthlyStatistics/index.vue  |  247 +++++++++++++++++++
 7 files changed, 712 insertions(+), 24 deletions(-)

diff --git a/src/api/personnelManagement/monthlyStatistics.js b/src/api/personnelManagement/monthlyStatistics.js
new file mode 100644
index 0000000..a070d0f
--- /dev/null
+++ b/src/api/personnelManagement/monthlyStatistics.js
@@ -0,0 +1,65 @@
+import request from "@/utils/request";
+
+// 浜哄憳钖祫鍙拌处鍒楄〃
+export function monthlyStatisticsListPage(query) {
+  return request({
+    url: "/compensationPerformance/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 浜哄憳钖祫鍙拌处璇︽儏
+export function monthlyStatisticsGet(id) {
+  return request({
+    url: "/monthlyStatistics/get",
+    method: "get",
+    params: { id },
+  });
+}
+
+// 鏂板浜哄憳钖祫鍙拌处
+export function monthlyStatisticsAdd(data) {
+  return request({
+    url: "/compensationPerformance/add",
+    method: "post",
+    data,
+  });
+}
+
+// 缂栬緫浜哄憳钖祫鍙拌处
+export function monthlyStatisticsUpdate(data) {
+  return request({
+    url: "/compensationPerformance/update",
+    method: "post",
+    data,
+  });
+}
+
+// 鍒犻櫎浜哄憳钖祫鍙拌处
+export function monthlyStatisticsDelete(ids) {
+  return request({
+    url: "/compensationPerformance/delete",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 瀵煎嚭浜哄憳钖祫鍙拌处
+export function monthlyStatisticsExport(query) {
+  return request({
+    url: "/compensationPerformance/export",
+    method: "get",
+    params: query,
+    responseType: "blob",
+  });
+}
+
+// 浜哄憳鍒楄〃
+export function staffOnJobList(query) {
+  return request({
+    url: "/staff/staffOnJob/list",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/pages.json b/src/pages.json
index 351c7dc..4bf158d 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -858,18 +858,32 @@
       }
     },
     {
-      "path": "pages/attendance/checkin",
+      "path": "pages/humanResources/attendance/checkin",
       "style": {
         "navigationBarTitleText": "鎵撳崱绛惧埌",
         "navigationStyle": "custom"
       }
     },
     {
-      "path": "pages/attendance/report",
+      "path": "pages/humanResources/attendance/report",
       "style": {
         "navigationBarTitleText": "鑰冨嫟鏃ユ姤",
         "navigationStyle": "custom"
       }
+    },
+    {
+      "path": "pages/humanResources/monthlyStatistics/index",
+      "style": {
+        "navigationBarTitleText": "钖祫鍙拌处",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/humanResources/monthlyStatistics/detail",
+      "style": {
+        "navigationBarTitleText": "钖祫鍙拌处璇︽儏",
+        "navigationStyle": "custom"
+      }
     }
   ],
   "subPackages": [
diff --git a/src/pages/attendance/checkin.vue b/src/pages/humanResources/attendance/checkin.vue
similarity index 99%
rename from src/pages/attendance/checkin.vue
rename to src/pages/humanResources/attendance/checkin.vue
index 18a87d7..970d35a 100644
--- a/src/pages/attendance/checkin.vue
+++ b/src/pages/humanResources/attendance/checkin.vue
@@ -186,7 +186,7 @@
   // 瀵艰埅鍒拌缁嗘姤鍛婇〉闈�
   const navigateToReport = () => {
     uni.navigateTo({
-      url: "/pages/attendance/report",
+      url: "/pages/humanResources/attendance/report",
     });
   };
 
diff --git a/src/pages/attendance/report.vue b/src/pages/humanResources/attendance/report.vue
similarity index 100%
rename from src/pages/attendance/report.vue
rename to src/pages/humanResources/attendance/report.vue
diff --git a/src/pages/humanResources/monthlyStatistics/detail.vue b/src/pages/humanResources/monthlyStatistics/detail.vue
new file mode 100644
index 0000000..732aa2a
--- /dev/null
+++ b/src/pages/humanResources/monthlyStatistics/detail.vue
@@ -0,0 +1,357 @@
+<template>
+  <view class="hazard-source-detail">
+    <PageHeader :title="isEdit ? '缂栬緫钖祫鍙拌处' : '鏂板钖祫鍙拌处'"
+                @back="goBack" />
+    <u-form @submit="handleSubmit"
+            ref="formRef"
+            label-width="110">
+      <!-- 钖祫淇℃伅 -->
+      <u-cell-group title="钖祫淇℃伅">
+        <u-form-item label="缁熻鏈堜唤"
+                     prop="payDate"
+                     required
+                     border-bottom>
+          <u-input v-model="form.payDate"
+                   placeholder="璇烽�夋嫨鏈堜唤"
+                   @click="showDatePicker"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showDatePicker"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="鍛樺伐濮撳悕"
+                     prop="staffId"
+                     required
+                     border-bottom>
+          <u-input v-model="form.staffName"
+                   placeholder="璇烽�夋嫨鍛樺伐"
+                   @click="showStaffSheet"
+                   readonly />
+          <template #right>
+            <up-icon name="arrow-right"
+                     @click="showStaffSheet"></up-icon>
+          </template>
+        </u-form-item>
+        <u-form-item label="鍩烘湰宸ヨ祫"
+                     prop="basicSalary"
+                     required
+                     border-bottom>
+          <u-input v-model="form.basicSalary"
+                   type="number"
+                   placeholder="璇疯緭鍏ュ熀鏈伐璧�" />
+        </u-form-item>
+        <u-form-item label="璁′欢宸ヨ祫"
+                     prop="pieceworkSalary"
+                     border-bottom>
+          <u-input v-model="form.pieceworkSalary"
+                   type="number"
+                   placeholder="璇疯緭鍏ヨ浠跺伐璧�" />
+        </u-form-item>
+        <u-form-item label="璁℃椂宸ヨ祫"
+                     prop="hourlySalary"
+                     border-bottom>
+          <u-input v-model="form.hourlySalary"
+                   type="number"
+                   placeholder="璇疯緭鍏ヨ鏃跺伐璧�" />
+        </u-form-item>
+        <u-form-item label="鍏朵粬鏀跺叆"
+                     prop="otherIncome"
+                     border-bottom>
+          <u-input v-model="form.otherIncome"
+                   type="number"
+                   placeholder="璇疯緭鍏ュ叾浠栨敹鍏�" />
+        </u-form-item>
+        <u-form-item label="绀句繚涓汉"
+                     prop="socialSecurityIndividuals"
+                     border-bottom>
+          <u-input v-model="form.socialSecurityIndividuals"
+                   type="number"
+                   placeholder="璇疯緭鍏ョぞ淇濅釜浜�" />
+        </u-form-item>
+        <u-form-item label="鍏Н閲戜釜浜�"
+                     prop="providentFundIndividuals"
+                     border-bottom>
+          <u-input v-model="form.providentFundIndividuals"
+                   type="number"
+                   placeholder="璇疯緭鍏ュ叕绉噾涓汉" />
+        </u-form-item>
+        <u-form-item label="涓汉鎵�寰楃◣"
+                     prop="personalIncomeTax"
+                     border-bottom>
+          <u-input v-model="form.personalIncomeTax"
+                   type="number"
+                   placeholder="璇疯緭鍏ヤ釜浜烘墍寰楃◣" />
+        </u-form-item>
+        <u-form-item label="鍏朵粬鎵f"
+                     prop="otherDeductions"
+                     border-bottom>
+          <u-input v-model="form.otherDeductions"
+                   type="number"
+                   placeholder="璇疯緭鍏ュ叾浠栨墸娆�" />
+        </u-form-item>
+        <u-form-item label="澶囨敞"
+                     prop="remark"
+                     border-bottom>
+          <u-textarea v-model="form.remark"
+                      placeholder="璇疯緭鍏ュ娉�"
+                      :rows="3"
+                      :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">{{ isEdit ? '鏇存柊' : '淇濆瓨' }}</u-button>
+      </view>
+    </u-form>
+    <!-- 鍛樺伐閫夋嫨鍣� -->
+    <up-action-sheet :show="staffSheetVisible"
+                     :actions="staffOptions"
+                     @select="handleStaffSelect"
+                     @close="staffSheetVisible = false"
+                     title="閫夋嫨鍛樺伐" />
+    <!-- 鏃ユ湡閫夋嫨鍣� -->
+    <up-datetime-picker :show="datePickerVisible"
+                        v-model="currentDate"
+                        @confirm="onDateConfirm"
+                        @cancel="datePickerVisible = false"
+                        mode="month" />
+  </view>
+</template>
+
+<script setup>
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "monthly-statistics-detail" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  import { ref, onMounted } from "vue";
+  import PageHeader from "@/components/PageHeader.vue";
+  import {
+    monthlyStatisticsAdd,
+    monthlyStatisticsUpdate,
+    staffOnJobList,
+  } from "@/api/personnelManagement/monthlyStatistics";
+  import dayjs from "dayjs";
+  import { onLoad } from "@dcloudio/uni-app";
+
+  // 琛ㄥ崟鏁版嵁
+  const form = ref({
+    id: "",
+    payDate: "",
+    staffId: "",
+    staffName: "",
+    basicSalary: 0,
+    pieceworkSalary: 0,
+    hourlySalary: 0,
+    otherIncome: 0,
+    socialSecurityIndividuals: 0,
+    providentFundIndividuals: 0,
+    personalIncomeTax: 0,
+    otherDeductions: 0,
+    payableWages: 0,
+    deductibleWages: 0,
+    actualWages: 0,
+    remark: "",
+  });
+
+  // 椤甸潰鐘舵��
+  const loading = ref(false);
+  const formRef = ref(null);
+  const isEdit = ref(false);
+
+  // 鍛樺伐閫夋嫨鍣�
+  const staffSheetVisible = ref(false);
+  const staffOptions = ref([]);
+  const staffList = ref([]);
+  const showStaffSheet = () => {
+    if (staffOptions.value.length === 0) {
+      loadStaffList();
+    } else {
+      staffSheetVisible.value = true;
+    }
+  };
+  const handleStaffSelect = item => {
+    const staff = staffList.value.find(s => s.id === item.value);
+    if (staff) {
+      form.value.staffId = staff.id;
+      form.value.staffName = staff.staffName;
+    }
+    staffSheetVisible.value = false;
+  };
+  const loadStaffList = () => {
+    staffOnJobList().then(res => {
+      if (res.code === 200) {
+        staffList.value = res.data || [];
+        staffOptions.value = staffList.value.map(item => ({
+          value: item.id,
+          name: item.staffName,
+          subname: `宸ュ彿: ${item.staffNo}`,
+        }));
+        staffSheetVisible.value = true;
+      }
+    });
+  };
+
+  // 鏃ユ湡閫夋嫨鍣�
+  const datePickerVisible = ref(false);
+  const currentDate = ref(Date.now());
+  const showDatePicker = () => {
+    datePickerVisible.value = true;
+  };
+  const onDateConfirm = e => {
+    form.value.payDate = dayjs(e.value).format("YYYY-MM");
+    currentDate.value = e.value;
+    datePickerVisible.value = false;
+  };
+
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    // 杩斿洖鏃舵竻闄ゆ湰鍦板瓨鍌ㄧ殑鏁版嵁
+    uni.removeStorageSync("monthlyStatistics");
+    uni.navigateBack();
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const handleSubmit = async () => {
+    if (!form.value.payDate) {
+      showToast("璇烽�夋嫨缁熻鏈堜唤");
+      return;
+    }
+
+    if (!form.value.staffId) {
+      showToast("璇烽�夋嫨鍛樺伐");
+      return;
+    }
+
+    if (!form.value.basicSalary) {
+      showToast("璇疯緭鍏ュ熀鏈伐璧�");
+      return;
+    }
+
+    // 璁$畻搴斿彂宸ヨ祫銆佸簲鎵e伐璧勫拰瀹炲彂宸ヨ祫
+    const payableWages =
+      Number(form.value.basicSalary) +
+      Number(form.value.pieceworkSalary) +
+      Number(form.value.hourlySalary) +
+      Number(form.value.otherIncome);
+    const deductibleWages =
+      Number(form.value.socialSecurityIndividuals) +
+      Number(form.value.providentFundIndividuals) +
+      Number(form.value.personalIncomeTax) +
+      Number(form.value.otherDeductions);
+    const actualWages = payableWages - deductibleWages;
+
+    const submitData = {
+      ...form.value,
+      payableWages,
+      deductibleWages,
+      actualWages,
+    };
+
+    try {
+      loading.value = true;
+
+      if (isEdit.value) {
+        const { code } = await monthlyStatisticsUpdate(submitData);
+        if (code === 200) {
+          showToast("鏇存柊鎴愬姛");
+          setTimeout(() => {
+            goBack();
+          }, 500);
+        } else {
+          loading.value = false;
+          showToast("鏇存柊澶辫触锛岃閲嶈瘯");
+        }
+      } else {
+        const { code } = await monthlyStatisticsAdd(submitData);
+        if (code === 200) {
+          showToast("淇濆瓨鎴愬姛");
+          setTimeout(() => {
+            goBack();
+          }, 500);
+        } else {
+          loading.value = false;
+          showToast("淇濆瓨澶辫触锛岃閲嶈瘯");
+        }
+      }
+    } catch (e) {
+      loading.value = false;
+      console.error("鎻愪氦澶辫触:", e);
+      showToast("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  };
+
+  onLoad(() => {
+    // 缂栬緫钖祫鍙拌处鏃讹紝浠庢湰鍦板瓨鍌ㄨ幏鍙栨暟鎹�
+    const monthlyStatistics = uni.getStorageSync("monthlyStatistics");
+    if (monthlyStatistics.id) {
+      form.value = monthlyStatistics;
+      isEdit.value = true;
+    } else {
+      isEdit.value = false;
+    }
+  });
+
+  onMounted(() => {
+    // 璁剧疆榛樿鏃堕棿
+    if (!isEdit.value) {
+      form.value.payDate = dayjs().format("YYYY-MM");
+      currentDate.value = Date.now();
+    }
+  });
+</script>
+
+<style scoped lang="scss">
+  @import "@/static/scss/form-common.scss";
+  .hazard-source-detail {
+    min-height: 100vh;
+    background: #f8f9fa;
+    padding-bottom: 5rem;
+  }
+
+  .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/humanResources/monthlyStatistics/index.vue b/src/pages/humanResources/monthlyStatistics/index.vue
new file mode 100644
index 0000000..f1edbfc
--- /dev/null
+++ b/src/pages/humanResources/monthlyStatistics/index.vue
@@ -0,0 +1,247 @@
+<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="searchKeyword"
+                    @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="ledgerList.length > 0">
+      <view v-for="(item, index) in ledgerList"
+            :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.payDate }}</text>
+            </view>
+          </view>
+          <up-divider></up-divider>
+          <view class="item-details">
+            <view class="detail-row">
+              <text class="detail-label">鍛樺伐濮撳悕</text>
+              <text class="detail-value">{{ item.staffName || '-' }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鍩烘湰宸ヨ祫</text>
+              <text class="detail-value">{{ item.basicSalary || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">璁′欢宸ヨ祫</text>
+              <text class="detail-value">{{ item.pieceworkSalary || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">璁℃椂宸ヨ祫</text>
+              <text class="detail-value">{{ item.hourlySalary || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">鍏朵粬鏀跺叆</text>
+              <text class="detail-value">{{ item.otherIncome || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">搴斿彂宸ヨ祫</text>
+              <text class="detail-value">{{ item.payableWages || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">搴旀墸宸ヨ祫</text>
+              <text class="detail-value">{{ item.deductibleWages || 0 }}</text>
+            </view>
+            <view class="detail-row">
+              <text class="detail-label">瀹炲彂宸ヨ祫</text>
+              <text class="detail-value">{{ item.actualWages || 0 }}</text>
+            </view>
+          </view>
+          <!-- 鎸夐挳鍖哄煙 -->
+          <view class="action-buttons">
+            <u-button type="primary"
+                      size="small"
+                      class="action-btn"
+                      @click="editItem(item)">
+              缂栬緫
+            </u-button>
+            <u-button type="error"
+                      size="small"
+                      class="action-btn"
+                      @click="deleteItem(item)">
+              鍒犻櫎
+            </u-button>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view v-else
+          class="no-data">
+      <text>鏆傛棤钖祫鍙拌处鏁版嵁</text>
+    </view>
+    <!-- 娴姩鏂板鎸夐挳 -->
+    <view class="fab-button"
+          @click="addItem">
+      <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 {
+    monthlyStatisticsListPage,
+    monthlyStatisticsDelete,
+  } from "@/api/personnelManagement/monthlyStatistics";
+  import useUserStore from "@/store/modules/user";
+
+  // 鏇挎崲 toast 鏂规硶
+  defineOptions({ name: "monthly-statistics-index" });
+  const showToast = message => {
+    uni.showToast({
+      title: message,
+      icon: "none",
+    });
+  };
+
+  const userStore = useUserStore();
+
+  // 鎼滅储鍏抽敭璇�
+  const searchKeyword = ref("");
+
+  // 钖祫鍙拌处鏁版嵁
+  const ledgerList = ref([]);
+  // 杩斿洖涓婁竴椤�
+  const goBack = () => {
+    uni.navigateBack();
+  };
+
+  // 鏌ヨ鍒楄〃
+  const getList = () => {
+    showLoadingToast("鍔犺浇涓�...");
+    const params = {
+      current: -1,
+      size: -1,
+      staffName: searchKeyword.value,
+    };
+    monthlyStatisticsListPage(params)
+      .then(res => {
+        ledgerList.value = res.records || res.data?.records || [];
+        closeToast();
+      })
+      .catch(() => {
+        closeToast();
+        showToast("鑾峰彇鏁版嵁澶辫触");
+      });
+  };
+
+  // 鏄剧ず鍔犺浇鎻愮ず
+  const showLoadingToast = message => {
+    uni.showLoading({
+      title: message,
+      mask: true,
+    });
+  };
+
+  // 鍏抽棴鎻愮ず
+  const closeToast = () => {
+    uni.hideLoading();
+  };
+
+  // 鏂板钖祫鍙拌处
+  const addItem = () => {
+    uni.setStorageSync("monthlyStatistics", {});
+    uni.navigateTo({
+      url: "/pages/humanResources/monthlyStatistics/detail",
+    });
+  };
+  // 缂栬緫钖祫鍙拌处
+  const editItem = item => {
+    uni.setStorageSync("monthlyStatistics", item);
+    uni.navigateTo({
+      url: "/pages/humanResources/monthlyStatistics/detail",
+    });
+  };
+  // 鍒犻櫎钖祫鍙拌处
+  const deleteItem = item => {
+    uni.showModal({
+      title: "鍒犻櫎纭",
+      content: `纭畾瑕佸垹闄よ钖祫鍙拌处璁板綍鍚楋紵`,
+      success: res => {
+        if (res.confirm) {
+          deleteItemById(item.id);
+        }
+      },
+    });
+  };
+
+  // 鍒犻櫎钖祫鍙拌处璁板綍
+  const deleteItemById = id => {
+    showLoadingToast("鍒犻櫎涓�...");
+    monthlyStatisticsDelete([id])
+      .then(() => {
+        closeToast();
+        showToast("鍒犻櫎鎴愬姛");
+        getList();
+      })
+      .catch(() => {
+        closeToast();
+        showToast("鍒犻櫎澶辫触");
+      });
+  };
+
+  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; // 淇濇寔椤甸潰鐗规湁鐨勮儗鏅壊
+  }
+
+  // 鐗规湁鏍峰紡
+  .detail-value {
+    word-break: break-all; // 淇濈暀椤甸潰鐗规湁鐨勬枃鏈崲琛屾牱寮�
+  }
+
+  // 鐗瑰畾鐨勬诞鍔ㄦ寜閽牱寮�
+  .fab-button {
+    background: #667eea; // 淇濇寔椤甸潰鐗规湁鐨勮儗鏅壊
+    box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // 淇濇寔椤甸潰鐗规湁鐨勯槾褰辨晥鏋�
+  }
+</style>
\ No newline at end of file
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 7094cf9..e9bdb55 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -454,29 +454,29 @@
       label: "璁惧淇濆吇",
     },
     {
-      icon: "/static/images/icon/guzhangfenxi@2x.png",
-      label: "鍒嗘瀽杩芥函",
-      bgColor: "#ff9800",
-    },
-    {
-      icon: "/static/images/icon/zhinengpaidan@2x.png",
-      label: "鏅鸿兘娲惧崟",
-      bgColor: "#ff6b35",
-    },
-    {
-      icon: "/static/images/icon/zuoyezhidao@2x.png",
-      label: "浣滀笟鎸囧",
-      bgColor: "#4caf50",
-    },
-    {
-      icon: "/static/images/icon/jieguoyanzheng@2x.png",
-      label: "缁撴灉楠岃瘉",
-      bgColor: "#9c27b0",
-    },
-    {
       icon: "/static/images/icon/xunjianshangchuan@2x.png",
       label: "宸℃涓婁紶",
     },
+    // {
+    //   icon: "/static/images/icon/guzhangfenxi@2x.png",
+    //   label: "鍒嗘瀽杩芥函",
+    //   bgColor: "#ff9800",
+    // },
+    // {
+    //   icon: "/static/images/icon/zhinengpaidan@2x.png",
+    //   label: "鏅鸿兘娲惧崟",
+    //   bgColor: "#ff6b35",
+    // },
+    // {
+    //   icon: "/static/images/icon/zuoyezhidao@2x.png",
+    //   label: "浣滀笟鎸囧",
+    //   bgColor: "#4caf50",
+    // },
+    // {
+    //   icon: "/static/images/icon/jieguoyanzheng@2x.png",
+    //   label: "缁撴灉楠岃瘉",
+    //   bgColor: "#9c27b0",
+    // },
   ]);
 
   // 澶勭悊甯哥敤鍔熻兘鐐瑰嚮
@@ -769,7 +769,12 @@
         break;
       case "鎵撳崱绛惧埌":
         uni.navigateTo({
-          url: "/pages/attendance/checkin",
+          url: "/pages/humanResources/attendance/checkin",
+        });
+        break;
+      case "浜哄憳钖祫":
+        uni.navigateTo({
+          url: "/pages/humanResources/monthlyStatistics/index",
         });
         break;
       default:

--
Gitblit v1.9.3