计费列表增加状态搜索

This commit is contained in:
wuweihua
2026-10-27 13:28:14 +08:00
parent 4659c63ef9
commit 7fcd3b6089
6 changed files with 133 additions and 5 deletions
@@ -31,6 +31,8 @@ public class BatchAddIncomeBillFeeRequest implements Serializable
private List<String> productCodes;
private String countryCode;
private String creditArrearsStatus;
/** Same as list filter order_status IN (...). */
private List<Integer> orderStatuses;
/** Same as list filter billing_fail_status IN (...). */
private List<Integer> billingFailStatuses;
@@ -21,6 +21,8 @@ public class ChargeWeightTemplateRequest implements Serializable
private List<String> customerCodes;
private List<String> productCodes;
private String creditArrearsStatus;
/** Same as list filter order_status IN (...). */
private List<Integer> orderStatuses;
private String beginBizDate;
private String endBizDate;
}
@@ -25,6 +25,8 @@ public class RecalcBillPriceRequest implements Serializable
private List<String> productCodes;
private String countryCode;
private String creditArrearsStatus;
/** Same as list filter order_status IN (...). */
private List<Integer> orderStatuses;
/** Same as list filter billing_fail_status IN (...). */
private List<Integer> billingFailStatuses;
private String beginBizDate;
@@ -675,7 +675,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
List<PrcOrderBill> bills = resolveListScopedBills(request.getScopeMode(), request.getBillIds(),
request.getOrderNos(), request.getTrackingNos(), request.getTransferNos(), request.getOrderIdentifiers(),
request.getCustomerCodes(), request.getProductCodes(), request.getCountryCode(),
request.getCreditArrearsStatus(), request.getBillingFailStatuses(),
request.getCreditArrearsStatus(), request.getOrderStatuses(), request.getBillingFailStatuses(),
request.getBeginBizDate(), request.getEndBizDate(),
"price.bill.recalc.filterRequired", "price.bill.recalc.scopeRequired",
"price.bill.recalc.selectedRequired");
@@ -1251,7 +1251,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return resolveListScopedBills(request.getScopeMode(), request.getBillIds(),
request.getOrderNos(), request.getTrackingNos(), request.getTransferNos(), request.getOrderIdentifiers(),
request.getCustomerCodes(), request.getProductCodes(), request.getCountryCode(),
request.getCreditArrearsStatus(), request.getBillingFailStatuses(),
request.getCreditArrearsStatus(), request.getOrderStatuses(), request.getBillingFailStatuses(),
request.getBeginBizDate(), request.getEndBizDate(),
"price.bill.fee.batch.filterRequired", "price.bill.fee.batch.scopeRequired",
"price.bill.fee.batch.selectedRequired");
@@ -1260,11 +1260,12 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
/**
* Shared list-scope resolve for batch fee / recalc price.
* scopeMode: SELECTED uses billIds; ALL uses filters (at least one required).
* orderStatuses alone does not count as a meaningful filter (same as export).
*/
private List<PrcOrderBill> resolveListScopedBills(String scopeModeRaw, List<String> billIdsRaw,
List<String> orderNosRaw, List<String> trackingNosRaw, List<String> transferNosRaw, List<String> orderIdentifiersRaw,
List<String> customerCodesRaw, List<String> productCodesRaw, String countryCodeRaw,
String creditArrearsStatusRaw, List<Integer> billingFailStatusesRaw,
String creditArrearsStatusRaw, List<Integer> orderStatusesRaw, List<Integer> billingFailStatusesRaw,
String beginBizDateRaw, String endBizDateRaw,
String msgFilter, String msgScope, String msgSelected)
{
@@ -1279,6 +1280,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
List<String> orderIdentifiers = normalizeOrderIdentifiers(orderIdentifiersRaw);
List<String> customerCodes = normalizeCodeList(customerCodesRaw);
List<String> productCodes = normalizeCodeList(productCodesRaw);
List<Integer> orderStatuses = normalizeIntegerList(orderStatusesRaw);
List<Integer> billingFailStatuses = normalizeIntegerList(billingFailStatusesRaw);
String creditArrearsStatus = StringUtils.isEmpty(creditArrearsStatusRaw) ? null
: creditArrearsStatusRaw.trim();
@@ -1320,6 +1322,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
query.setCustomerCodes(customerCodes);
query.setProductCodes(productCodes);
query.setCreditArrearsStatus(creditArrearsStatus);
query.setOrderStatuses(orderStatuses);
query.setBillingFailStatuses(billingFailStatuses);
query.setCountryCode(countryCode);
if (beginBizDate != null)
@@ -2713,6 +2716,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
List<String> transferNos = normalizeCodeList(request.getTransferNos());
List<String> customerCodes = normalizeCodeList(request.getCustomerCodes());
List<String> productCodes = normalizeCodeList(request.getProductCodes());
List<Integer> orderStatuses = normalizeIntegerList(request.getOrderStatuses());
String creditArrearsStatus = StringUtils.isEmpty(request.getCreditArrearsStatus()) ? null
: request.getCreditArrearsStatus().trim();
String beginBizDate = StringUtils.isEmpty(request.getBeginBizDate()) ? null
@@ -2740,6 +2744,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
query.setCustomerCodes(customerCodes);
query.setProductCodes(productCodes);
query.setCreditArrearsStatus(creditArrearsStatus);
query.setOrderStatuses(orderStatuses);
if (beginBizDate != null)
{
query.getParams().put("beginBizDate", beginBizDate);
+94 -2
View File
@@ -4,6 +4,7 @@
ref="tableRef"
:columns="columns"
:search-columns="searchColumns"
:default-params="defaultParams"
:query="queryList"
:search-per-row="4"
row-key="billId"
@@ -54,6 +55,32 @@
</el-option>
</el-select>
</template>
<template #search-orderStatuses="{ model }">
<el-select
v-model="model.orderStatuses"
multiple
filterable
clearable
collapse-tags
collapse-tags-tooltip
placeholder="请选择"
style="width: 100%"
>
<template #header>
<el-checkbox
:model-value="isAllSelected(model, 'orderStatuses', orderStatusAllValues)"
:indeterminate="isIndeterminate(model, 'orderStatuses', orderStatusAllValues)"
@change="(checked) => toggleAllSelected(model, 'orderStatuses', orderStatusAllValues, checked)"
>全选</el-checkbox>
</template>
<el-option
v-for="opt in orderStatusOptions"
:key="opt.value"
:label="opt.label"
:value="opt.value"
/>
</el-select>
</template>
<template #col-product="{ row }">
{{ row.productName || '-' }} ({{ row.productCode }})
</template>
@@ -293,6 +320,56 @@ const exportFieldRef = ref()
const tableHeight = ref(480)
let tableResizeObserver = null
const defaultParams = {
orderStatuses: [3, 4, 5, 6, 7, 8, 11],
billingFailStatuses: []
}
const orderStatusMap = {
0: '草稿订单',
1: '确认订单',
2: '已中转',
3: '已收货',
4: '已装箱',
5: '已出库',
6: '转运中',
7: '已上网',
8: '已签收',
9: '已退件',
10: '已取消',
11: '已复核'
}
const orderStatusOptions = Object.keys(orderStatusMap).map(k => ({ label: orderStatusMap[k], value: Number(k) }))
const orderStatusAllValues = computed(() => orderStatusOptions.map(o => o.value))
function selectedValues(model, key) {
const value = model?.[key]
return Array.isArray(value) ? value : []
}
function resolveAllValues(allValues) {
if (Array.isArray(allValues)) return allValues
const value = allValues?.value
return Array.isArray(value) ? value : []
}
function isAllSelected(model, key, allValues) {
const all = resolveAllValues(allValues)
const selected = selectedValues(model, key)
return all.length > 0 && selected.length === all.length
}
function isIndeterminate(model, key, allValues) {
const all = resolveAllValues(allValues)
const selected = selectedValues(model, key)
return selected.length > 0 && selected.length < all.length
}
function toggleAllSelected(model, key, allValues, checked) {
if (!model) return
model[key] = checked ? [...resolveAllValues(allValues)] : []
}
function updateTableHeight() {
const tableEl = document.querySelector('.billing-bill > .basic-table .el-table, .billing-bill > .basic-table .basic-table-virtual')
if (!tableEl) return
@@ -393,7 +470,7 @@ const billingFailStatusOptions = [
const searchColumns = [
{ label: '单号', prop: 'orderIdentifiers', placeholder: '订单号/运单号/转单号' },
{ label: '客户', prop: 'customerCodes', placeholder: '客户名称/客户代码/对外代码' },
{ label: '产品代码', prop: 'productCodes', placeholder: '产品代码' },
// { label: '产品代码', prop: 'productCodes', placeholder: '产品代码' },
{
label: '额度欠费',
prop: 'creditArrearsStatus',
@@ -402,6 +479,19 @@ const searchColumns = [
placeholder: '请选择',
props: { clearable: true }
},
{
label: '订单状态',
prop: 'orderStatuses',
component: 'select',
options: orderStatusOptions,
placeholder: '请选择',
props: {
multiple: true,
clearable: true,
collapseTags: true,
collapseTagsTooltip: true
}
},
{
label: '\u8ba1\u8d39\u5931\u8d25',
prop: 'billingFailStatuses',
@@ -587,6 +677,7 @@ function buildRecalcPayload() {
customerCodes: rest.customerCodes || [],
productCodes: rest.productCodes || [],
creditArrearsStatus: rest.creditArrearsStatus || undefined,
orderStatuses: Array.isArray(rest.orderStatuses) ? rest.orderStatuses : [],
billingFailStatuses: Array.isArray(rest.billingFailStatuses) ? rest.billingFailStatuses : []
}
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
@@ -678,7 +769,8 @@ function buildChargeWeightTemplateQuery() {
orderIdentifiers: parseOrderIdentifiers(rest.orderIdentifiers),
customerCodes: rest.customerCodes || [],
productCodes: rest.productCodes || [],
creditArrearsStatus: rest.creditArrearsStatus || undefined
creditArrearsStatus: rest.creditArrearsStatus || undefined,
orderStatuses: Array.isArray(rest.orderStatuses) ? rest.orderStatuses : []
}
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
payload.beginBizDate = bizDateRange[0] || null
@@ -211,6 +211,11 @@ function buildQueryTags(q) {
: (q.creditArrearsStatus === 'NORMAL' ? "正常" : q.creditArrearsStatus)
tags.push("额度欠费" + ':' + label)
}
const orderStatuses = Array.isArray(q.orderStatuses) ? q.orderStatuses.filter(v => v != null) : []
if (orderStatuses.length) {
const labels = orderStatuses.map(v => orderStatusLabel(v))
tags.push("订单状态" + ':' + labels.join(', '))
}
const failStatuses = Array.isArray(q.billingFailStatuses) ? q.billingFailStatuses.filter(v => v != null) : []
if (failStatuses.length) {
const labels = failStatuses.map(v => billingFailStatusLabel(v))
@@ -222,6 +227,25 @@ function buildQueryTags(q) {
return tags
}
function orderStatusLabel(code) {
const map = {
0: '草稿订单',
1: '确认订单',
2: '已中转',
3: '已收货',
4: '已装箱',
5: '已出库',
6: '转运中',
7: '已上网',
8: '已签收',
9: '已退件',
10: '已取消',
11: '已复核'
}
const key = Number(code)
return map[key] != null ? map[key] : String(code)
}
function billingFailStatusLabel(code) {
const map = {
0: '计费成功',
@@ -278,6 +302,7 @@ function buildPayload() {
customerCodes: q.customerCodes || [],
productCodes: q.productCodes || [],
creditArrearsStatus: q.creditArrearsStatus || undefined,
orderStatuses: Array.isArray(q.orderStatuses) ? q.orderStatuses : [],
billingFailStatuses: Array.isArray(q.billingFailStatuses) ? q.billingFailStatuses : [],
beginBizDate: q.beginBizDate || undefined,
endBizDate: q.endBizDate || undefined