From 72e12d62bc617d51119ce27ae223e8e55eb2e2d7 Mon Sep 17 00:00:00 2001 From: Timi Date: Sat, 19 Sep 2026 01:21:55 +0800 Subject: [PATCH] add SalesOrderSummary.vue --- src/api/CustomerProductAPI.ts | 11 + src/api/SalesOrderAPI.ts | 5 + src/pages/salesOrder/SalesOrderList.vue | 14 +- .../components/SalesOrderSummary.vue | 373 ++++++++++++++++++ src/types/CustomerProduct.ts | 30 ++ src/types/SalesOrder.ts | 7 + 6 files changed, 438 insertions(+), 2 deletions(-) create mode 100644 src/api/CustomerProductAPI.ts create mode 100644 src/pages/salesOrder/components/SalesOrderSummary.vue create mode 100644 src/types/CustomerProduct.ts diff --git a/src/api/CustomerProductAPI.ts b/src/api/CustomerProductAPI.ts new file mode 100644 index 0000000..b374c74 --- /dev/null +++ b/src/api/CustomerProductAPI.ts @@ -0,0 +1,11 @@ +import { axios } from "timi-web-api"; +import { withCurrentStoreId } from "@/utils/store"; +import type { CustomerProduct, CustomerProductPage, CustomerProductPageResult } from "@/types/CustomerProduct"; + +const URI = "/gao/sales/order/customer-product"; + +async function list(page: CustomerProductPage): Promise> { + return await axios.post(`${URI}/list`, withCurrentStoreId(page)); +} + +export default { list }; diff --git a/src/api/SalesOrderAPI.ts b/src/api/SalesOrderAPI.ts index be67915..450dc2c 100644 --- a/src/api/SalesOrderAPI.ts +++ b/src/api/SalesOrderAPI.ts @@ -13,6 +13,7 @@ import type { SalesOrderCancelRequest, SalesOrderPage, SalesOrderPageResult, + SalesOrderSummary, SalesOrderUpdateRequest } from "@/types/SalesOrder"; @@ -22,6 +23,9 @@ const FUND_URI = "/gao/fund/record"; async function list(page: SalesOrderPage): Promise> { return await axios.post(`${ORDER_URI}/list`, withCurrentStoreId(page)); } +async function summary(page: SalesOrderPage): Promise { + return await axios.post(`${ORDER_URI}/summary`, withCurrentStoreId(page)); +} async function detail(id: string): Promise { return await axios.post(`${ORDER_URI}/detail`, undefined, { params: { id } }); } @@ -75,6 +79,7 @@ async function myReceiveRecordDetail(id: string): Promise { export default { list, + summary, detail, createDirectProduct, update, diff --git a/src/pages/salesOrder/SalesOrderList.vue b/src/pages/salesOrder/SalesOrderList.vue index e1efdc2..3297cfb 100644 --- a/src/pages/salesOrder/SalesOrderList.vue +++ b/src/pages/salesOrder/SalesOrderList.vue @@ -59,7 +59,7 @@ @refresh="refresh" @scrolltolower="loadMore" > -
+
+ +
-
@@ -108,6 +113,7 @@ import SalesOrderAPI from "@/api/SalesOrderAPI"; import CustomerSelector from "@/components/CustomerSelector.vue"; import NavBarActionMenu from "@/components/NavBarActionMenu.vue"; import SalesOrderListCell from "@/pages/salesOrder/components/SalesOrderListCell.vue"; +import SalesOrderSummary from "@/pages/salesOrder/components/SalesOrderSummary.vue"; import { useNavBarStore } from "@/store/navBarStore"; import type { Customer } from "@/types/Customer"; import type { GaoPackageConfig } from "@/types/Package"; @@ -157,6 +163,8 @@ type RefundFilter = "ALL" | GaoSalesRefundStatus; const status = ref("ALL"); const paymentStatus = ref("ALL"); const refundStatus = ref("ALL"); +type SalesOrderSummaryExpose = { refresh: () => Promise }; +const customerOrderSummaryRef = ref(); const list = ref([]); const pageIndex = ref(0); const total = ref(0); @@ -288,6 +296,7 @@ async function fetchList(reset: boolean): Promise { async function refresh(): Promise { try { + await customerOrderSummaryRef.value?.refresh(); await fetchList(true); } catch (error) { Message.error(getErrorMessage(error, "销售订单加载失败")); @@ -494,4 +503,5 @@ onUnmounted(() => { navBarStore.clearRight(); search.cancel(); }); text-align: center; } } + diff --git a/src/pages/salesOrder/components/SalesOrderSummary.vue b/src/pages/salesOrder/components/SalesOrderSummary.vue new file mode 100644 index 0000000..4d31737 --- /dev/null +++ b/src/pages/salesOrder/components/SalesOrderSummary.vue @@ -0,0 +1,373 @@ + + + + + diff --git a/src/types/CustomerProduct.ts b/src/types/CustomerProduct.ts new file mode 100644 index 0000000..b0e1200 --- /dev/null +++ b/src/types/CustomerProduct.ts @@ -0,0 +1,30 @@ +import type { Model, PageResult } from "timi-web-api"; +import type { Customer } from "@/types/Customer"; +import type { GaoSalesOrderItemType } from "@/types/SalesOrder"; + +/** 客户产品汇总。 */ +export type CustomerProduct = { + customer?: Customer; + orderCount?: number; + purchasedProducts?: CustomerProductSummary[]; + availableProducts?: CustomerProductSummary[]; +} & Model; + +/** 客户产品汇总项。 */ +export type CustomerProductSummary = { + productIdSnapshot?: string; + productName?: string; + quantity?: number | string; + unit?: string; +}; + +export type CustomerProductPage = { + storeId?: string; + customerId?: string; + keyword?: string; + itemType?: GaoSalesOrderItemType; + index: number; + size: number; +}; + +export type CustomerProductPageResult = PageResult & { pages?: number }; diff --git a/src/types/SalesOrder.ts b/src/types/SalesOrder.ts index f62e39b..c27ddb0 100644 --- a/src/types/SalesOrder.ts +++ b/src/types/SalesOrder.ts @@ -207,3 +207,10 @@ export type FundRecordPage = { }; export type SalesOrderPageResult = PageResult & { pages?: number }; + +export type SalesOrderSummary = { + orderCount?: number; + saleAmount?: number; + paidAmount?: number; + unpaidAmount?: number; +};