feat(assoc): v4.0.1 合伙人关联码、分佣账单与 H5 用户管理

订单佣金只认关联用户;合伙人备注写入独立表;H5 增加用户管理与首页统计。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-30 14:35:39 +08:00
parent 3b669f7e38
commit 9c8d5f2cad
125 changed files with 6355 additions and 1436 deletions
+48 -2
View File
@@ -201,6 +201,7 @@ CREATE TABLE common_city (
UNIQUE KEY uk_common_city_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='开城配置';
DROP TABLE IF EXISTS partner_user_note;
DROP TABLE IF EXISTS partner_account;
CREATE TABLE partner_account (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -231,11 +232,14 @@ CREATE TABLE partner_account (
bank_branch VARCHAR(128) DEFAULT NULL,
weekly_store_target INT DEFAULT 20,
managed_warehouse_id BIGINT UNSIGNED DEFAULT NULL,
assoc_qrcode_id VARCHAR(64) DEFAULT NULL,
assoc_qrcode_resource_id BIGINT UNSIGNED DEFAULT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_partner_account_phone (phone),
UNIQUE KEY uk_partner_account_managed_warehouse (managed_warehouse_id),
UNIQUE KEY uk_partner_account_assoc_qrcode (assoc_qrcode_id),
KEY idx_partner_account_city_scope (city_id, scope_type),
KEY idx_partner_account_city_primary (city_id, is_primary),
KEY idx_partner_account_parent (parent_account_id),
@@ -287,6 +291,26 @@ CREATE TABLE partner_bill (
CONSTRAINT fk_partner_bill_account FOREIGN KEY (partner_account_id) REFERENCES partner_account(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合伙人T+30账单';
DROP TABLE IF EXISTS partner_bill_item;
CREATE TABLE partner_bill_item (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
partner_bill_id BIGINT UNSIGNED NOT NULL,
kind VARCHAR(16) NOT NULL COMMENT 'ORDER|REDEEM',
ref_id BIGINT UNSIGNED NOT NULL,
ref_no VARCHAR(32) NOT NULL,
title VARCHAR(128) DEFAULT NULL,
extra VARCHAR(128) DEFAULT NULL,
base_amount DECIMAL(10,2) NOT NULL,
rate DECIMAL(5,4) NOT NULL,
commission DECIMAL(10,2) NOT NULL,
occurred_at DATETIME(3) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_partner_bill_item_kind_ref (kind, ref_id),
KEY idx_partner_bill_item_bill (partner_bill_id),
CONSTRAINT fk_partner_bill_item_bill FOREIGN KEY (partner_bill_id) REFERENCES partner_bill(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合伙人账单明细';
-- ===================== HQ =============================
DROP TABLE IF EXISTS hq_account;
@@ -307,6 +331,7 @@ CREATE TABLE hq_account (
-- ===================== USER =============================
DROP TABLE IF EXISTS partner_user_note;
DROP TABLE IF EXISTS user_user;
CREATE TABLE user_user (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -320,10 +345,12 @@ CREATE TABLE user_user (
nickname VARCHAR(64) DEFAULT NULL,
avatar_resource_id BIGINT UNSIGNED DEFAULT NULL COMMENT '头像 common_resource.id',
status TINYINT NOT NULL DEFAULT 1,
source_type VARCHAR(32) NOT NULL DEFAULT 'ORGANIC' COMMENT 'ORGANIC|PROMO_CODE|SHARE_LINK|FRIEND_REFERRAL|OFFLINE_EVENT|OTHER',
source_type VARCHAR(32) NOT NULL DEFAULT 'ORGANIC' COMMENT 'ORGANIC|PROMO_CODE|SHARE_LINK|FRIEND_REFERRAL|OFFLINE_EVENT|PARTNER_PROXY|PARTNER_ASSOC|OTHER',
source_ref_id BIGINT UNSIGNED DEFAULT NULL COMMENT 'promo_code_id 或 referrer_user_id',
source_label VARCHAR(128) DEFAULT NULL COMMENT '渠道名称快照',
referrer_user_id BIGINT UNSIGNED DEFAULT NULL COMMENT '好友推荐人 user_user.id',
assoc_partner_account_id BIGINT UNSIGNED DEFAULT NULL,
assoc_bound_at DATETIME(3) DEFAULT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
@@ -332,10 +359,26 @@ CREATE TABLE user_user (
UNIQUE KEY uk_user_user_device_key (device_key),
KEY idx_user_user_source (source_type, source_ref_id),
KEY idx_user_user_referrer (referrer_user_id),
KEY idx_user_user_assoc_partner (assoc_partner_account_id),
KEY idx_user_user_merged (merged_into_user_id),
KEY idx_user_user_wx_open (wx_open_id)
KEY idx_user_user_wx_open (wx_open_id),
CONSTRAINT fk_user_user_assoc_partner FOREIGN KEY (assoc_partner_account_id) REFERENCES partner_account(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='C端用户';
CREATE TABLE partner_user_note (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
partner_account_id BIGINT UNSIGNED NOT NULL,
user_id BIGINT UNSIGNED NOT NULL,
remark VARCHAR(128) NOT NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_partner_user_note_partner_user (partner_account_id, user_id),
KEY idx_partner_user_note_user (user_id),
CONSTRAINT fk_partner_user_note_partner FOREIGN KEY (partner_account_id) REFERENCES partner_account(id) ON DELETE CASCADE,
CONSTRAINT fk_partner_user_note_user FOREIGN KEY (user_id) REFERENCES user_user(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='主合伙人对关联用户的备注';
DROP TABLE IF EXISTS user_address;
CREATE TABLE user_address (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
@@ -579,6 +622,9 @@ CREATE TABLE user_store_rating (
store_id BIGINT UNSIGNED NOT NULL,
service_score TINYINT NOT NULL,
env_score TINYINT NOT NULL,
comment VARCHAR(200) NULL,
tags JSON NULL,
image_urls JSON NULL,
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (id),
UNIQUE KEY uk_user_store_rating_redeem (redeem_record_id),
@@ -0,0 +1,34 @@
-- v4.0.1:合伙人关联码 + 用户关联 + 账单明细
ALTER TABLE `partner_account`
ADD COLUMN `assoc_qrcode_id` VARCHAR(64) DEFAULT NULL AFTER `managed_warehouse_id`,
ADD COLUMN `assoc_qrcode_resource_id` BIGINT UNSIGNED DEFAULT NULL AFTER `assoc_qrcode_id`,
ADD UNIQUE KEY `uk_partner_account_assoc_qrcode` (`assoc_qrcode_id`);
ALTER TABLE `user_user`
ADD COLUMN `assoc_partner_account_id` BIGINT UNSIGNED DEFAULT NULL AFTER `referrer_user_id`,
ADD COLUMN `assoc_bound_at` DATETIME(3) DEFAULT NULL AFTER `assoc_partner_account_id`,
ADD KEY `idx_user_user_assoc_partner` (`assoc_partner_account_id`);
ALTER TABLE `user_user`
ADD CONSTRAINT `fk_user_user_assoc_partner`
FOREIGN KEY (`assoc_partner_account_id`) REFERENCES `partner_account`(`id`) ON DELETE SET NULL;
CREATE TABLE IF NOT EXISTS `partner_bill_item` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`partner_bill_id` BIGINT UNSIGNED NOT NULL,
`kind` VARCHAR(16) NOT NULL COMMENT 'ORDER|REDEEM',
`ref_id` BIGINT UNSIGNED NOT NULL,
`ref_no` VARCHAR(32) NOT NULL,
`title` VARCHAR(128) DEFAULT NULL,
`extra` VARCHAR(128) DEFAULT NULL,
`base_amount` DECIMAL(10,2) NOT NULL,
`rate` DECIMAL(5,4) NOT NULL,
`commission` DECIMAL(10,2) NOT NULL,
`occurred_at` DATETIME(3) NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_partner_bill_item_kind_ref` (`kind`, `ref_id`),
KEY `idx_partner_bill_item_bill` (`partner_bill_id`),
CONSTRAINT `fk_partner_bill_item_bill` FOREIGN KEY (`partner_bill_id`) REFERENCES `partner_bill`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合伙人账单明细';
@@ -0,0 +1,16 @@
-- v4.0.1:合伙人可见用户备注(与 HQ hq_remark 隔离)
-- Review 后再在生产执行。
CREATE TABLE IF NOT EXISTS `partner_user_note` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`partner_account_id` BIGINT UNSIGNED NOT NULL,
`user_id` BIGINT UNSIGNED NOT NULL,
`remark` VARCHAR(128) NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_partner_user_note_partner_user` (`partner_account_id`, `user_id`),
KEY `idx_partner_user_note_user` (`user_id`),
CONSTRAINT `fk_partner_user_note_partner` FOREIGN KEY (`partner_account_id`) REFERENCES `partner_account`(`id`) ON DELETE CASCADE,
CONSTRAINT `fk_partner_user_note_user` FOREIGN KEY (`user_id`) REFERENCES `user_user`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='主合伙人对关联用户的备注';
@@ -0,0 +1,5 @@
-- v3.5.12:核销评价补充说明 / 标签 / 图片
ALTER TABLE `user_store_rating`
ADD COLUMN `comment` VARCHAR(200) NULL AFTER `env_score`,
ADD COLUMN `tags` JSON NULL AFTER `comment`,
ADD COLUMN `image_urls` JSON NULL AFTER `tags`;
+59
View File
@@ -339,9 +339,15 @@ enum UserSourceType {
FRIEND_REFERRAL
OFFLINE_EVENT
PARTNER_PROXY
PARTNER_ASSOC
OTHER
}
enum PartnerBillItemKind {
ORDER
REDEEM
}
enum OrderType {
NORMAL
RESHIPMENT
@@ -636,6 +642,7 @@ model CommonResource {
productCovers CommonProductItem[] @relation("ProductCover")
promoQrcodes CommonPromoCode[] @relation("PromoQrcode")
partnerAssocQrcodes PartnerAccount[] @relation("PartnerAssocQrcode")
userAvatars User[] @relation("UserAvatar")
storeCovers Store[] @relation("StoreCover")
orderImages Order[] @relation("OrderProductImage")
@@ -1195,6 +1202,8 @@ model PartnerAccount {
bankBranch String? @map("bank_branch") @db.VarChar(128)
weeklyStoreTarget Int? @default(20) @map("weekly_store_target")
managedWarehouseId BigInt? @unique @map("managed_warehouse_id") @db.UnsignedBigInt
assocQrcodeId String? @unique @map("assoc_qrcode_id") @db.VarChar(64)
assocQrcodeResourceId BigInt? @map("assoc_qrcode_resource_id") @db.UnsignedBigInt
/// 测试合伙人账号
isTest Boolean @default(false) @map("is_test")
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
@@ -1207,6 +1216,9 @@ model PartnerAccount {
children PartnerAccount[] @relation("PartnerAccountHierarchy")
stores Store[]
bills PartnerBill[]
assocUsers User[] @relation("UserPartnerAssoc")
userNotes PartnerUserNote[]
assocQrcodeResource CommonResource? @relation("PartnerAssocQrcode", fields: [assocQrcodeResourceId], references: [id], onDelete: SetNull)
@@index([cityId, scopeType])
@@index([cityId, isPrimary])
@@ -1217,6 +1229,23 @@ model PartnerAccount {
@@map("partner_account")
}
/// 主合伙人对关联用户的备注;与 HQ hqRemark 隔离,换绑不跟随
model PartnerUserNote {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
partnerAccountId BigInt @map("partner_account_id") @db.UnsignedBigInt
userId BigInt @map("user_id") @db.UnsignedBigInt
remark String @db.VarChar(128)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
partner PartnerAccount @relation(fields: [partnerAccountId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([partnerAccountId, userId])
@@index([userId])
@@map("partner_user_note")
}
model PartnerBill {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
billNo String @unique @map("bill_no") @db.VarChar(32)
@@ -1235,12 +1264,34 @@ model PartnerBill {
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
partnerAccount PartnerAccount @relation(fields: [partnerAccountId], references: [id], onDelete: Restrict)
items PartnerBillItem[]
@@index([partnerAccountId, status])
@@unique([partnerAccountId, periodStart])
@@map("partner_bill")
}
model PartnerBillItem {
id BigInt @id @default(autoincrement()) @db.UnsignedBigInt
partnerBillId BigInt @map("partner_bill_id") @db.UnsignedBigInt
kind PartnerBillItemKind
refId BigInt @map("ref_id") @db.UnsignedBigInt
refNo String @map("ref_no") @db.VarChar(32)
title String? @db.VarChar(128)
extra String? @db.VarChar(128)
baseAmount Decimal @map("base_amount") @db.Decimal(10, 2)
rate Decimal @db.Decimal(5, 4)
commission Decimal @db.Decimal(10, 2)
occurredAt DateTime @map("occurred_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
partnerBill PartnerBill @relation(fields: [partnerBillId], references: [id], onDelete: Cascade)
@@unique([kind, refId])
@@index([partnerBillId])
@@map("partner_bill_item")
}
// ─── HQ ───────────────────────────────────────────────
model HqAccount {
@@ -1322,6 +1373,8 @@ model User {
sourceRefId BigInt? @map("source_ref_id") @db.UnsignedBigInt
sourceLabel String? @map("source_label") @db.VarChar(128)
referrerUserId BigInt? @map("referrer_user_id") @db.UnsignedBigInt
assocPartnerAccountId BigInt? @map("assoc_partner_account_id") @db.UnsignedBigInt
assocBoundAt DateTime? @map("assoc_bound_at") @db.DateTime(3)
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
updatedAt DateTime @updatedAt @map("updated_at") @db.DateTime(3)
@@ -1329,6 +1382,8 @@ model User {
mergedFrom User[] @relation("UserMerge")
referrer User? @relation("UserReferrer", fields: [referrerUserId], references: [id], onDelete: SetNull)
referrers User[] @relation("UserReferrer")
assocPartner PartnerAccount? @relation("UserPartnerAssoc", fields: [assocPartnerAccountId], references: [id], onDelete: SetNull)
partnerNotes PartnerUserNote[]
avatar CommonResource? @relation("UserAvatar", fields: [avatarResourceId], references: [id], onDelete: SetNull)
addresses UserAddress[]
cityPreference UserCityPreference?
@@ -1343,6 +1398,7 @@ model User {
@@index([sourceType, sourceRefId])
@@index([referrerUserId])
@@index([assocPartnerAccountId])
@@index([mergedIntoUserId])
@@index([wxOpenId])
@@index([isTest])
@@ -1877,6 +1933,9 @@ model StoreRating {
storeId BigInt @map("store_id") @db.UnsignedBigInt
serviceScore Int @map("service_score") @db.TinyInt
envScore Int @map("env_score") @db.TinyInt
comment String? @db.VarChar(200)
tags Json?
imageUrls Json? @map("image_urls")
createdAt DateTime @default(now()) @map("created_at") @db.DateTime(3)
redeemRecord RedeemRecord @relation(fields: [redeemRecordId], references: [id], onDelete: Cascade)