新功能(#113): 发布促销管理后台页面到main
PR Check / Lint, Check, Test and Build (push) Has been cancelled
Build and Release / Build (push) Has been cancelled

This commit is contained in:
2026-05-29 00:40:33 -07:00
parent 2a3d5a3234
commit a7d89acc7f
17 changed files with 1733 additions and 0 deletions
+2
View File
@@ -15,6 +15,7 @@ import * as log from "./log";
import * as marketing from "./marketing";
import * as order from "./order";
import * as payment from "./payment";
import * as promo from "./promo";
import * as redemption from "./redemption";
import * as server from "./server";
import * as subscribe from "./subscribe";
@@ -37,6 +38,7 @@ export default {
marketing,
order,
payment,
promo,
redemption,
server,
subscribe,
+150
View File
@@ -0,0 +1,150 @@
/* eslint-disable */
import request from "@workspace/ui/lib/request";
/** Create promo rule POST /v1/admin/promo/rule */
export async function createPromoRule(
body: API.CreatePromoRuleRequest,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.PromoRule }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/rule`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
data: body,
...(options || {}),
}
);
}
/** Get promo rule list GET /v1/admin/promo/rule/list */
export async function getPromoRuleList(
params: API.GetPromoRuleListParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.GetPromoRuleListResponse }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/rule/list`,
{
method: "GET",
params: {
...params,
},
...(options || {}),
}
);
}
/** Get promo rule detail GET /v1/admin/promo/rule/:id */
export async function getPromoRuleDetail(
params: API.GetPromoRuleDetailParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.PromoRule }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/rule/${params.id}`,
{
method: "GET",
...(options || {}),
}
);
}
/** Update promo rule PUT /v1/admin/promo/rule/:id */
export async function updatePromoRule(
params: API.UpdatePromoRuleParams,
body: API.UpdatePromoRuleRequest,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.PromoRule }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/rule/${params.id}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
},
data: body,
...(options || {}),
}
);
}
/** Delete promo rule DELETE /v1/admin/promo/rule/:id */
export async function deletePromoRule(
params: API.DeletePromoRuleParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: unknown }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/rule/${params.id}`,
{
method: "DELETE",
...(options || {}),
}
);
}
/** Create promo price POST /v1/admin/promo/price */
export async function createPromoPrice(
body: API.CreatePromoPriceRequest,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.PromoPrice }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/price`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
data: body,
...(options || {}),
}
);
}
/** Get promo price list GET /v1/admin/promo/price/list */
export async function getPromoPriceList(
params: API.GetPromoPriceListParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.GetPromoPriceListResponse }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/price/list`,
{
method: "GET",
params: {
...params,
},
...(options || {}),
}
);
}
/** Delete promo price DELETE /v1/admin/promo/price/:id */
export async function deletePromoPrice(
params: API.DeletePromoPriceParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: unknown }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/price/${params.id}`,
{
method: "DELETE",
...(options || {}),
}
);
}
/** Get promo usage list GET /v1/admin/promo/usage/list */
export async function getPromoUsageList(
params: API.GetPromoUsageListParams,
options?: Record<string, unknown>
) {
return request<API.Response & { data?: API.GetPromoUsageListResponse }>(
`${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/promo/usage/list`,
{
method: "GET",
params: {
...params,
},
...(options || {}),
}
);
}
+118
View File
@@ -272,6 +272,69 @@ declare namespace API {
enabled: boolean;
};
type PromoRuleType = "new_user" | "inactive_user" | "campaign";
type PromoRuleParams = {
inactive_months?: number;
window_hours?: number;
[key: string]: unknown;
};
type PromoRule = {
id: number;
name: string;
type: PromoRuleType;
params: PromoRuleParams;
priority: number;
enabled: boolean;
start_time?: number;
end_time?: number;
created_at?: number;
updated_at?: number;
};
type CreatePromoRuleRequest = {
name: string;
type: PromoRuleType;
params: PromoRuleParams;
priority: number;
enabled: boolean;
start_time?: number;
end_time?: number;
};
type UpdatePromoRuleRequest = CreatePromoRuleRequest;
type PromoPrice = {
id: number;
rule_id: number;
subscribe_id: number;
subscribe_name?: string;
unit_price: number;
promo_price: number;
created_at?: number;
updated_at?: number;
};
type CreatePromoPriceRequest = {
rule_id: number;
subscribe_id: number;
promo_price: number;
};
type PromoUsage = {
id: number;
rule_id: number;
rule_name?: string;
subscribe_id: number;
subscribe_name?: string;
user_id: number;
order_no: string;
unit_price: number;
promo_price: number;
used_at: number;
};
type CreateOrderRequest = {
user_id: number;
type: number;
@@ -929,6 +992,61 @@ declare namespace API {
list: Coupon[];
};
type GetPromoRuleListParams = {
page: number;
size: number;
type?: PromoRuleType;
enabled?: boolean;
search?: string;
};
type GetPromoRuleListResponse = {
total: number;
list: PromoRule[];
};
type GetPromoRuleDetailParams = {
id: number;
};
type UpdatePromoRuleParams = {
id: number;
};
type DeletePromoRuleParams = {
id: number;
};
type GetPromoPriceListParams = {
page: number;
size: number;
rule_id?: number;
subscribe_id?: number;
};
type GetPromoPriceListResponse = {
total: number;
list: PromoPrice[];
};
type DeletePromoPriceParams = {
id: number;
};
type GetPromoUsageListParams = {
page: number;
size: number;
rule_id?: number;
subscribe_id?: number;
user_id?: number;
order_no?: string;
};
type GetPromoUsageListResponse = {
total: number;
list: PromoUsage[];
};
type GetDetailRequest = {
id: number;
};