add product

This commit is contained in:
Timi
2026-09-03 14:27:40 +08:00
parent 7f669621fb
commit 333999fe21
63 changed files with 5662 additions and 2210 deletions
+91
View File
@@ -0,0 +1,91 @@
import type { Attachment, Model, PageResult, User } from "timi-web-api";
export type FulfillmentType = "PACKAGE_ENTITLEMENT" | "DIRECT_PRODUCT";
export type FulfillmentStatus = "WAITING_STOCK" | "PENDING" | "VERIFIED" | "REJECTED" | "CANCELLED" | "REVOKED";
export type OrderFulfillmentItem = {
fulfillmentId?: string;
productId?: string;
productUnitId?: string;
sourceOrderItemId?: string;
sourceCustomerPackageItemId?: string;
quantity?: number | string;
baseQuantity?: number | string;
reservedBefore?: number | string;
reservedAfter?: number | string;
fulfilledBefore?: number | string;
fulfilledAfter?: number | string;
productNameSnapshot?: string;
unitSnapshot?: string;
baseQuantityPerUnitSnapshot?: number | string;
} & Model;
export type OrderFulfillment = {
salesOrderId?: string;
storeId?: string;
customerId?: string;
fulfillmentType?: FulfillmentType;
status?: FulfillmentStatus;
requestNo?: string;
operatorUserId?: string;
deliveredAt?: number;
verifierUserId?: string;
verifiedAt?: number;
sourceFulfillmentId?: string;
reason?: string | null;
remark?: string | null;
operator?: Partial<User>;
verifier?: Partial<User>;
sourceFulfillment?: OrderFulfillment;
itemList?: OrderFulfillmentItem[];
stockRecordList?: Record<string, unknown>[];
attachmentList?: Partial<Attachment>[];
} & Model;
export type FulfillmentPage = {
storeId?: string;
salesOrderId?: string;
customerId?: string;
fulfillmentType?: FulfillmentType;
status?: FulfillmentStatus;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type OrderFulfillmentCreateRequest = {
salesOrderId: string;
requestNo: string;
deliveredAt?: number;
itemList: OrderFulfillmentItemRequest[];
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type OrderFulfillmentItemRequest = {
sourceOrderItemId?: string;
sourceCustomerPackageItemId?: string;
quantity: number | string;
};
export type FulfillmentActionRequest = { fulfillmentId: string; reason: string };
export type FulfillmentPrepareStockRequest = {
fulfillmentId: string;
reason?: string;
remark?: string | null;
attachmentList?: Partial<Attachment>[];
};
export type FulfillmentRevokeRequest = {
fulfillmentId: string;
requestNo: string;
deliveredAt?: number;
reason: string;
returnedToStore: boolean;
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type FulfillmentPageResult<T> = PageResult<T> & { pages?: number };
+31 -148
View File
@@ -1,19 +1,18 @@
import type { Attachment, Model, PageResult, User } from "timi-web-api";
import type { Customer } from "@/types/Customer";
import type { EventRecord } from "@/types/EventRecord";
import type { OrderFulfillment } from "@/types/Fulfillment";
export type PackageConfigStatus = "DRAFT" | "ACTIVE" | "INACTIVE";
export type CustomerPackageStatus = "ACTIVE" | "FULFILLED" | "CANCELLED";
export type PaymentStatus = "UNPAID" | "PARTIALLY_PAID" | "PAID";
export type RefundStatus = "NOT_REQUIRED" | "PENDING" | "REFUNDED";
export type DeliveryStatus = "PENDING" | "VERIFIED" | "REJECTED" | "CANCELLED" | "REVOKED";
export type DeliveryOperationType = "DELIVER" | "REVOKE";
export type FundOperationType = "RECEIVE" | "REFUND" | "CONFIRM_NO_REFUND" | "REVOKE";
export type FundRecordStatus = "PENDING" | "VERIFIED" | "REJECTED" | "CANCELLED";
export type PackageConfigItem = {
productName: string;
unit: string;
packageConfigId?: string;
productId: string;
productUnitId: string;
productNameSnapshot?: string;
unitSnapshot?: string;
baseQuantityPerUnitSnapshot?: number | string;
defaultQuantity: number | string;
sort?: number;
remark?: string | null;
@@ -32,181 +31,65 @@ export type GaoPackageConfig = {
updater?: Partial<User>;
} & Model;
export type PackageConfigPage = {
storeId?: string;
keyword?: string;
status?: PackageConfigStatus;
index: number;
size: number;
};
export type PackageConfigPage = { storeId?: string; keyword?: string; status?: PackageConfigStatus; index: number; size: number };
export type CustomerPackageItem = {
productNameSnapshot: string;
unitSnapshot: string;
customerPackageId?: string;
productId?: string;
productUnitId?: string;
productNameSnapshot?: string;
unitSnapshot?: string;
baseQuantityPerUnitSnapshot?: number | string;
totalQuantity: number | string;
reservedQuantity: number | string;
deliveredQuantity: number | string;
fulfilledQuantity: number | string;
pendingQuantity: number | string;
availableQuantity: number | string;
remainingQuantity: number | string;
sort?: number;
remark?: string | null;
} & Model;
export type GaoCustomerPackage = {
storeId?: string;
salesOrderId?: string;
customerId?: string;
packageConfigId?: string;
packageNameSnapshot?: string;
standardAmountSnapshot?: number;
saleAmount?: number;
pendingPaidAmount?: number;
paidAmount?: number;
refundedAmount?: number;
status?: CustomerPackageStatus;
paymentStatus?: PaymentStatus;
refundStatus?: RefundStatus;
purchasedAt?: number;
cancelledAt?: number | null;
cancelOperatorUserId?: string;
cancelReason?: string | null;
remark?: string | null;
customer?: Customer;
cancelOperator?: Partial<User>;
purchaseEventRecord?: EventRecord;
itemList?: CustomerPackageItem[];
deliveryList?: GaoPackageDelivery[];
fundRecordList?: GaoFundRecord[];
fulfillmentList?: OrderFulfillment[];
} & Model;
export type CustomerPackagePage = {
storeId?: string;
customerId?: string;
keyword?: string;
status?: CustomerPackageStatus;
paymentStatus?: PaymentStatus;
refundStatus?: RefundStatus;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type CustomerPackagePage = { storeId?: string; customerId?: string; keyword?: string; status?: CustomerPackageStatus; beginAt?: number; endAt?: number; index: number; size: number };
export type PackagePurchaseItem = {
productName: string;
unit: string;
totalQuantity: string;
productId: string;
productUnitId: string;
totalQuantity: number | string;
sort?: number;
remark?: string | null;
};
export type PackageAttachment = Partial<Attachment> & {
tempFileId?: string;
attachType?: string;
name?: string;
};
export type PackageAttachment = Partial<Attachment> & { tempFileId?: string; attachType?: string; name?: string };
export type PackagePurchaseRequest = {
requestNo: string;
eventId: string;
customerId: string;
saleAmount?: number;
saleAmount: number;
purchasedAt?: number;
itemList?: PackagePurchaseItem[];
itemList: PackagePurchaseItem[];
attachmentList?: PackageAttachment[];
remark?: string | null;
};
export type PackagePaymentReceiveRequest = {
requestNo: string;
customerPackageId: string;
amount: number;
occurredAt?: number;
attachmentList: PackageAttachment[];
remark?: string | null;
};
export type PackageDeliveryItem = {
customerPackageItemId: string;
quantity: string;
};
export type PackageDeliveryCreateRequest = {
requestNo: string;
customerPackageId: string;
deliveredAt?: number;
itemList: PackageDeliveryItem[];
attachmentList: PackageAttachment[];
remark?: string | null;
};
export type GaoPackageDeliveryItem = {
customerPackageItemId?: string;
productNameSnapshot?: string;
unitSnapshot?: string;
quantity?: number | string;
reservedBefore?: number | string;
reservedAfter?: number | string;
deliveredBefore?: number | string;
deliveredAfter?: number | string;
};
export type GaoPackageDelivery = {
customerPackageId?: string;
customerId?: string;
operationType?: DeliveryOperationType;
status?: DeliveryStatus;
requestNo?: string;
operatorUserId?: string;
operator?: Partial<User>;
verifierUserId?: string;
verifier?: Partial<User>;
deliveredAt?: number;
sourceDeliveryId?: string;
reason?: string | null;
itemList?: GaoPackageDeliveryItem[];
attachmentList?: PackageAttachment[];
} & Model;
export type DeliveryPage = {
storeId?: string;
customerPackageId?: string;
customerId?: string;
status?: DeliveryStatus;
operationType?: DeliveryOperationType;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type GaoFundRecord = {
bizId?: string;
customerPackageId?: string;
customerId?: string;
customer?: Customer;
customerPackage?: GaoCustomerPackage;
operationType?: FundOperationType;
status?: FundRecordStatus;
amount?: number;
sourceRecordId?: string;
requestNo?: string;
occurredAt?: number;
reason?: string | null;
remark?: string | null;
operatorUserId?: string;
operator?: Partial<User>;
verifierUserId?: string;
verifier?: Partial<User>;
attachmentList?: PackageAttachment[];
} & Model;
export type FundRecordPage = {
storeId?: string;
customerPackageId?: string;
customerId?: string;
operationType?: FundOperationType;
status?: FundRecordStatus;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type PackagePageResult<T> = PageResult<T> & {
pages?: number;
};
export type PackagePageResult<T> = PageResult<T> & { pages?: number };
+147
View File
@@ -0,0 +1,147 @@
import type { Attachment, Model, PageResult, User } from "timi-web-api";
export type ProductType = "SERVICE" | "GOODS" | "CONSUMABLE";
export type ProductAttachmentType = "PHOTO" | "OTHER";
export type ProductStatus = "ACTIVE" | "INACTIVE";
export type ProductCategoryStatus = "ACTIVE" | "INACTIVE";
export type StockBizType = "PRODUCT_STOCK" | "ORDER_FULFILLMENT";
export type StockOperationType =
| "INITIAL_IN"
| "MANUAL_IN"
| "MANUAL_OUT"
| "ORDER_RESERVE"
| "ORDER_RELEASE"
| "ORDER_OUT"
| "ORDER_REVOKE"
| "STOCKTAKE_GAIN"
| "STOCKTAKE_LOSS";
export type ProductCategory = {
storeId?: string;
name: string;
sort?: number;
status?: ProductCategoryStatus;
} & Model;
export type ProductUnit = {
productId?: string;
name: string;
baseQuantityPerUnit: number | string;
salePrice?: number | null;
isBase?: boolean;
allowPurchase?: boolean;
allowSale?: boolean;
sort?: number;
} & Model;
export type Product = {
storeId?: string;
categoryId?: string;
code: string;
name: string;
productType: ProductType;
baseUnit: string;
stockEnabled: boolean;
allowDecimalQuantity: boolean;
status?: ProductStatus;
referenceCost?: number | null;
minStockQuantity?: number | string | null;
sort?: number;
remark?: string | null;
updatedBy?: string;
category?: ProductCategory;
unitList?: ProductUnit[];
attachmentList?: Attachment[];
} & Model;
export type ProductCategoryPage = {
storeId?: string;
status?: ProductCategoryStatus;
keyword?: string;
index: number;
size: number;
};
export type ProductPage = {
storeId?: string;
categoryId?: string;
categoryIdList?: string[];
status?: ProductStatus;
productType?: ProductType;
keyword?: string;
index: number;
size: number;
};
export type ProductStock = {
storeId?: string;
productId?: string;
onHandQuantity?: number | string;
reservedQuantity?: number | string;
updatedBy?: string;
product?: Product;
availableQuantity?: number | string;
} & Model;
export type ProductStockPage = {
storeId?: string;
productId?: string;
keyword?: string;
index: number;
size: number;
};
export type StockRecord = {
storeId?: string;
productId?: string;
productUnitId?: string;
productNameSnapshot?: string;
unitSnapshot?: string;
baseQuantityPerUnitSnapshot?: number | string;
quantity?: number | string;
baseQuantity?: number | string;
operationType?: StockOperationType;
onHandDelta?: number | string;
reservedDelta?: number | string;
onHandBefore?: number | string;
onHandAfter?: number | string;
reservedBefore?: number | string;
reservedAfter?: number | string;
bizType?: StockBizType;
bizId?: string;
sourceRecordId?: string;
requestNo?: string;
operatorUserId?: string;
occurredAt?: number;
reason?: string | null;
remark?: string | null;
operator?: Partial<User>;
attachmentList?: Partial<Attachment>[];
} & Model;
export type StockRecordPage = {
storeId?: string;
productId?: string;
bizType?: StockBizType;
bizId?: string;
operationType?: StockOperationType;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type ProductStockChangeRequest = {
requestNo: string;
storeId?: string;
productId: string;
productUnitId: string;
quantity: number | string;
reason?: string;
remark?: string | null;
attachmentList: Partial<Attachment>[];
};
export type ProductPageResult<T> = PageResult<T> & {
pages?: number;
};
+167
View File
@@ -0,0 +1,167 @@
import type { Attachment, Model, PageResult, User } from "timi-web-api";
import type { Customer } from "@/types/Customer";
import type { EventRecord } from "@/types/EventRecord";
export type SalesOrderType = "PACKAGE" | "DIRECT_PRODUCT";
export type SalesOrderStatus = "ACTIVE" | "FULFILLED" | "CANCELLED";
export type SalesPaymentStatus = "UNPAID" | "PARTIALLY_PAID" | "PAID";
export type SalesRefundStatus = "NOT_REQUIRED" | "PENDING" | "REFUNDED";
export type FundBizType = "SALES_ORDER";
export type FundOperationType = "RECEIVE" | "REFUND" | "CONFIRM_NO_REFUND" | "REVOKE";
export type FundRecordStatus = "PENDING" | "VERIFIED" | "REJECTED" | "CANCELLED";
export type SalesOrderItem = {
salesOrderId?: string;
productId?: string;
productUnitId?: string;
productNameSnapshot?: string;
unitSnapshot?: string;
baseQuantityPerUnitSnapshot?: number | string;
quantity?: number | string;
reservedQuantity?: number | string;
fulfilledQuantity?: number | string;
unitPrice?: number;
lineAmount?: number;
sort?: number;
remark?: string | null;
} & Model;
export type SalesOrder = {
storeId?: string;
customerId?: string;
orderNo?: string;
orderType?: SalesOrderType;
status?: SalesOrderStatus;
paymentStatus?: SalesPaymentStatus;
refundStatus?: SalesRefundStatus;
saleAmount?: number;
pendingPaidAmount?: number;
paidAmount?: number;
refundedAmount?: number;
unpaidAmount?: number;
sourceEventRecordId?: string;
requestNo?: string;
purchasedAt?: number;
operatorUserId?: string;
cancelledAt?: number;
cancelOperatorUserId?: string;
cancelReason?: string | null;
remark?: string | null;
customer?: Customer;
operator?: Partial<User>;
cancelOperator?: Partial<User>;
itemList?: SalesOrderItem[];
fundRecordList?: FundRecord[];
sourceEventRecord?: EventRecord;
attachmentList?: Partial<Attachment>[];
} & Model;
export type SalesOrderPage = {
storeId?: string;
customerId?: string;
orderType?: SalesOrderType;
status?: SalesOrderStatus;
paymentStatus?: SalesPaymentStatus;
fulfilledButUnpaid?: boolean;
keyword?: string;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type DirectProductOrderItemRequest = {
productId: string;
productUnitId: string;
quantity: number | string;
unitPrice?: number;
sort?: number;
remark?: string | null;
};
export type DirectProductOrderCreateRequest = {
requestNo: string;
storeId?: string;
customerId: string;
purchasedAt?: number;
itemList: DirectProductOrderItemRequest[];
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type OrderPaymentReceiveRequest = {
salesOrderId: string;
requestNo: string;
amount: number;
occurredAt?: number;
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type OrderPaymentActionRequest = { fundRecordId: string; reason: string };
export type OrderPaymentRefundRequest = {
salesOrderId: string;
requestNo: string;
amount: number;
occurredAt?: number;
reason: string;
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type OrderPaymentNoRefundRequest = {
salesOrderId: string;
requestNo: string;
occurredAt?: number;
reason: string;
remark?: string | null;
};
export type OrderPaymentRevokeRequest = {
requestNo: string;
fundRecordId: string;
occurredAt?: number;
reason: string;
attachmentList?: Partial<Attachment>[];
remark?: string | null;
};
export type SalesOrderCancelRequest = { salesOrderId: string; reason: string };
export type FundRecord = {
storeId?: string;
customerId?: string;
bizType?: FundBizType;
bizId?: string;
operationType?: FundOperationType;
status?: FundRecordStatus;
amount?: number;
sourceRecordId?: string;
requestNo?: string;
operatorUserId?: string;
verifierUserId?: string;
verifiedAt?: number;
occurredAt?: number;
reason?: string | null;
remark?: string | null;
operator?: Partial<User>;
verifier?: Partial<User>;
customer?: Customer;
attachmentList?: Partial<Attachment>[];
} & Model;
export type FundRecordPage = {
storeId?: string;
salesOrderId?: string;
bizType?: FundBizType;
customerId?: string;
operationType?: FundOperationType;
status?: FundRecordStatus;
beginAt?: number;
endAt?: number;
index: number;
size: number;
};
export type SalesOrderPageResult<T> = PageResult<T> & { pages?: number };
+1
View File
@@ -11,6 +11,7 @@ export type Store = {
address?: string;
remark?: string;
autoClosedDay?: boolean;
directProductSaleEventId?: string;
sort?: number;
} & Model;