From 752b14d2caa47ccceac328f79389fbf5e2e62ce4 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 24 九月 2025 15:18:39 +0800
Subject: [PATCH] 分析追溯
---
src/pages/procurementManagement/procurementInvoiceLedger/index.vue | 559 ++++++++++---------------------------------------------
1 files changed, 103 insertions(+), 456 deletions(-)
diff --git a/src/pages/procurementManagement/procurementInvoiceLedger/index.vue b/src/pages/procurementManagement/procurementInvoiceLedger/index.vue
index 7e63bfc..4934371 100644
--- a/src/pages/procurementManagement/procurementInvoiceLedger/index.vue
+++ b/src/pages/procurementManagement/procurementInvoiceLedger/index.vue
@@ -3,21 +3,18 @@
<!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
<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="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>
@@ -90,10 +87,9 @@
<text class="detail-label">褰曞叆鏃ユ湡</text>
<text class="detail-value">{{ item.createdAt }}</text>
</view>
-
</view>
<view class="action-buttons">
- <van-button
+ <u-button
type="primary"
size="small"
class="action-btn"
@@ -101,9 +97,9 @@
@click="openEdit(item)"
>
缂栬緫
- </van-button>
- <van-button
- type="danger"
+ </u-button>
+ <u-button
+ type="error"
size="small"
plain
class="action-btn"
@@ -111,27 +107,27 @@
@click="handleDelete(item)"
>
鍒犻櫎
- </van-button>
- <van-button
- type="default"
- size="small"
- plain
- class="action-btn"
- v-if="item.invoiceFileName"
- @click="openFileActions(item.commonFiles || [])"
- >
- 鏌ョ湅闄勪欢
- </van-button>
- <van-button
- type="primary"
- size="small"
- class="action-btn"
- v-else
- :disabled="item.issUer !== userStore.nickName"
- @click="openUpload(item)"
- >
- 涓婁紶
- </van-button>
+ </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>
@@ -140,84 +136,40 @@
<text>鏆傛棤鏉ョエ鍙拌处鏁版嵁</text>
</view>
- <!-- 绛涢�夊脊绐� -->
- <van-popup v-model:show="showFilter" position="bottom" round>
- <view class="filter-popup">
- <van-cell-group title="绛涢�夋潯浠�" inset>
- <van-field
- label="鏉ョエ鏃ユ湡"
- readonly
- @click="showInvoiceRange = true"
- :placeholder="invoiceRangeLabel || '璇烽�夋嫨鏃ユ湡鑼冨洿'"
- />
- <van-field
- label="褰曞叆鏃ユ湡"
- readonly
- @click="showCreateDatePicker = true"
- :placeholder="searchForm.createTimeStart || '璇烽�夋嫨褰曞叆鏃ユ湡'"
- />
- <view class="switch-row">
- <text class="switch-label">涓嶆樉绀烘湁鍙戠エ琛�</text>
- <van-switch v-model="searchForm.status" size="20" />
- </view>
- </van-cell-group>
- <view class="filter-actions">
- <van-button @click="resetFilter">閲嶇疆</van-button>
- <van-button type="primary" @click="confirmFilter">纭畾</van-button>
- </view>
- </view>
- </van-popup>
-
- <!-- 鏃ュ巻锛氭潵绁ㄦ棩鏈熻寖鍥� -->
- <van-popup v-model:show="showInvoiceRange" position="bottom">
- <van-calendar
- title="閫夋嫨鏉ョエ鏃ユ湡鑼冨洿"
- type="range"
- color="#2979ff"
- @confirm="onInvoiceRangeConfirm"
- @cancel="showInvoiceRange = false"
- />
- </van-popup>
-
- <!-- 鏃ユ湡锛氬綍鍏ユ棩鏈� -->
- <van-popup v-model:show="showCreateDatePicker" position="bottom">
- <van-date-picker
- v-model="currentCreateDate"
- title="閫夋嫨褰曞叆鏃ユ湡"
- @confirm="onCreateDateConfirm"
- @cancel="showCreateDatePicker = false"
- />
- </van-popup>
-
-
-
<!-- 鍗曡涓婁紶寮圭獥锛堟棤琛ㄥ崟锛� -->
- <van-popup v-model:show="showUpload" position="bottom" round>
+ <u-popup v-model="showUpload" mode="bottom" border-radius="10">
<view class="upload-container">
- <van-cell-group title="涓婁紶闄勪欢锛堜粎鏀寔 pdf锛屾渶澶�10MB锛屾渶澶�10涓級" inset>
- <van-uploader
- accept="*"
- multiple
- :max-count="10"
- :after-read="afterReadRowUpload"
- :before-read="beforeReadPdf"
- />
- <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>
- <van-button size="mini" type="danger" plain @click="removeUploaded(idx)">绉婚櫎</van-button>
- </view>
+ <view class="popup-header">
+ <text class="popup-title">涓婁紶闄勪欢锛堜粎鏀寔 pdf锛屾渶澶�10MB锛屾渶澶�10涓級</text>
+ </view>
+ <u-upload
+ ref="uploadRef"
+ accept="file"
+ multiple
+ :max-count="10"
+ :show-progress="true"
+ :before-upload="beforeReadPdf"
+ :action="uploadUrl"
+ :header="{ Authorization: 'Bearer ' + getToken() }"
+ name="file"
+ @on-success="onUploadSuccess"
+ @on-error="onUploadError"
+ />
+ <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>
- </van-cell-group>
+ </view>
<view class="filter-actions">
- <van-button @click="showUpload = false">鍙栨秷</van-button>
- <van-button type="primary" @click="confirmUpload">纭</van-button>
+ <u-button @click="showUpload = false" type="default" size="default" style="width: 150px;">鍙栨秷</u-button>
+ <u-button @click="confirmUpload" type="primary" size="default" style="width: 150px;">纭</u-button>
</view>
</view>
- </van-popup>
+ </u-popup>
<!-- 闄勪欢鍒楄〃閫夋嫨 -->
- <van-action-sheet v-model:show="showFileSheet" :actions="fileActions" cancel-text="鍙栨秷" close-on-click-action @select="onSelectFile" />
+ <u-action-sheet v-model="showFileSheet" :list="fileActions" :cancel-btn="true" @click="onSelectFile" @close="showFileSheet = false" />
</view>
</template>
@@ -241,6 +193,8 @@
import {onShow} from "@dcloudio/uni-app";
import {productRecordPage} from "@/api/procurementManagement/procurementInvoiceLedger";
import {delRegistration} from "@/api/procurementManagement/invoiceEntry";
+import PageHeader from '@/components/PageHeader.vue';
+import FooterButtons from '@/components/FooterButtons.vue';
const userStore = useUserStore()
@@ -249,20 +203,13 @@
const total = ref(0)
const page = reactive({ current: -1, size: -1 })
const searchForm = reactive({
- searchText: '',
- status: false,
- createTimeStart: ''
+ supplierName: '',
})
-
-// 椤堕儴浜や簰
-const showFilter = ref(false)
-const showInvoiceRange = ref(false)
-const showCreateDatePicker = ref(false)
-const invoiceRangeLabel = ref('')
-const currentCreateDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()])
const currentId = ref('')
const fileList = ref([]) // 琛屼笂浼犳垨閫氱敤涓婁紶鍒楄〃
+const uploadRef = ref()
+const uploadUrl = config.baseUrl + '/invoiceLedger/uploadFile'
// 琛屼笂浼犲脊绐�
const showUpload = ref(false)
@@ -293,65 +240,19 @@
const getList = async () => {
try {
- showLoadingToast({ message: '鍔犺浇涓�...' })
- const { invoiceDate, ...rest } = searchForm
- const res = await productRecordPage({ ...rest, ...page })
+ uni.showLoading({
+ title: '鍔犺浇涓�...'
+ });
+ const res = await productRecordPage({ ...searchForm, ...page })
// 鍏煎涓嶅悓杩斿洖缁撴瀯
const records = res?.data?.records || res?.records || res?.data || []
const totalVal = res?.data?.total || res?.total || records.length || 0
ledgerList.value = records
total.value = totalVal
- closeToast()
+ uni.hideLoading();
} catch (e) {
- closeToast()
+ uni.hideLoading();
showToast('鑾峰彇鍒楄〃澶辫触')
- }
-}
-
-// 绛涢�夐�昏緫
-const resetFilter = () => {
- searchForm.searchText = ''
- searchForm.status = false
- const start = dayjs().startOf('month').format('YYYY-MM-DD')
- const end = dayjs().endOf('month').format('YYYY-MM-DD')
- searchForm.invoiceDate = [start, end]
- searchForm.invoiceDateStart = start
- searchForm.invoiceDateEnd = end
- searchForm.createTimeStart = ''
- invoiceRangeLabel.value = ''
-}
-const confirmFilter = () => {
- showFilter.value = false
- getList()
-}
-const onInvoiceRangeConfirm = (e) => {
- // e 涓� [start, end] 鐨� Date 瀵硅薄鎴栧瓧绗︿覆锛寀ni-app 涓� Vant Calendar 杩斿洖鏃堕棿鎴虫暟缁�
- try {
- let start, end
- if (Array.isArray(e)) {
- const [s, ed] = e
- start = dayjs(s).format('YYYY-MM-DD')
- end = dayjs(ed).format('YYYY-MM-DD')
- } else if (e && e.detail && Array.isArray(e.detail)) {
- const [s, ed] = e.detail
- start = dayjs(s).format('YYYY-MM-DD')
- end = dayjs(ed).format('YYYY-MM-DD')
- }
- searchForm.invoiceDateStart = start
- searchForm.invoiceDateEnd = end
- invoiceRangeLabel.value = `${start} 鑷� ${end}`
- showInvoiceRange.value = false
- } catch (err) {
- showInvoiceRange.value = false
- }
-}
-const onCreateDateConfirm = ({ selectedValues }) => {
- try {
- searchForm.createTimeStart = selectedValues.join('-')
- currentCreateDate.value = selectedValues
- showCreateDatePicker.value = false
- } catch (err) {
- showCreateDatePicker.value = false
}
}
@@ -376,13 +277,15 @@
success: async (res) => {
if (res.confirm) {
try {
- showLoadingToast({ message: '澶勭悊涓�...' })
+ uni.showLoading({
+ title: '澶勭悊涓�...'
+ });
await delRegistration(ids)
- closeToast()
+ uni.hideLoading();
showToast('鍒犻櫎鎴愬姛')
await getList()
} catch (e) {
- closeToast()
+ uni.hideLoading();
showToast('鍒犻櫎澶辫触锛岃閲嶈瘯')
}
}
@@ -399,16 +302,18 @@
const confirmUpload = async () => {
try {
const payload = { fileList: fileList.value, id: currentId.value }
- showLoadingToast({ message: '鎻愪氦涓�...' })
+ uni.showLoading({
+ title: '鎻愪氦涓�...'
+ });
await commitFile(payload)
- closeToast()
+ uni.hideLoading();
showToast('鎻愪氦鎴愬姛')
showUpload.value = false
fileList.value = []
currentId.value = ''
getList()
} catch (e) {
- closeToast()
+ uni.hideLoading();
showToast('鎻愪氦澶辫触锛岃閲嶈瘯')
}
}
@@ -432,59 +337,24 @@
return true
}
-const uploadSingleFile = async (fileObj) => {
- return new Promise((resolve, reject) => {
- showLoadingToast({ message: '姝e湪涓婁紶...' })
- uni.uploadFile({
- url: config.baseUrl + '/invoiceLedger/uploadFile',
- filePath: fileObj.url || fileObj.file?.path || fileObj.tempFilePath,
- name: 'file',
- header: { Authorization: 'Bearer ' + getToken() },
- success: (res) => {
- closeToast()
- try {
- const data = JSON.parse(res.data || '{}')
- if (data.code === 200) {
- resolve(data.data)
- } else {
- reject(new Error(data.msg || '涓婁紶澶辫触'))
- }
- } catch (err) {
- reject(err)
- }
- },
- fail: (err) => {
- closeToast()
- reject(err)
- }
- })
- })
-}
-
-const afterReadEditUpload = async (file) => {
+// uview-plus 鐨勪笂浼犳垚鍔熷洖璋�
+const onUploadSuccess = (res, file) => {
try {
- const files = Array.isArray(file) ? file : file?.file ? [file] : [file]
- for (const f of files) {
- const uploaded = await uploadSingleFile(f)
- fileList.value.push(uploaded)
+ const data = JSON.parse(res.data || '{}')
+ if (data.code === 200) {
+ fileList.value.push(data.data)
+ showToast('涓婁紶鎴愬姛')
+ } else {
+ showToast('涓婁紶澶辫触: ' + (data.msg || '鏈煡閿欒'))
}
- showToast('涓婁紶鎴愬姛')
- } catch (e) {
+ } catch (err) {
showToast('涓婁紶澶辫触')
}
}
-const afterReadRowUpload = async (file) => {
- try {
- const files = Array.isArray(file) ? file : file?.file ? [file] : [file]
- for (const f of files) {
- const uploaded = await uploadSingleFile(f)
- fileList.value.push(uploaded)
- }
- showToast('涓婁紶鎴愬姛')
- } catch (e) {
- showToast('涓婁紶澶辫触')
- }
+// uview-plus 鐨勪笂浼犲け璐ュ洖璋�
+const onUploadError = (err) => {
+ showToast('涓婁紶澶辫触')
}
const removeUploaded = (index) => {
@@ -503,18 +373,23 @@
// 闄勪欢鏌ョ湅
const openFileActions = (commonFiles) => {
currentFilesToOpen = commonFiles || []
- fileActions.value = (commonFiles || []).map((f, idx) => ({ name: getFileNameFromUrl(f.url || ''), index: idx }))
+ fileActions.value = (commonFiles || []).map((f, idx) => ({
+ title: getFileNameFromUrl(f.url || ''),
+ index: idx
+ }))
showFileSheet.value = true
}
const onSelectFile = async (action) => {
try {
const item = currentFilesToOpen[action.index]
if (!item || !item.url) return
- showLoadingToast({ message: '涓嬭浇涓�...' })
+ uni.showLoading({
+ title: '涓嬭浇涓�...'
+ });
uni.downloadFile({
url: item.url,
success: (res) => {
- closeToast()
+ uni.hideLoading();
if (res.statusCode === 200) {
uni.openDocument({ filePath: res.tempFilePath })
} else {
@@ -522,12 +397,12 @@
}
},
fail: () => {
- closeToast()
+ uni.hideLoading();
showToast('涓嬭浇澶辫触')
}
})
} catch (e) {
- closeToast()
+ uni.hideLoading();
showToast('鎵撳紑澶辫触')
}
}
@@ -538,235 +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;
-}
-
-.switch-row {
- padding: 12px 16px;
- display: flex;
- align-items: center;
- justify-content: space-between;
-}
-
-.switch-label {
- font-size: 14px;
- color: #333;
-}
-
-.filter-actions {
- display: flex;
- gap: 12px;
- padding: 12px 16px 16px;
- justify-content: space-between;
-}
-
-.edit-container {
- padding-bottom: 5rem;
-}
-
-.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;
-}
-
-.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>
\ No newline at end of file
--
Gitblit v1.9.3