From 709c315971f74f02867dac2d93a1c678957f35e0 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Fri, 6 Nov 2026 16:13:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A1=E8=B4=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=94=B6=E8=B4=A7=E6=97=B6=E9=97=B4=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/BatchAddIncomeBillFeeRequest.java | 4 + .../vo/ChargeWeightTemplateRequest.java | 3 + .../vo/PrcBillingBillListExportRow.java | 2 +- .../domain/vo/RecalcBillPriceRequest.java | 3 + .../bms/price/search/EsBillSearchStore.java | 5 - .../service/impl/PrcOrderBillServiceImpl.java | 33 +- bms-front/src/utils/excelExport.js | 30 +- bms-front/src/utils/exportFieldDefs.js | 2 +- bms-front/src/views/price/billing/bill.vue | 299 ++++++++++++++++-- bms-front/src/views/price/orderBill/index.vue | 188 ++++++++++- 10 files changed, 517 insertions(+), 52 deletions(-) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BatchAddIncomeBillFeeRequest.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BatchAddIncomeBillFeeRequest.java index 511ee24e..58ddd1a4 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BatchAddIncomeBillFeeRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BatchAddIncomeBillFeeRequest.java @@ -40,6 +40,10 @@ public class BatchAddIncomeBillFeeRequest implements Serializable private String beginBizDate; private String endBizDate; + /** Receive/pickup time range (pickup_date), inclusive. */ + private String beginPickupDate; + private String endPickupDate; + /** Surcharge config id (prc_surcharge.sc_id). */ @NotNull(message = "scId required") private Long scId; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/ChargeWeightTemplateRequest.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/ChargeWeightTemplateRequest.java index d6fc692a..f718ccb1 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/ChargeWeightTemplateRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/ChargeWeightTemplateRequest.java @@ -25,4 +25,7 @@ public class ChargeWeightTemplateRequest implements Serializable private List orderStatuses; private String beginBizDate; private String endBizDate; + /** Receive/pickup time range (pickup_date), inclusive. */ + private String beginPickupDate; + private String endPickupDate; } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/PrcBillingBillListExportRow.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/PrcBillingBillListExportRow.java index 4919e8e0..457b70ea 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/PrcBillingBillListExportRow.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/PrcBillingBillListExportRow.java @@ -56,7 +56,7 @@ public class PrcBillingBillListExportRow implements Serializable @Excel(name = "计费时间", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date bizDate; - @Excel(name = "提货时间", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "收货时间", width = 20, dateFormat = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date pickupDate; @Excel(name = "销售员", width = 12) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/RecalcBillPriceRequest.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/RecalcBillPriceRequest.java index 0f398f58..9a36c6dd 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/RecalcBillPriceRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/RecalcBillPriceRequest.java @@ -31,4 +31,7 @@ public class RecalcBillPriceRequest implements Serializable private List billingFailStatuses; private String beginBizDate; private String endBizDate; + /** Receive/pickup time range (pickup_date), inclusive. */ + private String beginPickupDate; + private String endPickupDate; } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java b/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java index 1259609e..52f99f25 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/search/EsBillSearchStore.java @@ -630,11 +630,6 @@ public class EsBillSearchStore implements IBillSearchStore filters.add(wrap); } - private String escapeWildcard(String value) - { - return value.replace("\\", "\\\\").replace("*", "\\*").replace("?", "\\?"); - } - private long readTotal(Object total) { if (total instanceof JSONObject) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java index f1617014..8614f22d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java @@ -681,6 +681,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService request.getCustomerCodes(), request.getProductCodes(), request.getCountryCode(), request.getCreditArrearsStatus(), request.getOrderStatuses(), request.getBillingFailStatuses(), request.getBeginBizDate(), request.getEndBizDate(), + request.getBeginPickupDate(), request.getEndPickupDate(), "price.bill.recalc.filterRequired", "price.bill.recalc.scopeRequired", "price.bill.recalc.selectedRequired"); if (bills.isEmpty()) @@ -1276,6 +1277,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService request.getCustomerCodes(), request.getProductCodes(), request.getCountryCode(), request.getCreditArrearsStatus(), request.getOrderStatuses(), request.getBillingFailStatuses(), request.getBeginBizDate(), request.getEndBizDate(), + request.getBeginPickupDate(), request.getEndPickupDate(), "price.bill.fee.batch.filterRequired", "price.bill.fee.batch.scopeRequired", "price.bill.fee.batch.selectedRequired"); } @@ -1290,6 +1292,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService List customerCodesRaw, List productCodesRaw, String countryCodeRaw, String creditArrearsStatusRaw, List orderStatusesRaw, List billingFailStatusesRaw, String beginBizDateRaw, String endBizDateRaw, + String beginPickupDateRaw, String endPickupDateRaw, String msgFilter, String msgScope, String msgSelected) { String scopeMode = StringUtils.nvl(scopeModeRaw, "").trim().toUpperCase(); @@ -1311,6 +1314,8 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService : countryCodeRaw.trim().toUpperCase(); String beginBizDate = StringUtils.isEmpty(beginBizDateRaw) ? null : beginBizDateRaw.trim(); String endBizDate = StringUtils.isEmpty(endBizDateRaw) ? null : endBizDateRaw.trim(); + String beginPickupDate = StringUtils.isEmpty(beginPickupDateRaw) ? null : beginPickupDateRaw.trim(); + String endPickupDate = StringUtils.isEmpty(endPickupDateRaw) ? null : endPickupDateRaw.trim(); boolean hasFilter = (orderNos != null && !orderNos.isEmpty()) || (trackingNos != null && !trackingNos.isEmpty()) || (transferNos != null && !transferNos.isEmpty()) @@ -1321,7 +1326,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService || StringUtils.isNotEmpty(creditArrearsStatus) || StringUtils.isNotEmpty(countryCode) || StringUtils.isNotEmpty(beginBizDate) - || StringUtils.isNotEmpty(endBizDate); + || StringUtils.isNotEmpty(endBizDate) + || StringUtils.isNotEmpty(beginPickupDate) + || StringUtils.isNotEmpty(endPickupDate); if (!hasFilter) { throw new ServiceException(MessageUtils.message(msgFilter)); @@ -1356,6 +1363,14 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService { query.getParams().put("endBizDate", endBizDate); } + if (beginPickupDate != null) + { + query.getParams().put("beginPickupDate", beginPickupDate); + } + if (endPickupDate != null) + { + query.getParams().put("endPickupDate", endPickupDate); + } } List list = self.selectBillList(query); return list == null ? new ArrayList() : list; @@ -2754,6 +2769,10 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService : request.getBeginBizDate().trim(); String endBizDate = StringUtils.isEmpty(request.getEndBizDate()) ? null : request.getEndBizDate().trim(); + String beginPickupDate = StringUtils.isEmpty(request.getBeginPickupDate()) ? null + : request.getBeginPickupDate().trim(); + String endPickupDate = StringUtils.isEmpty(request.getEndPickupDate()) ? null + : request.getEndPickupDate().trim(); boolean hasFilter = (orderNos != null && !orderNos.isEmpty()) || (trackingNos != null && !trackingNos.isEmpty()) || (transferNos != null && !transferNos.isEmpty()) @@ -2762,7 +2781,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService || (productCodes != null && !productCodes.isEmpty()) || StringUtils.isNotEmpty(creditArrearsStatus) || StringUtils.isNotEmpty(beginBizDate) - || StringUtils.isNotEmpty(endBizDate); + || StringUtils.isNotEmpty(endBizDate) + || StringUtils.isNotEmpty(beginPickupDate) + || StringUtils.isNotEmpty(endPickupDate); if (!hasFilter) { throw new ServiceException("请先设置列表筛选条件"); @@ -2784,6 +2805,14 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService { query.getParams().put("endBizDate", endBizDate); } + if (beginPickupDate != null) + { + query.getParams().put("beginPickupDate", beginPickupDate); + } + if (endPickupDate != null) + { + query.getParams().put("endPickupDate", endPickupDate); + } List list = self.selectBillList(query); if (list == null || list.isEmpty()) { diff --git a/bms-front/src/utils/excelExport.js b/bms-front/src/utils/excelExport.js index 4ca5508e..12bcd0c8 100644 --- a/bms-front/src/utils/excelExport.js +++ b/bms-front/src/utils/excelExport.js @@ -123,11 +123,13 @@ function taskDone(task, options) { * @param {string} [options.filePrefix='export'] * @param {string} [options.loadingText] * @param {(task: object) => void} [options.onProgress] - * @param {number} [options.pollIntervalMs=800] + * @param {boolean} [options.showLoading=true] full-screen ElLoading; set false when page shows its own float progress + * @param {number} [options.pollIntervalMs=1000] * @param {number} [options.maxWaitMs] * @param {string[]} [options.successStatus] * @param {string[]} [options.failStatus] * @param {boolean} [options.showSuccessMessage=true] + * @param {boolean} [options.showErrorMessage=true] */ export async function exportAsync(options = {}) { const { submitUrl, taskUrlPrefix, downloadUrlPrefix } = resolveAsyncUrls(options) @@ -152,11 +154,15 @@ export async function exportAsync(options = {}) { const filePrefix = options.filePrefix || 'export' const loadingText = options.loadingText || '\u6b63\u5728\u5bfc\u51fa\uff0c\u8bf7\u7a0d\u5019' - const pollIntervalMs = options.pollIntervalMs || 800 + const pollIntervalMs = options.pollIntervalMs || 1000 const maxWaitMs = options.maxWaitMs || 30 * 60 * 1000 const showSuccessMessage = options.showSuccessMessage !== false + const showErrorMessage = options.showErrorMessage !== false + const useLoading = options.showLoading !== false - const loading = ElLoading.service({ text: loadingText, background: 'rgba(0, 0, 0, 0.7)' }) + const loading = useLoading + ? ElLoading.service({ text: loadingText, background: 'rgba(0, 0, 0, 0.7)' }) + : null try { const submitRes = await request({ url: submitUrl, @@ -167,15 +173,23 @@ export async function exportAsync(options = {}) { }) const taskId = pickTaskId(submitRes && submitRes.data) if (!taskId) throw new Error('missing export taskId') + if (typeof options.onTaskId === 'function') options.onTaskId(String(taskId)) const started = Date.now() let task = null + let lastSig = '' while (Date.now() - started < maxWaitMs) { + const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden' const res = await request({ url: taskUrlPrefix + String(taskId), method: 'get' }) task = res.data || {} - if (typeof options.onProgress === 'function') options.onProgress(task) const pct = Number(task.percent) - if (!Number.isNaN(pct) && pct >= 0) { + const st = String(task.status || task.exportStatus || '').toUpperCase() + const sig = [st, pct, task.message, task.rowCount].join('|') + if (typeof options.onProgress === 'function' && sig !== lastSig) { + lastSig = sig + options.onProgress(task) + } + if (loading && !Number.isNaN(pct) && pct >= 0) { loading.setText(loadingText + ' ' + Math.min(100, pct) + '%') } const state = taskDone(task, options) @@ -183,7 +197,7 @@ export async function exportAsync(options = {}) { if (state === 'FAIL') { throw new Error(task.error || task.remark || task.message || 'export failed') } - await sleep(pollIntervalMs) + await sleep(hidden ? 2500 : pollIntervalMs) } if (!task || taskDone(task, options) !== 'SUCCESS') { throw new Error('export timeout') @@ -204,10 +218,10 @@ export async function exportAsync(options = {}) { if (showSuccessMessage) ElMessage.success('\u5bfc\u51fa\u6210\u529f') return { task, taskId } } catch (e) { - ElMessage.error((e && e.message) || '\u5bfc\u51fa\u5931\u8d25') + if (showErrorMessage) ElMessage.error((e && e.message) || '\u5bfc\u51fa\u5931\u8d25') return null } finally { - loading.close() + if (loading) loading.close() } } diff --git a/bms-front/src/utils/exportFieldDefs.js b/bms-front/src/utils/exportFieldDefs.js index a710d035..0603df73 100644 --- a/bms-front/src/utils/exportFieldDefs.js +++ b/bms-front/src/utils/exportFieldDefs.js @@ -68,7 +68,7 @@ export const BILLING_BILL_EXPORT_FIELDS = [ { prop: 'customerActiveStatusLabel', label: '客户状态' }, { prop: 'creditArrearsStatusLabel', label: '额度欠费' }, { prop: 'bizDate', label: '计费时间' }, - { prop: 'pickupDate', label: '提货时间' }, + { prop: 'pickupDate', label: '收货时间' }, { prop: 'belongSaler', label: '销售员' }, { prop: 'settlementMan', label: '结算员' }, { prop: 'serviceMan', label: '客服员' } diff --git a/bms-front/src/views/price/billing/bill.vue b/bms-front/src/views/price/billing/bill.vue index 96b9de3a..7052c865 100644 --- a/bms-front/src/views/price/billing/bill.vue +++ b/bms-front/src/views/price/billing/bill.vue @@ -1,5 +1,20 @@