gaoluyang
16 小时以前 ee42bf1badae06026efa79dc17d2a541297ab49b
采购管理整体样式优化,搜索条件修改
已修改18个文件
已添加1个文件
1934 ■■■■■ 文件已修改
src/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/collaborativeApproval/index.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/ledger/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/repair/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/upkeep/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/invoiceEntry/index.vue 210 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentEntry/index.vue 220 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentLedger/detail.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentLedger/index.vue 188 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementInvoiceLedger/index.vue 281 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementLedger/index.vue 201 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/receiptPaymentHistory/index.vue 234 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/invoiceLedger/index.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/invoicingRegistration/index.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPaymentHistory/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPaymentLedger/detail.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPaymentLedger/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/procurement-common.scss 420 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config.js
@@ -2,7 +2,7 @@
const config = {
  //  baseUrl: 'https://vue.ruoyi.vip/prod-api',
  // baseUrl: 'http://localhost/prod-api',
  baseUrl: 'http://114.132.189.42:8089',
  baseUrl: 'http://114.132.189.42:9036',
   //cloud后台网关地址
  //  baseUrl: 'http://192.168.10.3:8080',
   // åº”用信息
src/pages/cooperativeOffice/clientVisit/index.vue
@@ -165,6 +165,7 @@
// æŸ¥è¯¢åˆ—表
const getList = () => {
  showLoadingToast('加载中...')
  const params = {
    current: -1,
    size: -1,
@@ -173,12 +174,27 @@
  getVisitRecords(params)
    .then((res) => {
      visitList.value = res.records || res.data?.records || []
      closeToast()
    })
    .catch(() => {
      closeToast()
      showToast('获取数据失败')
    })
}
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
  uni.showLoading({
    title: message,
    mask: true
  });
};
// å…³é—­æç¤º
const closeToast = () => {
  uni.hideLoading();
};
// æ–°å¢žæ‹œè®¿ - è·³è½¬åˆ°ç™»è®°é¡µé¢
const addVisit = () => {
  uni.navigateTo({
src/pages/cooperativeOffice/collaborativeApproval/index.vue
@@ -133,6 +133,7 @@
    };
    // æŸ¥è¯¢åˆ—表
    const getList = () => {
        showLoadingToast('加载中...')
        const page = {
            current: -1,
            size: -1,
@@ -142,11 +143,25 @@
            })
            .then((res) => {
                ledgerList.value = res.data.records;
                closeToast()
            })
            .catch(() => {
                // tableLoading.value = false;
                closeToast()
            });
    };
    // æ˜¾ç¤ºåŠ è½½æç¤º
    const showLoadingToast = (message) => {
        uni.showLoading({
            title: message,
            mask: true
        });
    };
    // å…³é—­æç¤º
    const closeToast = () => {
        uni.hideLoading();
    };
    // æ˜¾ç¤ºç­›é€‰é€‰é¡¹
    const showFilterOptions = () => {
        uni.showActionSheet({
src/pages/equipmentManagement/ledger/index.vue
@@ -143,6 +143,7 @@
// æŸ¥è¯¢åˆ—表(current/size å›ºå®šä¼  -1)
const getList = () => {
  showLoadingToast('加载中...')
  const params = {
    current: -1,
    size: -1,
@@ -151,12 +152,27 @@
  getLedgerPage(params)
    .then((res) => {
      ledgerList.value = res.data.records
      closeToast()
    })
    .catch(() => {
      closeToast()
      showToast('获取数据失败')
    })
}
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
  uni.showLoading({
    title: message,
    mask: true
  });
};
// å…³é—­æç¤º
const closeToast = () => {
  uni.hideLoading();
};
// æ–°å¢ž - è·³è½¬åˆ°è¯¦æƒ…页面
const add = () => {
  uni.navigateTo({
src/pages/equipmentManagement/repair/index.vue
@@ -152,6 +152,7 @@
// æŸ¥è¯¢åˆ—表
const getList = () => {
  showLoadingToast('加载中...')
  const params = {
    current: -1,
    size: -1,
@@ -160,12 +161,27 @@
  getRepairPage(params)
    .then((res) => {
      repairList.value = res.records || res.data?.records || []
      closeToast()
    })
    .catch(() => {
      closeToast()
      showToast('获取数据失败')
    })
}
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
  uni.showLoading({
    title: message,
    mask: true
  });
};
// å…³é—­æç¤º
const closeToast = () => {
  uni.hideLoading();
};
// æ–°å¢žç»´ä¿® - è·³è½¬åˆ°ç»´ä¿®é¡µé¢
const addMaintain = (id) => {
  if (!id) {
src/pages/equipmentManagement/upkeep/index.vue
@@ -168,6 +168,7 @@
// æŸ¥è¯¢åˆ—表
const getList = () => {
  showLoadingToast('加载中...')
  const params = {
    current: -1,
    size: -1,
@@ -177,12 +178,27 @@
    .then((res) => {
      // å¦‚æžœres.data不是数组,设置为空数组
      upkeepList.value = res.records || res.data?.records || []
      closeToast()
    })
    .catch(() => {
      closeToast()
      showToast('获取数据失败')
    })
}
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
  uni.showLoading({
    title: message,
    mask: true
  });
};
// å…³é—­æç¤º
const closeToast = () => {
  uni.hideLoading();
};
// åˆ‡æ¢é€‰æ‹©çŠ¶æ€
const toggleSelection = (item) => {
  const index = multipleList.value.findIndex(selected => selected.id === item.id)
src/pages/procurementManagement/invoiceEntry/index.vue
@@ -4,13 +4,15 @@
        <PageHeader title="来票登记" @back="goBack" />
        
        <!-- æœç´¢å’Œç­›é€‰åŒºåŸŸ -->
        <view class="search-filter-section">
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <input
                    <up-input
                        class="search-text"
                        placeholder="请输入采购合同号/供应商名称"
                        v-model="searchKeyword"
                        v-model="supplierName"
                        @change="getList"
                        clearable
                    />
                </view>
                <view class="filter-button" @click="getList">
@@ -96,7 +98,7 @@
const userStore = useUserStore()
// æœç´¢å…³é”®è¯
const searchKeyword = ref('');
const supplierName = ref('');
// é‡‡è´­å°è´¦æ•°æ®
const ledgerList = ref([]);
@@ -107,15 +109,30 @@
};
// æŸ¥è¯¢åˆ—表
const getList = () => {
    showLoadingToast('加载中...')
    const page = {
        current: -1,
        size: -1
    }
    gePurchaseListPage({...page}).then((res) => {
    gePurchaseListPage({...page, supplierName: supplierName.value}).then((res) => {
        ledgerList.value = res.data.records;
        closeToast()
    }).catch(() => {
        // tableLoading.value = false;
        closeToast()
    });
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// å¤„理新增来票
@@ -162,15 +179,9 @@
</script>
<style scoped lang="scss">
.u-divider {
    margin: 0 !important;
}
.sales-account {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
@import '@/styles/procurement-common.scss';
// æ¥ç¥¨ç™»è®°ç‰¹æœ‰æ ·å¼
.nav-icon {
    width: 24px;
    height: 24px;
@@ -223,176 +234,7 @@
    border-radius: 2px;
}
.search-filter-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
}
.search-text::placeholder {
    color: #999;
}
.filter-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.ledger-list {
    padding: 20px;
}
.ledger-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
}
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.document-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.item-id {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.item-tag {
    background: #4caf50;
    border-radius: 4px;
    padding: 2px 4px;
}
.tag-text {
    font-size: 11px;
    color: #ffffff;
    font-weight: 500;
}
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-info {
    margin-top: 10px;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
}
.detail-value.highlight {
    color: #2979ff;
    font-weight: 500;
}
.detail-value.redlight {
    color: red;
    font-weight: 500;
}
.action-buttons {
    display: flex;
    gap: 12px;
    padding: 0 0 16px 0;
    justify-content: space-between;
}
.action-btn {
    flex: 1;
}
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
.fab-button {
    position: fixed;
    bottom: 30px;
    right: 30px;
    width: 56px;
    height: 56px;
    background: #2979ff;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
    z-index: 1000;
    bottom: 30px; // ä¸Žå…¶ä»–页面的 calc(30px + env(safe-area-inset-bottom)) ä¸åŒ
}
</style>
src/pages/procurementManagement/paymentEntry/index.vue
@@ -1,17 +1,18 @@
<template>
    <view class="receipt-payment">
    <view class="sales-account">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader title="付款登记" @back="goBack" />
        <!-- æœç´¢å’Œç­›é€‰åŒºåŸŸ -->
        <view class="search-filter-section">
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <input
                    <up-input
                        class="search-text"
                        placeholder="供应商名称/合同号"
                        placeholder="请输入供应商名称/合同号搜索"
                        v-model="searchForm.supplierNameOrContractNo"
                        confirm-type="search"
                        @change="getList"
                        clearable
                    />
                </view>
                <view class="filter-button" @click="getList">
@@ -135,14 +136,30 @@
// èŽ·å–åˆ—è¡¨æ•°æ®
const getList = () => {
    showLoadingToast('加载中...')
    tableLoading.value = true
    invoiceListPage({ ...searchForm.value, ...page.value }).then((res) => {
        tableLoading.value = false
        tableData.value = res.records || []
        closeToast()
    }).catch(() => {
        tableLoading.value = false
        closeToast()
    })
}
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// æ‰“开新增表单
const openForm = (type, item) => {
@@ -161,201 +178,12 @@
</script>
<style scoped lang="scss">
.u-divider {
    margin: 0 !important;
}
@import '@/styles/procurement-common.scss';
.receipt-payment {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
.search-filter-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
}
.search-text::placeholder {
    color: #999;
}
.filter-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.switch-row {
    padding: 8px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-top: 8px;
}
.switch-label {
    font-size: 14px;
    color: #333;
}
.ledger-list {
    padding: 20px;
}
.ledger-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
}
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.document-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.item-id {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
// ä»˜æ¬¾ç™»è®°ç‰¹æœ‰æ ·å¼
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
    display: flex;
    align-items: center;
    justify-content: flex-end;
}
.detail-value.highlight {
    color: #2979ff;
    font-weight: 500;
}
.detail-value.danger {
    color: #ee0a24;
    font-weight: 500;
}
.children-list {
    .children-title {
        font-size: 14px;
        font-weight: 500;
        color: #333;
        padding: 12px 0 8px 0;
        border-top: 1px solid #f0f0f0;
    }
}
.child-item {
    .child-details {
        padding: 12px 0;
    }
    .child-actions {
        display: flex;
        gap: 8px;
        padding: 8px 0 16px 0;
        justify-content: flex-end;
    }
}
.action-buttons {
    display: flex;
    gap: 12px;
    padding: 0 0 16px 0;
    justify-content: space-between;
}
.action-btn {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
</style>
src/pages/procurementManagement/paymentLedger/detail.vue
@@ -111,6 +111,7 @@
        });
        return;
    }
    showLoadingToast('加载中...')
    const param = {
        supplierId: supplierId.value,
        current: -1,
@@ -118,7 +119,9 @@
    };
    paymentLedgerList(param).then((res) => {
        tableData.value = res.data.records;
        closeToast()
    }).catch(() => {
        closeToast()
        uni.showToast({
            title: '查询失败',
            icon: 'error'
@@ -131,6 +134,19 @@
    return amount ? parseFloat(amount).toFixed(2) : '0.00';
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
onMounted(() => {
    // é¡µé¢åŠ è½½æ—¶èŽ·å–å‚æ•°å¹¶åˆ·æ–°åˆ—è¡¨
    getPageParams();
src/pages/procurementManagement/paymentLedger/index.vue
@@ -1,5 +1,5 @@
<template>
  <view class="receipt-payment-ledger">
  <view class="sales-account">
    <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
    <PageHeader title="供应商往来" @back="goBack" />
    
@@ -7,11 +7,12 @@
    <view class="search-section">
      <view class="search-bar">
        <view class="search-input">
          <input
          <up-input
            class="search-text"
            placeholder="请输入供应商名称"
            v-model="searchForm.searchText"
            @input="handleQuery"
            v-model="searchForm.supplierName"
            @change="handleQuery"
                        clearable
          />
        </view>
        <view class="search-button" @click="handleQuery">
@@ -81,7 +82,7 @@
const data = reactive({
  searchForm: {
    searchText: "",
    supplierName: "",
    invoiceDate: "",
  },
});
@@ -99,9 +100,12 @@
};
const getList = () => {
    showLoadingToast('加载中...')
    paymentLedgerList({ ...searchForm.value, ...page }).then((res) => {
    tableData.value = res.data.records;
    closeToast()
  }).catch(() => {
    closeToast()
    uni.showToast({
      title: '查询失败',
      icon: 'error'
@@ -113,7 +117,18 @@
  return parseFloat(value || 0).toFixed(2);
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
const rowClickMethod = (row) => {
  // ä½¿ç”¨ uni.setStorageSync å­˜å‚¨ä¾›åº”商信息
@@ -130,168 +145,11 @@
</script>
<style scoped lang="scss">
.u-divider {
  margin: 0 !important;
}
@import '@/styles/procurement-common.scss';
.receipt-payment-ledger {
  min-height: 100vh;
  background: #f8f9fa;
  position: relative;
}
.search-section {
  padding: 10px 20px;
  background: #ffffff;
}
.search-bar {
  display: flex;
  align-items: center;
  gap: 12px;
}
.search-input {
  flex: 1;
  background: #f5f5f5;
  border-radius: 24px;
  padding: 10px 16px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.search-text {
  flex: 1;
  font-size: 14px;
  color: #333;
  background: transparent;
  border: none;
  outline: none;
}
.search-text::placeholder {
  color: #999;
}
.search-button {
  width: 40px;
  height: 40px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.customer-list-container {
  padding: 20px;
}
.customer-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.customer-item {
  background: #ffffff;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  padding: 0 16px;
  transition: all 0.3s ease;
  &:active {
    transform: scale(0.98);
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
  }
}
.item-header {
  padding: 16px 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.item-left {
  display: flex;
  align-items: center;
  gap: 8px;
}
.item-right {
  display: flex;
  align-items: center;
  gap: 8px;
}
.customer-icon {
  width: 24px;
  height: 24px;
  background: #2979ff;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.customer-name {
  font-size: 14px;
  color: #333;
  font-weight: 500;
}
.item-index {
  font-size: 12px;
  color: #999;
  background: #f5f5f5;
  padding: 2px 8px;
  border-radius: 12px;
}
.item-details {
  padding: 16px 0;
}
.detail-row {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  margin-bottom: 8px;
  &:last-child {
    margin-bottom: 0;
  }
}
.detail-label {
  font-size: 12px;
  color: #777777;
  min-width: 60px;
}
.detail-value {
  font-size: 12px;
  color: #000000;
  text-align: right;
  flex: 1;
  margin-left: 16px;
}
.detail-value.highlight {
  color: #2979ff;
  font-weight: 500;
}
// ä¾›åº”商往来特有样式
.detail-value.danger {
  color: #ff4757;
  color: #ff4757; // ä¸Žå…¬å…±æ ·å¼ä¸­çš„ #ee0a24 ä¸åŒ
  font-weight: 500;
}
.no-data {
  padding: 40px 0;
  text-align: center;
  color: #999;
}
</style>
src/pages/procurementManagement/procurementInvoiceLedger/index.vue
@@ -4,15 +4,15 @@
        <PageHeader title="来票台账" @back="goBack" />
        
        <!-- æœç´¢åŒºåŸŸ -->
        <view class="search-filter-section">
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <input
                    <up-input
                        class="search-text"
                        placeholder="供应商名称/采购合同号"
                        v-model="searchForm.searchText"
                        confirm-type="search"
                        @confirm="handleQuery"
                        placeholder="请输入供应商名称搜索"
                        v-model="searchForm.supplierName"
                        @change="handleQuery"
                        clearable
                    />
                </view>
                <view class="filter-button" @click="handleQuery">
@@ -108,26 +108,26 @@
                        >
                            åˆ é™¤
                        </u-button>
                        <u-button
                            type="default"
                            size="small"
                            plain
                            class="action-btn"
                            v-if="item.invoiceFileName"
                            @click="openFileActions(item.commonFiles || [])"
                        >
                            æŸ¥çœ‹é™„ä»¶
                        </u-button>
                        <u-button
                            type="primary"
                            size="small"
                            class="action-btn"
                            v-else
                            :disabled="item.issUer !== userStore.nickName"
                            @click="openUpload(item)"
                        >
                            ä¸Šä¼ 
                        </u-button>
<!--                        <u-button-->
<!--                            type="default"-->
<!--                            size="small"-->
<!--                            plain-->
<!--                            class="action-btn"-->
<!--                            v-if="item.invoiceFileName"-->
<!--                            @click="openFileActions(item.commonFiles || [])"-->
<!--                        >-->
<!--                            æŸ¥çœ‹é™„ä»¶-->
<!--                        </u-button>-->
<!--                        <u-button-->
<!--                            type="primary"-->
<!--                            size="small"-->
<!--                            class="action-btn"-->
<!--                            v-else-->
<!--                            :disabled="item.issUer !== userStore.nickName"-->
<!--                            @click="openUpload(item)"-->
<!--                        >-->
<!--                            ä¸Šä¼ -->
<!--                        </u-button>-->
                    </view>
                </view>
            </view>
@@ -203,7 +203,7 @@
const total = ref(0)
const page = reactive({ current: -1, size: -1 })
const searchForm = reactive({
    searchText: '',
    supplierName: '',
})
const currentId = ref('')
@@ -413,230 +413,7 @@
</script>
<style scoped lang="scss">
.u-divider {
    margin: 0 !important;
}
.sales-account {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
@import '@/styles/procurement-common.scss';
.search-filter-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
}
.search-text::placeholder {
    color: #999;
}
.filter-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.ledger-list {
    padding: 20px;
}
.ledger-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
}
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.document-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.item-id {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
}
.detail-value.highlight {
    color: #2979ff;
    font-weight: 500;
}
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
.action-buttons {
    display: flex;
    gap: 12px;
    padding: 0 0 16px 0;
    justify-content: space-between;
}
.action-btn {
    flex: 1;
}
.filter-popup {
    padding: 12px 12px 20px;
}
.popup-header {
    padding: 10px 16px;
    border-bottom: 1px solid #f5f5f5;
}
.popup-title {
    font-size: 16px;
    font-weight: 500;
    color: #333;
}
.uploaded-list {
    padding: 8px 16px 0 16px;
}
.uploaded-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 8px 0;
    border-bottom: 1px solid #f5f5f5;
}
.file-name {
    font-size: 12px;
    color: #333;
    margin-right: 8px;
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.tip-text {
    padding: 4px 16px 0 16px;
    font-size: 12px;
    color: #888;
}
.filter-actions {
    display: flex;
    gap: 12px;
    padding: 12px 16px 16px;
    justify-content: center;
}
.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: #FFFFFF;
    width: 6.375rem;
    background: #C7C9CC;
    box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2);
    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
.save-btn {
    font-weight: 400;
    font-size: 1rem;
    color: #FFFFFF;
    width: 14rem;
    background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%);
    box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2);
    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
// æ¥ç¥¨å°è´¦ç‰¹æœ‰æ ·å¼ï¼ˆæ‰€æœ‰æ ·å¼éƒ½å·²åŒ…含在公共样式中)
</style>
src/pages/procurementManagement/procurementLedger/index.vue
@@ -4,13 +4,15 @@
        <PageHeader title="采购台账" @back="goBack" />
        
        <!-- æœç´¢å’Œç­›é€‰åŒºåŸŸ -->
        <view class="search-filter-section">
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <input
                    <up-input
                        class="search-text"
                        placeholder="请输入采购合同号/客户名称"
                        v-model="searchKeyword"
                        placeholder="请输入采购合同号搜索"
                        v-model="purchaseContractNumber"
                        @change="getList"
                        clearable
                    />
                </view>
                <view class="filter-button" @click="getList">
@@ -92,7 +94,7 @@
const userStore = useUserStore()
// æœç´¢å…³é”®è¯
const searchKeyword = ref('');
const purchaseContractNumber = ref('');
// é‡‡è´­å°è´¦æ•°æ®
const ledgerList = ref([]);
@@ -103,15 +105,30 @@
};
// æŸ¥è¯¢åˆ—表
const getList = () => {
    showLoadingToast('加载中...')
    const page = {
        current: -1,
        size: -1
    }
    purchaseListPage({...page}).then((res) => {
    purchaseListPage({...page, purchaseContractNumber: purchaseContractNumber.value}).then((res) => {
        ledgerList.value = res.data.records;
        closeToast()
    }).catch(() => {
            // tableLoading.value = false;
        closeToast()
    });
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// å¤„理台账信息操作(查看/编辑/新增)
@@ -170,173 +187,7 @@
</script>
<style scoped lang="scss">
.u-divider {
    margin: 0 !important;
}
.sales-account {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
@import '@/styles/procurement-common.scss';
.search-filter-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
}
.search-text::placeholder {
    color: #999;
}
.filter-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.ledger-list {
    padding: 20px;
}
.ledger-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
}
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.document-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.item-id {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.item-tag {
    background: #4caf50;
    border-radius: 4px;
    padding: 2px 4px;
}
.tag-text {
    font-size: 11px;
    color: #ffffff;
    font-weight: 500;
}
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-info {
    margin-top: 10px;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
}
.detail-value.highlight {
    color: #2979ff;
    font-weight: 500;
}
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
.fab-button {
    position: fixed;
    bottom: calc(30px + env(safe-area-inset-bottom));
    right: 30px;
    width: 56px;
    height: 56px;
    background: #2979ff;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
    z-index: 1000;
    /* ç¡®ä¿æµ®åŠ¨æŒ‰é’®ä¸è¢«åº•éƒ¨å®‰å…¨åŒºåŸŸé®æŒ¡ */
}
// é‡‡è´­å°è´¦ç‰¹æœ‰æ ·å¼ï¼ˆå¦‚有需要可在此添加)
</style>
src/pages/procurementManagement/receiptPaymentHistory/index.vue
@@ -1,5 +1,5 @@
<template>
    <view class="receipt-payment-history">
    <view class="sales-account">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader title="付款流水" @back="goBack" />
        
@@ -7,11 +7,12 @@
        <view class="search-section">
            <view class="search-bar">
                <view class="search-input">
                    <input
                    <up-input
                        class="search-text"
                        placeholder="请输入供应商名称"
                        v-model="searchForm.searchText"
                        @input="getList"
                        @change="getList"
                        clearable
                    />
                </view>
                <view class="search-button" @click="getList">
@@ -126,13 +127,16 @@
// æŸ¥è¯¢åˆ—表
const getList = () => {
    showLoadingToast('加载中...')
    const params = {
        ...searchForm.value,
        ...page.value
    };
    paymentHistoryListPage(params).then((res) => {
        tableData.value = res.records;
        closeToast()
    }).catch(() => {
        closeToast()
        uni.showToast({
            title: '查询失败',
            icon: 'error'
@@ -155,6 +159,20 @@
const formatAmount = (amount) => {
    return amount ? parseFloat(amount).toFixed(2) : '0.00';
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// æ‰“开编辑表单
const openForm = (item) => {
    uni.setStorageSync('invoiceLedgerEditRow', JSON.stringify(item))
@@ -167,218 +185,20 @@
</script>
<style scoped lang="scss">
.u-divider {
    margin: 0 !important;
}
@import '@/styles/procurement-common.scss';
.receipt-payment-history {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
.search-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 10px 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
}
.search-text::placeholder {
    color: #999;
}
.search-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.history-list {
    padding: 20px;
}
.history-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
}
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.document-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.item-id {
    font-size: 14px;
    color: #333;
    font-weight: 500;
// ä»˜æ¬¾æµæ°´ç‰¹æœ‰æ ·å¼
.action-buttons {
    padding: 12px 0 0 0; // ä¸Žå…¬å…±æ ·å¼ä¸­çš„ 0 0 16px 0 ä¸åŒ
}
.item-tag {
    border-radius: 4px;
    padding:  2px 8px;
}
.tag-electric {
    background: #4caf50;
}
.tag-acceptance {
    background: #ff9800;
}
.tag-unknown {
    background: #9e9e9e;
    padding: 2px 8px; // ä¸Žå…¬å…±æ ·å¼ä¸­çš„ 2px 4px ä¸åŒ
}
.tag-text {
    font-size: 14px;
    font-size: 14px; // ä¸Žå…¬å…±æ ·å¼ä¸­çš„ 11px ä¸åŒ
    color: #ffffff;
    font-weight: 500;
}
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-info {
    margin-top: 10px;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.action-buttons {
    display: flex;
    gap: 12px;
    padding: 12px 0 0 0;
    justify-content: space-between;
}
.action-btn {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
}
.detail-value.highlight {
    color: #2979ff;
    font-weight: 500;
}
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
.summary-info {
    background: #ffffff;
    margin: 20px 20px 0 20px;
    border-radius: 12px;
    padding: 16px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.summary-item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.summary-label {
    font-size: 14px;
    color: #666;
}
.summary-value {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.summary-value.highlight {
    color: #2979ff;
    font-weight: 600;
}
</style>
src/pages/sales/invoiceLedger/index.vue
@@ -103,15 +103,15 @@
                        >
                            åˆ é™¤
                        </up-button>
                        <up-button
                            size="small"
                            plain
                            class="action-btn"
                            v-if="item.invoiceFileName"
                            @click="openFileActions(item.commonFiles || [])"
                        >
                            æŸ¥çœ‹é™„ä»¶
                        </up-button>
<!--                        <up-button-->
<!--                            size="small"-->
<!--                            plain-->
<!--                            class="action-btn"-->
<!--                            v-if="item.invoiceFileName"-->
<!--                            @click="openFileActions(item.commonFiles || [])"-->
<!--                        >-->
<!--                            æŸ¥çœ‹é™„ä»¶-->
<!--                        </up-button>-->
<!--                        <up-button-->
<!--                            type="primary"-->
<!--                            size="small"-->
src/pages/sales/invoicingRegistration/index.vue
@@ -114,6 +114,7 @@
};
// æŸ¥è¯¢åˆ—表
const getList = () => {
    showLoadingToast('加载中...')
    const page = {
        current: -1,
        size: -1
@@ -121,11 +122,25 @@
    ledgerListPage({...page, customerName: customerName.value}).then((res) => {
        ledgerList.value = res.records;
        total.value = res.total;
        closeToast()
    }).catch(() => {
        // tableLoading.value = false;
        closeToast()
    });
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// å¤„理新增开票
const handleAddInvoice = (item) => {
    try {
src/pages/sales/receiptPaymentHistory/index.vue
@@ -135,13 +135,16 @@
// æŸ¥è¯¢åˆ—表
const getList = () => {
    showLoadingToast('加载中...')
    const params = {
        ...searchForm.value,
        ...page.value
    };
    receiptPaymentHistoryListPage(params).then((res) => {
        tableData.value = res.records;
        closeToast()
    }).catch(() => {
        closeToast()
        uni.showToast({
            title: '查询失败',
            icon: 'error'
@@ -149,6 +152,19 @@
    });
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
// æ ¼å¼åŒ–回款方式
const formatReceiptType = (type) => {
    if (type == 0) {
src/pages/sales/receiptPaymentLedger/detail.vue
@@ -112,6 +112,7 @@
        return;
    }
    
    showLoadingToast('加载中...')
    const param = {
        customerId: customerId.value,
        current: -1,
@@ -120,7 +121,9 @@
    
    customerInteractions(param).then((res) => {
        tableData.value = res.data;
        closeToast()
    }).catch(() => {
        closeToast()
        uni.showToast({
            title: '查询失败',
            icon: 'error'
@@ -133,6 +136,19 @@
    return amount ? parseFloat(amount).toFixed(2) : '0.00';
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
onShow(() => {
    // é¡µé¢æ˜¾ç¤ºæ—¶èŽ·å–å‚æ•°å¹¶åˆ·æ–°åˆ—è¡¨
    getPageParams();
src/pages/sales/receiptPaymentLedger/index.vue
@@ -100,9 +100,12 @@
};
const getList = () => {
    showLoadingToast('加载中...')
    invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
        tableData.value = res.data.records;
        closeToast()
    }).catch(() => {
        closeToast()
        uni.showToast({
            title: '查询失败',
            icon: 'error'
@@ -114,7 +117,18 @@
    return parseFloat(value || 0).toFixed(2);
};
// æ˜¾ç¤ºåŠ è½½æç¤º
const showLoadingToast = (message) => {
    uni.showLoading({
        title: message,
        mask: true
    });
};
// å…³é—­æç¤º
const closeToast = () => {
    uni.hideLoading();
};
const rowClickMethod = (row) => {
    // ä½¿ç”¨ uni.setStorageSync å­˜å‚¨å®¢æˆ·ä¿¡æ¯
src/styles/procurement-common.scss
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,420 @@
// é‡‡è´­ç®¡ç†æ¨¡å—公共样式
// ç”¨äºŽç»Ÿä¸€é‡‡è´­ç›¸å…³é¡µé¢çš„æ ·å¼é£Žæ ¼
// é¡µé¢å®¹å™¨æ ·å¼
.sales-account {
    min-height: 100vh;
    background: #f8f9fa;
    position: relative;
}
// æœç´¢å’Œç­›é€‰åŒºåŸŸæ ·å¼
.search-section {
    padding: 10px 20px;
    background: #ffffff;
}
.search-bar {
    display: flex;
    align-items: center;
    gap: 12px;
}
.search-input {
    flex: 1;
    background: #f5f5f5;
    border-radius: 24px;
    padding: 0 16px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.search-text {
    flex: 1;
    font-size: 14px;
    color: #333;
    background: transparent;
    border: none;
    outline: none;
    &::placeholder {
        color: #999;
    }
}
.filter-button,
.search-button {
    width: 40px;
    height: 40px;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
}
// å¼€å…³è¡Œæ ·å¼
.switch-row {
    padding: 8px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-top: 8px;
}
.switch-label {
    font-size: 14px;
    color: #333;
}
// åˆ—表容器样式
.ledger-list,
.history-list,
.customer-list-container {
    padding: 20px;
}
.customer-list {
    display: flex;
    flex-direction: column;
    gap: 16px;
}
// åˆ—表项样式
.ledger-item,
.history-item,
.customer-item {
    background: #ffffff;
    border-radius: 12px;
    margin-bottom: 16px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
    padding: 0 16px;
    &:active {
        transform: scale(0.98);
        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
    }
}
.customer-item {
    transition: all 0.3s ease;
    margin-bottom: 0;
}
// é¡¹ç›®å¤´éƒ¨æ ·å¼
.item-header {
    padding: 16px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
.item-left {
    display: flex;
    align-items: center;
    gap: 8px;
}
.item-right {
    display: flex;
    align-items: center;
    gap: 8px;
}
// å›¾æ ‡æ ·å¼
.document-icon,
.customer-icon {
    width: 24px;
    height: 24px;
    background: #2979ff;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
}
// æ–‡æœ¬æ ·å¼
.item-id,
.customer-name {
    font-size: 14px;
    color: #333;
    font-weight: 500;
}
.item-index {
    font-size: 12px;
    color: #999;
    background: #f5f5f5;
    padding: 2px 8px;
    border-radius: 12px;
}
// æ ‡ç­¾æ ·å¼
.item-tag {
    border-radius: 4px;
    padding: 2px 4px;
    &.tag-electric {
        background: #4caf50;
    }
    &.tag-acceptance {
        background: #ff9800;
    }
    &.tag-unknown {
        background: #9e9e9e;
    }
}
.tag-text {
    font-size: 11px;
    color: #ffffff;
    font-weight: 500;
}
// è¯¦æƒ…区域样式
.item-details {
    padding: 16px 0;
}
.detail-row {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.detail-info {
    margin-top: 10px;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.detail-label {
    font-size: 12px;
    color: #777777;
    min-width: 60px;
}
.detail-value {
    font-size: 12px;
    color: #000000;
    text-align: right;
    flex: 1;
    margin-left: 16px;
    &.highlight {
        color: #2979ff;
        font-weight: 500;
    }
    &.danger {
        color: #ee0a24;
        font-weight: 500;
    }
    &.redlight {
        color: red;
        font-weight: 500;
    }
}
// å­åˆ—表样式
.children-list {
    .children-title {
        font-size: 14px;
        font-weight: 500;
        color: #333;
        padding: 12px 0 8px 0;
        border-top: 1px solid #f0f0f0;
    }
}
.child-item {
    .child-details {
        padding: 12px 0;
    }
    .child-actions {
        display: flex;
        gap: 8px;
        padding: 8px 0 16px 0;
        justify-content: flex-end;
    }
}
// æ“ä½œæŒ‰é’®æ ·å¼
.action-buttons {
    display: flex;
    gap: 12px;
    padding: 0 0 16px 0;
    justify-content: space-between;
    &.action-buttons-top {
        padding: 12px 0 0 0;
    }
}
.action-btn {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}
// æµ®åŠ¨æŒ‰é’®æ ·å¼
.fab-button {
    position: fixed;
    bottom: calc(30px + env(safe-area-inset-bottom));
    right: 30px;
    width: 56px;
    height: 56px;
    background: #2979ff;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
    z-index: 1000;
}
// æ— æ•°æ®æç¤ºæ ·å¼
.no-data {
    padding: 40px 0;
    text-align: center;
    color: #999;
}
// æ±‡æ€»ä¿¡æ¯æ ·å¼
.summary-info {
    background: #ffffff;
    margin: 20px 20px 0 20px;
    border-radius: 12px;
    padding: 16px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.summary-item {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 8px;
    &:last-child {
        margin-bottom: 0;
    }
}
.summary-label {
    font-size: 14px;
    color: #666;
}
.summary-value {
    font-size: 14px;
    color: #333;
    font-weight: 500;
    &.highlight {
        color: #2979ff;
        font-weight: 600;
    }
}
// å¼¹çª—样式
.filter-popup {
    padding: 12px 12px 20px;
}
.popup-header {
    padding: 10px 16px;
    border-bottom: 1px solid #f5f5f5;
}
.popup-title {
    font-size: 16px;
    font-weight: 500;
    color: #333;
}
.uploaded-list {
    padding: 8px 16px 0 16px;
}
.uploaded-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 8px 0;
    border-bottom: 1px solid #f5f5f5;
}
.file-name {
    font-size: 12px;
    color: #333;
    margin-right: 8px;
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.tip-text {
    padding: 4px 16px 0 16px;
    font-size: 12px;
    color: #888;
}
.filter-actions {
    display: flex;
    gap: 12px;
    padding: 12px 16px 16px;
    justify-content: center;
}
.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: #FFFFFF;
    width: 6.375rem;
    background: #C7C9CC;
    box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2);
    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
.save-btn {
    font-weight: 400;
    font-size: 1rem;
    color: #FFFFFF;
    width: 14rem;
    background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%);
    box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2);
    border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
// uView组件样式重置
.u-divider {
    margin: 0 !important;
}