src/pages/procurementManagement/paymentLedger/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/procurementManagement/paymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/invoiceLedger/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/invoiceLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/invoicingRegistration/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/receiptPayment/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/receiptPaymentHistory/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/receiptPaymentLedger/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/receiptPaymentLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/sales/salesAccount/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/styles/sales-common.scss | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/pages/procurementManagement/paymentLedger/detail.vue
@@ -89,17 +89,16 @@ // è¿åä¸ä¸é¡µ const goBack = () => { uni.removeStorageSync('supplierId') uni.navigateBack(); }; // è·å页é¢åæ° const getPageParams = () => { const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; const options = currentPage.options; if (options.supplierId) { supplierId.value = options.supplierId; // 仿¬å°åå¨è·åä¾åºåID const storedSupplierId = uni.getStorageSync('supplierId'); if (storedSupplierId) { supplierId.value = storedSupplierId; } }; src/pages/procurementManagement/paymentLedger/index.vue
@@ -116,9 +116,11 @@ const rowClickMethod = (row) => { // ä½¿ç¨ uni.setStorageSync åå¨ä¾åºåä¿¡æ¯ uni.setStorageSync('supplierId', row.supplierId); // 跳转å°åæ¬¾è®°å½æç»é¡µé¢ uni.navigateTo({ url: `/pages/procurementManagement/paymentLedger/detail?supplierId=${row.supplierId}` url: '/pages/procurementManagement/paymentLedger/detail' }); }; src/pages/sales/invoiceLedger/detail.vue
@@ -26,24 +26,24 @@ </u-form-item> </u-cell-group> <u-cell-group title="éä»¶ææï¼ä» æ¯æ pdfï¼"> <u-upload accept=".pdf" multiple :afterRead="afterReadUpload" :beforeRead="beforeReadPdf" > <u-button class="upload-btn" type="primary"> ä¸ä¼ æä»¶ </u-button> </u-upload> <view class="uploaded-list" v-if="fileList.length"> <view class="uploaded-item" v-for="(f, idx) in fileList" :key="idx"> <text class="file-name">{{ f.name || getFileNameFromUrl(f.url) }}</text> <u-button size="mini" type="error" plain @click="removeUploaded(idx)">ç§»é¤</u-button> </view> </view> </u-cell-group> <!-- <u-cell-group title="éä»¶ææï¼ä» æ¯æ pdfï¼">--> <!-- <u-upload--> <!-- accept=".pdf"--> <!-- multiple--> <!-- :afterRead="afterReadUpload"--> <!-- :beforeRead="beforeReadPdf"--> <!-- >--> <!-- <u-button class="upload-btn" type="primary">--> <!-- ä¸ä¼ æä»¶--> <!-- </u-button>--> <!-- </u-upload>--> <!-- <view class="uploaded-list" v-if="fileList.length">--> <!-- <view class="uploaded-item" v-for="(f, idx) in fileList" :key="idx">--> <!-- <text class="file-name">{{ f.name || getFileNameFromUrl(f.url) }}</text>--> <!-- <u-button size="mini" type="error" plain @click="removeUploaded(idx)">ç§»é¤</u-button>--> <!-- </view>--> <!-- </view>--> <!-- </u-cell-group>--> <!-- æäº¤æé® --> <view class="footer-btns"> src/pages/sales/invoiceLedger/index.vue
@@ -2,28 +2,28 @@ <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.searchText" confirm-type="search" @confirm="handleQuery" @change="handleQuery" clearable /> </view> <!-- <view class="filter-button" @click="showFilter = true">--> <!-- <up-icon name="list" size="24" color="#999"></up-icon>--> <!-- </view>--> <!-- <view class="filter-button" @click="showFilter = true">--> <!-- <up-icon name="list" size="24" color="#999"></up-icon>--> <!-- </view>--> <view class="filter-button" @click="handleQuery"> <up-icon name="search" size="24" color="#999"></up-icon> </view> </view> </view> <!-- å表åºå --> <view class="ledger-list" v-if="ledgerList.length > 0"> <view v-for="(item, index) in ledgerList" :key="index"> @@ -112,16 +112,16 @@ > æ¥çéä»¶ </up-button> <up-button type="primary" size="small" class="action-btn" v-else :disabled="item.invoicePerson !== userStore.nickName" @click="openUpload(item)" > ä¸ä¼ </up-button> <!-- <up-button--> <!-- type="primary"--> <!-- size="small"--> <!-- class="action-btn"--> <!-- v-else--> <!-- :disabled="item.invoicePerson !== userStore.nickName"--> <!-- @click="openUpload(item)"--> <!-- >--> <!-- ä¸ä¼ --> <!-- </up-button>--> </view> </view> </view> @@ -129,7 +129,7 @@ <view v-else class="no-data"> <text>ææ å¼ç¥¨å°è´¦æ°æ®</text> </view> <!-- çéå¼¹çª --> <up-popup v-model="showFilter" mode="bottom" round><up-transition> <view class="filter-popup"> @@ -158,7 +158,7 @@ </view> </view> </up-transition></up-popup> <!-- æ¥åï¼å¼ç¥¨æ¥æèå´ --> <up-popup v-model="showInvoiceRange" mode="bottom"><up-transition> <up-datetime-picker @@ -169,7 +169,7 @@ @cancel="showInvoiceRange = false" /> </up-transition></up-popup> <!-- æ¥æï¼å½å ¥æ¥æ --> <up-popup v-model="showCreateDatePicker" mode="bottom"><up-transition> <up-datetime-picker @@ -181,9 +181,9 @@ @cancel="showCreateDatePicker = false" /> </up-transition></up-popup> <!-- åè¡ä¸ä¼ å¼¹çªï¼æ 表åï¼ --> <up-popup v-model="showUpload" mode="bottom" round><up-transition> <view class="upload-container"> @@ -210,7 +210,7 @@ </view> </view> </up-transition></up-popup> <!-- éä»¶åè¡¨éæ© --> <up-action-sheet v-model="showFileSheet" :actions="fileActions" cancel-text="åæ¶" close-on-click-action @select="onSelectFile"> <view class="up-action-sheet__cancel" @click="showFileSheet = false"> @@ -530,165 +530,15 @@ </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } .sales-account { min-height: 100vh; background: #f8f9fa; position: relative; } @import '@/styles/sales-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; } .switch-row { padding: 12px 16px; display: flex; align-items: center; justify-content: space-between; } .switch-label { font-size: 14px; color: #333; } .filter-actions { @@ -743,6 +593,7 @@ box-shadow: 0 -0.125rem 0.5rem rgba(0,0,0,0.05); z-index: 1000; } .cancel-btn { font-weight: 400; font-size: 1rem; @@ -752,6 +603,7 @@ 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; src/pages/sales/invoicingRegistration/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="customerName" clearable @change="getList" /> </view> <view class="filter-button" @click="getList"> @@ -67,21 +69,21 @@ <!-- æä½æé®åºå --> <view class="action-buttons"> <up-button type="primary" size="small" @click="handleAddInvoice(item)" class="action-btn" :disabled="item.noInvoiceAmountTotal == 0" > æ°å¢å¼ç¥¨ </up-button> <up-button size="small" @click="handleViewDetail(item)" class="action-btn" > æ¥ç详æ </up-button> type="primary" size="small" @click="handleAddInvoice(item)" class="action-btn" :disabled="item.noInvoiceAmountTotal == 0" > æ°å¢å¼ç¥¨ </up-button> <up-button size="small" @click="handleViewDetail(item)" class="action-btn" > æ¥ç详æ </up-button> </view> </view> </view> @@ -100,7 +102,7 @@ const userStore = useUserStore() // æç´¢å ³é®è¯ const searchKeyword = ref(''); const customerName = ref(''); // éå®å°è´¦æ°æ® const ledgerList = ref([]); @@ -116,7 +118,7 @@ current: -1, size: -1 } ledgerListPage({...page}).then((res) => { ledgerListPage({...page, customerName: customerName.value}).then((res) => { ledgerList.value = res.records; total.value = res.total; }).catch(() => { @@ -169,15 +171,9 @@ </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } .sales-account { min-height: 100vh; background: #f8f9fa; position: relative; } @import '@/styles/sales-common.scss'; // å¼ç¥¨ç»è®°ç¹ææ ·å¼ .nav-icon { width: 24px; height: 24px; @@ -230,176 +226,12 @@ 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/sales/receiptPayment/index.vue
@@ -2,16 +2,17 @@ <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="客æ·åç§°/ååå·/项ç®åç§°" v-model="searchForm.searchText" confirm-type="search" placeholder="请è¾å ¥å®¢æ·åç§°æç´¢" v-model="searchForm.customerName" @change="getList" clearable /> </view> <view class="filter-button" @click="getList"> @@ -25,9 +26,9 @@ <up-switch v-model="searchForm.status" @change="getList" size="18"/> </view> </view> <!-- å表åºå --> <view class="ledger-list" v-if="tableData.length > 0"> <view v-for="(item, index) in tableData" :key="index"> @@ -95,7 +96,7 @@ </view> </view> </view> <!-- æ æ°æ®æç¤º --> <view class="no-data" v-else> <text>ææ åæ¬¾æ°æ®</text> @@ -145,9 +146,8 @@ // æç´¢è¡¨å const searchForm = ref({ searchText: '', status: true, customerName: '', status: true, customerContractNo: '', projectName: '' }) @@ -193,201 +193,12 @@ </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } @import '@/styles/sales-common.scss'; .sales-account { 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/sales/receiptPaymentHistory/index.vue
@@ -1,17 +1,18 @@ <template> <view class="receipt-payment-history"> <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> <PageHeader title="忬¾åå²" @back="goBack" /> <PageHeader title="忬¾æµæ°´" @back="goBack" /> <!-- æç´¢åºå --> <view class="search-section"> <view class="search-bar"> <view class="search-input"> <input <up-input class="search-text" placeholder="请è¾å ¥å®¢æ·åç§°/客æ·ååå·" placeholder="请è¾å ¥å®¢æ·åç§°æç´¢" v-model="searchForm.searchText" @input="getList" @change="getList" clearable /> </view> <view class="search-button" @click="getList"> @@ -186,118 +187,21 @@ </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } @import '@/styles/sales-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; } .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; } .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; padding: 12px 0 0 0; // ä¸å ¬å ±æ ·å¼ä¸ç 0 0 16px 0 ä¸å } .item-tag { border-radius: 4px; padding: 2px 8px; padding: 2px 8px; // ä¸å ¬å ±æ ·å¼ä¸ç 2px 4px ä¸å } .tag-electric { @@ -313,90 +217,8 @@ } .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; } .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/receiptPaymentLedger/detail.vue
@@ -89,17 +89,16 @@ // è¿åä¸ä¸é¡µ const goBack = () => { uni.removeStorageSync('customerId') uni.navigateBack(); }; // è·å页é¢åæ° const getPageParams = () => { const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; const options = currentPage.options; if (options.customerId) { customerId.value = options.customerId; // 仿¬å°åå¨è·å客æ·ID const storedCustomerId = uni.getStorageSync('customerId'); if (storedCustomerId) { customerId.value = storedCustomerId; } }; src/pages/sales/receiptPaymentLedger/index.vue
@@ -1,67 +1,68 @@ <template> <view class="receipt-payment-ledger"> <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> <PageHeader title="客æ·å¾æ¥" @back="goBack" /> <!-- æç´¢åºå --> <view class="search-section"> <view class="search-bar"> <view class="search-input"> <input class="search-text" placeholder="请è¾å ¥å®¢æ·åç§°" v-model="searchForm.searchText" @input="handleQuery" /> </view> <view class="search-button" @click="handleQuery"> <up-icon name="search" size="24" color="#999"></up-icon> </view> </view> </view> <!-- 客æ·å表 --> <view class="customer-list-container"> <view class="customer-list" v-if="tableData.length > 0"> <view v-for="(item, index) in tableData" :key="item.id" class="customer-item" @click="rowClickMethod(item)" > <view class="item-header"> <view class="item-left"> <view class="customer-icon"> <view class="sales-account"> <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> <PageHeader title="客æ·å¾æ¥" @back="goBack" /> <!-- æç´¢åºå --> <view class="search-section"> <view class="search-bar"> <view class="search-input"> <up-input class="search-text" placeholder="请è¾å ¥å®¢æ·åç§°" v-model="searchForm.customerName" @change="handleQuery" clearable /> </view> <view class="search-button" @click="handleQuery"> <up-icon name="search" size="24" color="#999"></up-icon> </view> </view> </view> <!-- 客æ·å表 --> <view class="customer-list-container"> <view class="customer-list" v-if="tableData.length > 0"> <view v-for="(item, index) in tableData" :key="item.id" class="customer-item" @click="rowClickMethod(item)" > <view class="item-header"> <view class="item-left"> <view class="customer-icon"> <up-icon name="file-text" size="16" color="#ffffff"></up-icon> </view> <text class="customer-name">{{ item.customerName }}</text> </view> <view class="item-right"> <up-icon name="arrow-right" size="16" color="#999"></up-icon> </view> </view> <up-divider></up-divider> <view class="item-details"> <view class="detail-row"> <text class="detail-label">å¼ç¥¨éé¢(å )</text> <text class="detail-value">{{ formattedNumber(item.invoiceTotal) }}</text> </view> <view class="detail-row"> <text class="detail-label">忬¾éé¢(å )</text> <text class="detail-value">{{ formattedNumber(item.receiptPaymentAmount) }}</text> </view> <view class="detail-row"> <text class="detail-label">åºæ¶éé¢(å )</text> <text class="detail-value highlight danger">{{ formattedNumber(item.unReceiptPaymentAmount) }}</text> </view> </view> </view> </view> <view v-else class="no-data"> <text>ææ å®¢æ·æ°æ®</text> </view> </view> </view> </view> <text class="customer-name">{{ item.customerName }}</text> </view> <view class="item-right"> <up-icon name="arrow-right" size="16" color="#999"></up-icon> </view> </view> <up-divider></up-divider> <view class="item-details"> <view class="detail-row"> <text class="detail-label">å¼ç¥¨éé¢(å )</text> <text class="detail-value">{{ formattedNumber(item.invoiceTotal) }}</text> </view> <view class="detail-row"> <text class="detail-label">忬¾éé¢(å )</text> <text class="detail-value">{{ formattedNumber(item.receiptPaymentAmount) }}</text> </view> <view class="detail-row"> <text class="detail-label">åºæ¶éé¢(å )</text> <text class="detail-value highlight danger">{{ formattedNumber(item.unReceiptPaymentAmount) }}</text> </view> </view> </view> </view> <view v-else class="no-data"> <text>ææ å®¢æ·æ°æ®</text> </view> </view> </view> </template> <script setup> @@ -73,228 +74,73 @@ const tableData = ref([]); const page = reactive({ current: -1, size: -1, current: -1, size: -1, }); const data = reactive({ searchForm: { searchText: "", invoiceDate: "", }, searchForm: { customerName: "", invoiceDate: "", }, }); const { searchForm } = toRefs(data); // è¿åä¸ä¸é¡µ const goBack = () => { uni.navigateBack(); uni.navigateBack(); }; // æ¥è¯¢å表 const handleQuery = () => { getList(); getList(); }; const getList = () => { invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => { tableData.value = res.data.records; }).catch(() => { uni.showToast({ title: 'æ¥è¯¢å¤±è´¥', icon: 'error' }); }); invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => { tableData.value = res.data.records; }).catch(() => { uni.showToast({ title: 'æ¥è¯¢å¤±è´¥', icon: 'error' }); }); }; const formattedNumber = (value) => { return parseFloat(value || 0).toFixed(2); return parseFloat(value || 0).toFixed(2); }; const rowClickMethod = (row) => { // 跳转å°åæ¬¾è®°å½æç»é¡µé¢ uni.navigateTo({ url: `/pages/sales/receiptPaymentLedger/detail?customerId=${row.id}` }); // ä½¿ç¨ uni.setStorageSync åå¨å®¢æ·ä¿¡æ¯ uni.setStorageSync('customerId', row.id); // 跳转å°åæ¬¾è®°å½æç»é¡µé¢ uni.navigateTo({ url: '/pages/sales/receiptPaymentLedger/detail' }); }; onShow(() => { // 页颿¾ç¤ºæ¶å·æ°å表 getList(); // 页颿¾ç¤ºæ¶å·æ°å表 getList(); }); onMounted(() => { getList(); getList(); }); </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } @import '@/styles/sales-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; font-weight: 500; } .no-data { padding: 40px 0; text-align: center; color: #999; color: #ff4757; // ä¸å ¬å ±æ ·å¼ä¸ç #ee0a24 ä¸å font-weight: 500; } </style> src/pages/sales/salesAccount/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="salesContractNo" @change="getList" clearable /> </view> <view class="filter-button" @click="getList"> @@ -109,7 +111,7 @@ } // æç´¢å ³é®è¯ const searchKeyword = ref(''); const salesContractNo = ref(''); // éå®å°è´¦æ°æ® const ledgerList = ref([]); @@ -126,7 +128,7 @@ current: -1, size: -1 } ledgerListPage({...page}).then((res) => { ledgerListPage({...page, salesContractNo: salesContractNo.value}).then((res) => { ledgerList.value = res.records; total.value = res.total; closeToast() @@ -137,227 +139,59 @@ // å¤çå°è´¦ä¿¡æ¯æä½ï¼æ¥ç/ç¼è¾/æ°å¢ï¼ const handleInfo = (type, row) => { try { // 设置æä½ç±»å uni.setStorageSync('operationType', type); // å¦ææ¯æ¥çæç¼è¾æä½ if (type !== 'add') { // éªè¯è¡æ°æ®æ¯å¦åå¨ if (!row) { uni.showToast({ title: 'æ°æ®ä¸åå¨', icon: 'error' }); return; } // æ£æ¥æéï¼åªæå½å ¥äººæè½ç¼è¾ if (row.entryPerson != userStore.id) { // éå½å ¥äººè·³è½¬å°åªè¯»è¯¦æ é¡µé¢ uni.setStorageSync('editData', JSON.stringify(row)); uni.navigateTo({ url: '/pages/sales/salesAccount/view' }); return; } // å½å ¥äººç¼è¾ï¼å卿°æ®å¹¶è·³è½¬å°ç¼è¾é¡µé¢ uni.setStorageSync('editData', JSON.stringify(row)); uni.navigateTo({ url: '/pages/sales/salesAccount/detail' }); return; } // æ°å¢æä½ï¼ç´æ¥è·³è½¬å°ç¼è¾é¡µé¢ uni.navigateTo({ url: '/pages/sales/salesAccount/detail' }); } catch (error) { console.error('å¤çå°è´¦ä¿¡æ¯æä½å¤±è´¥:', error); uni.showToast({ title: 'æä½å¤±è´¥ï¼è¯·éè¯', icon: 'error' }); } try { // 设置æä½ç±»å uni.setStorageSync('operationType', type); // å¦ææ¯æ¥çæç¼è¾æä½ if (type !== 'add') { // éªè¯è¡æ°æ®æ¯å¦åå¨ if (!row) { uni.showToast({ title: 'æ°æ®ä¸åå¨', icon: 'error' }); return; } // æ£æ¥æéï¼åªæå½å ¥äººæè½ç¼è¾ if (row.entryPerson != userStore.id) { // éå½å ¥äººè·³è½¬å°åªè¯»è¯¦æ é¡µé¢ uni.setStorageSync('editData', JSON.stringify(row)); uni.navigateTo({ url: '/pages/sales/salesAccount/view' }); return; } // å½å ¥äººç¼è¾ï¼å卿°æ®å¹¶è·³è½¬å°ç¼è¾é¡µé¢ uni.setStorageSync('editData', JSON.stringify(row)); uni.navigateTo({ url: '/pages/sales/salesAccount/detail' }); return; } // æ°å¢æä½ï¼ç´æ¥è·³è½¬å°ç¼è¾é¡µé¢ uni.navigateTo({ url: '/pages/sales/salesAccount/detail' }); } catch (error) { console.error('å¤çå°è´¦ä¿¡æ¯æä½å¤±è´¥:', error); uni.showToast({ title: 'æä½å¤±è´¥ï¼è¯·éè¯', icon: 'error' }); } }; onShow(() => { // 页颿¾ç¤ºæ¶å·æ°å表 getList(); // 页颿¾ç¤ºæ¶å·æ°å表 getList(); }); </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } .sales-account { 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; } .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; /* ç¡®ä¿æµ®å¨æé®ä¸è¢«åºé¨å®å ¨åºå鮿¡ */ } @import '@/styles/sales-common.scss'; </style> src/styles/sales-common.scss
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,337 @@ // é宿¨¡åå ¬å ±æ ·å¼ // ç¨äºç»ä¸éå®ç¸å ³é¡µé¢çæ ·å¼é£æ ¼ // 页é¢å®¹å¨æ ·å¼ .sales-account { min-height: 100vh; background: #f8f9fa; position: relative; } .receipt-payment-ledger { min-height: 100vh; background: #f8f9fa; position: relative; } // æç´¢åçéåºåæ ·å¼ .search-filter-section, .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; } } // ååè¡¨æ ·å¼ .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; } } // uViewç»ä»¶æ ·å¼éç½® .u-divider { margin: 0 !important; }