From 025e46e11cb2962fd7692adfa401333758cc779b Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期二, 02 九月 2025 14:00:34 +0800 Subject: [PATCH] 修改组件 --- src/pages/procurementManagement/procurementInvoiceLedger/index.vue | 312 +++++++++++++++------------------------------------ 1 files changed, 91 insertions(+), 221 deletions(-) diff --git a/src/pages/procurementManagement/procurementInvoiceLedger/index.vue b/src/pages/procurementManagement/procurementInvoiceLedger/index.vue index 7e63bfc..3517776 100644 --- a/src/pages/procurementManagement/procurementInvoiceLedger/index.vue +++ b/src/pages/procurementManagement/procurementInvoiceLedger/index.vue @@ -3,7 +3,7 @@ <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 --> <PageHeader title="鏉ョエ鍙拌处" @back="goBack" /> - <!-- 鎼滅储鍜岀瓫閫夊尯鍩燂紙淇濇寔涓庨攢鍞彴璐﹂鏍间竴鑷达級 --> + <!-- 鎼滅储鍖哄煙 --> <view class="search-filter-section"> <view class="search-bar"> <view class="search-input"> @@ -15,9 +15,6 @@ @confirm="handleQuery" /> </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,8 +107,8 @@ @click="handleDelete(item)" > 鍒犻櫎 - </van-button> - <van-button + </u-button> + <u-button type="default" size="small" plain @@ -121,8 +117,8 @@ @click="openFileActions(item.commonFiles || [])" > 鏌ョ湅闄勪欢 - </van-button> - <van-button + </u-button> + <u-button type="primary" size="small" class="action-btn" @@ -131,7 +127,7 @@ @click="openUpload(item)" > 涓婁紶 - </van-button> + </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() @@ -250,19 +204,12 @@ const page = reactive({ current: -1, size: -1 }) const searchForm = reactive({ searchText: '', - status: false, - createTimeStart: '' }) - -// 椤堕儴浜や簰 -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('鎵撳紑澶辫触') } } @@ -687,27 +562,15 @@ padding: 12px 12px 20px; } -.switch-row { - padding: 12px 16px; - display: flex; - align-items: center; - justify-content: space-between; +.popup-header { + padding: 10px 16px; + border-bottom: 1px solid #f5f5f5; } -.switch-label { - font-size: 14px; +.popup-title { + font-size: 16px; + font-weight: 500; color: #333; -} - -.filter-actions { - display: flex; - gap: 12px; - padding: 12px 16px 16px; - justify-content: space-between; -} - -.edit-container { - padding-bottom: 5rem; } .uploaded-list { @@ -738,6 +601,13 @@ color: #888; } +.filter-actions { + display: flex; + gap: 12px; + padding: 12px 16px 16px; + justify-content: center; +} + .footer-btns { position: fixed; left: 0; -- Gitblit v1.9.3