Implement referral, points, coupons, commission, member levels, and order integration with migration SQL and background jobs. Co-authored-by: Cursor <cursoragent@cursor.com>
337 lines
19 KiB
SQL
337 lines
19 KiB
SQL
-- 客户营销模块:裂变 / 会员等级 / 优惠券 / 推荐分成
|
||
-- 前置约定(见 docs/客户裂变与营销体系设计方案.md §2、§24):
|
||
-- 1. 子账号不参与营销,一律归主客户
|
||
-- 2. MemberLevel 替换 CustomerGroup
|
||
-- 3. CommissionBalance 独立字段,可提现或转余额
|
||
-- 4. 默认分成:实付每 1000 元 → 2 元(0.2%)
|
||
-- 表结构遵循 docs/oms系统设计-050801.md §3.1.2(ConcurrencyStamp 固定默认值,禁止 UUID())
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 1. t_customer 扩展
|
||
-- ---------------------------------------------------------------------------
|
||
SET @col_exists := (
|
||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_customer' AND COLUMN_NAME = 'ReferrerCustomerId'
|
||
);
|
||
SET @sql := IF(@col_exists = 0,
|
||
'ALTER TABLE `t_customer`
|
||
ADD COLUMN `ReferrerCustomerId` INT NULL COMMENT ''引荐人主客户Id → t_customer.Id'' AFTER `ParentCustomerId`,
|
||
ADD COLUMN `ReferralBindTime` DATETIME NULL COMMENT ''引荐绑定时间'' AFTER `ReferrerCustomerId`,
|
||
ADD COLUMN `ReferralChannel` VARCHAR(32) NULL COMMENT ''引荐渠道 link/qrcode/manual'' AFTER `ReferralBindTime`,
|
||
ADD COLUMN `MemberLevelId` INT NULL COMMENT ''会员等级Id → t_member_level.Id'' AFTER `CustomerGroup`,
|
||
ADD COLUMN `CommissionBalance` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT ''可提现佣金余额'' AFTER `Balance`,
|
||
ADD KEY `idx_cus_referrer` (`ReferrerCustomerId`),
|
||
ADD KEY `idx_cus_member_level` (`MemberLevelId`)',
|
||
'SELECT 1');
|
||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 2. 引荐码
|
||
-- ---------------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `t_customer_referral_code` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '主客户Id → t_customer.Id',
|
||
`InviteCode` VARCHAR(16) NOT NULL COMMENT '邀请短码,全局唯一',
|
||
`Status` TINYINT NOT NULL DEFAULT 1 COMMENT 'ReferralCodeStatus:0=Disabled,1=Enabled',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_referral_invite_code` (`InviteCode`),
|
||
UNIQUE KEY `uk_referral_customer` (`CustomerId`)
|
||
) COMMENT='客户引荐码(主客户)';
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 3. 会员等级
|
||
-- ---------------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `t_member_level` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`LevelCode` VARCHAR(32) NOT NULL COMMENT '等级编码,唯一',
|
||
`LevelName` VARCHAR(64) NOT NULL COMMENT '等级名称',
|
||
`MinPoints` INT NOT NULL DEFAULT 0 COMMENT '升级所需累计积分',
|
||
`PriceTierKey` VARCHAR(32) NOT NULL COMMENT '价区键,对应卖价 CustomerGroupValues JSON 键',
|
||
`ExtraDiscountRate` DECIMAL(8,4) NOT NULL DEFAULT 0.0000 COMMENT '额外折扣率,如 0.03=97折',
|
||
`Sort` INT NOT NULL DEFAULT 0 COMMENT '排序,越小越低',
|
||
`IconUrl` VARCHAR(255) NULL COMMENT '等级图标',
|
||
`BenefitDesc` VARCHAR(512) NULL COMMENT '权益说明',
|
||
`Status` TINYINT NOT NULL DEFAULT 2 COMMENT 'EnableStatus:0=None,1=Disabled,2=Enabled',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_member_level_code` (`LevelCode`),
|
||
KEY `idx_member_level_sort` (`Sort`, `Status`)
|
||
) COMMENT='会员等级配置';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_customer_points_account` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`CustomerId` INT NOT NULL COMMENT '主客户Id',
|
||
`TotalPoints` INT NOT NULL DEFAULT 0 COMMENT '累计积分(含已消耗,用于定级)',
|
||
`AvailablePoints` INT NOT NULL DEFAULT 0 COMMENT '可用积分',
|
||
`Version` INT NOT NULL DEFAULT 0 COMMENT '乐观锁',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_points_customer` (`CustomerId`)
|
||
) COMMENT='客户积分账户(主客户)';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_customer_points_flow` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`CustomerId` INT NOT NULL COMMENT '主客户Id',
|
||
`ChangeType` TINYINT NOT NULL COMMENT 'PointsChangeType:1=Earn,2=Consume,3=Adjust,4=RefundClawback',
|
||
`Points` INT NOT NULL COMMENT '变动积分,正增负减',
|
||
`BizType` VARCHAR(32) NOT NULL COMMENT 'orderPay/refund/adminAdjust 等',
|
||
`BizId` INT NULL,
|
||
`BizNo` VARCHAR(64) NULL,
|
||
`Remark` VARCHAR(512) NULL,
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0 COMMENT '创建人',
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`UpdateUserId` INT NULL COMMENT '更新人',
|
||
`UpdateTime` DATETIME NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_points_flow_customer_time` (`CustomerId`, `CreateTime`),
|
||
KEY `idx_points_flow_biz` (`BizType`, `BizId`)
|
||
) COMMENT='积分流水';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_member_points_rule` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`RuleName` VARCHAR(64) NOT NULL COMMENT '规则名称',
|
||
`PointsPerYuan` DECIMAL(10,4) NOT NULL DEFAULT 1.0000 COMMENT '实付每1元得积分',
|
||
`FirstOrderMultiplier` DECIMAL(6,2) NOT NULL DEFAULT 1.00 COMMENT '首单积分倍数',
|
||
`MaxPointsPerOrder` INT NOT NULL DEFAULT 10000 COMMENT '单笔积分上限',
|
||
`Status` TINYINT NOT NULL DEFAULT 2 COMMENT 'EnableStatus:0=None,1=Disabled,2=Enabled',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`)
|
||
) COMMENT='积分获取规则(全局单条有效)';
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 4. 优惠券
|
||
-- ---------------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `t_coupon_template` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`TemplateCode` VARCHAR(32) NOT NULL COMMENT '券模板编码',
|
||
`TemplateName` VARCHAR(128) NOT NULL COMMENT '券名称',
|
||
`CouponType` VARCHAR(32) NOT NULL COMMENT 'fixed_off/percent_off/direct_off/shipping_off',
|
||
`FaceValue` DECIMAL(18,2) NULL COMMENT '面额(满减/立减)',
|
||
`DiscountRate` DECIMAL(8,4) NULL COMMENT '折扣率,如0.95',
|
||
`MaxDiscountAmount` DECIMAL(18,2) NULL COMMENT '折扣券封顶',
|
||
`MinOrderAmount` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '使用门槛',
|
||
`TotalQuantity` INT NOT NULL DEFAULT 0 COMMENT '发放总量,0=不限',
|
||
`IssuedQuantity` INT NOT NULL DEFAULT 0 COMMENT '已发放数量',
|
||
`PerCustomerLimit` INT NOT NULL DEFAULT 1 COMMENT '每客户领取上限',
|
||
`ValidType` TINYINT NOT NULL DEFAULT 1 COMMENT '1=固定日期,2=领取后N天',
|
||
`ValidStartTime` DATETIME NULL,
|
||
`ValidEndTime` DATETIME NULL,
|
||
`ValidDaysAfterReceive` INT NULL COMMENT '领取后有效天数',
|
||
`ApplyScopeJson` JSON NULL COMMENT '适用产品/国家等 JSON',
|
||
`GrantChannel` VARCHAR(32) NOT NULL DEFAULT 'manual' COMMENT 'manual/register/referral/level/activity',
|
||
`Status` TINYINT NOT NULL DEFAULT 1 COMMENT 'CouponTemplateStatus:0=Draft,1=Active,2=Ended',
|
||
`Remark` VARCHAR(512) NULL,
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_coupon_template_code` (`TemplateCode`),
|
||
KEY `idx_coupon_template_status` (`Status`, `ValidEndTime`)
|
||
) COMMENT='优惠券模板';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_coupon_instance` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`TemplateId` INT NOT NULL COMMENT '→ t_coupon_template.Id',
|
||
`CustomerId` INT NOT NULL COMMENT '主客户Id',
|
||
`CouponCode` VARCHAR(32) NOT NULL COMMENT '券实例码',
|
||
`Status` TINYINT NOT NULL DEFAULT 1 COMMENT 'CouponInstanceStatus:1=Available,2=Locked,3=Used,4=Expired',
|
||
`ReceiveTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`ValidStartTime` DATETIME NOT NULL,
|
||
`ValidEndTime` DATETIME NOT NULL,
|
||
`UseTime` DATETIME NULL,
|
||
`OrderId` INT NULL COMMENT '核销订单Id',
|
||
`LockExpireTime` DATETIME NULL COMMENT '下单预占过期',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_coupon_instance_code` (`CouponCode`),
|
||
KEY `idx_coupon_instance_customer_status` (`CustomerId`, `Status`),
|
||
KEY `idx_coupon_instance_order` (`OrderId`)
|
||
) COMMENT='客户优惠券实例';
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 5. 推荐分成
|
||
-- ---------------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `t_referral_commission_rule` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`RuleName` VARCHAR(64) NOT NULL DEFAULT '默认分成规则',
|
||
`CommissionMode` VARCHAR(32) NOT NULL DEFAULT 'per_amount' COMMENT 'per_amount=每满X元得Y元',
|
||
`BaseAmount` DECIMAL(18,2) NOT NULL DEFAULT 1000.00 COMMENT '基数金额',
|
||
`CommissionAmount` DECIMAL(18,2) NOT NULL DEFAULT 2.00 COMMENT '每基数分成金额',
|
||
`FreezeDays` INT NOT NULL DEFAULT 7 COMMENT '派送成功后的结算冻结天数',
|
||
`SettleTriggerOrderStatus` VARCHAR(32) NOT NULL DEFAULT 'deliverySuccess' COMMENT '允许结算的订单状态,固定 deliverySuccess',
|
||
`MonthlyCap` DECIMAL(18,2) NULL COMMENT '引荐人单月分成封顶,NULL=不限',
|
||
`Status` TINYINT NOT NULL DEFAULT 2 COMMENT 'EnableStatus:0=None,1=Disabled,2=Enabled',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`)
|
||
) COMMENT='引荐分成规则';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_referral_commission_detail` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`ReferrerCustomerId` INT NOT NULL COMMENT '引荐人主客户Id',
|
||
`RefereeCustomerId` INT NOT NULL COMMENT '被引荐主客户Id',
|
||
`OrderId` INT NOT NULL COMMENT '订单Id',
|
||
`OrderNo` VARCHAR(64) NOT NULL COMMENT '运单号快照',
|
||
`BasePayableAmount` DECIMAL(18,2) NOT NULL COMMENT '分成基数(实付)',
|
||
`CommissionAmount` DECIMAL(18,2) NOT NULL COMMENT '分成金额',
|
||
`Status` TINYINT NOT NULL DEFAULT 1 COMMENT 'CommissionStatus:1=Pending,2=Settled,3=Cancelled',
|
||
`EligibleTime` DATETIME NULL COMMENT '订单达到派送成功时间,分成计算触发点',
|
||
`SettleTime` DATETIME NULL COMMENT '入账 CommissionBalance 时间',
|
||
`RuleSnapshotJson` JSON NULL COMMENT '分成规则快照:BaseAmount/CommissionAmount/FreezeDays/MonthlyCap 等',
|
||
`CancelReason` VARCHAR(256) NULL,
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_commission_order_referrer` (`OrderId`, `ReferrerCustomerId`),
|
||
KEY `idx_commission_referrer_status` (`ReferrerCustomerId`, `Status`, `CreateTime`),
|
||
KEY `idx_commission_referee` (`RefereeCustomerId`)
|
||
) COMMENT='引荐分成明细';
|
||
|
||
CREATE TABLE IF NOT EXISTS `t_commission_withdraw_request` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT,
|
||
`CustomerId` INT NOT NULL COMMENT '主客户Id',
|
||
`SerialNumber` VARCHAR(64) NOT NULL COMMENT '提现单号',
|
||
`Amount` DECIMAL(18,2) NOT NULL COMMENT '申请金额',
|
||
`WithdrawType` TINYINT NOT NULL COMMENT '1=提现到外部,2=转入余额',
|
||
`Status` TINYINT NOT NULL DEFAULT 1 COMMENT 'WithdrawStatus:1=Pending,2=Approved,3=Rejected,4=Paid',
|
||
`Remark` VARCHAR(512) NULL COMMENT '客户备注',
|
||
`AuditRemark` VARCHAR(512) NULL COMMENT '审核备注',
|
||
`AuditBy` VARCHAR(32) NULL,
|
||
`AuditTime` DATETIME NULL,
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0,
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
`UpdateUserId` INT NULL,
|
||
`UpdateTime` DATETIME NULL,
|
||
PRIMARY KEY (`Id`),
|
||
UNIQUE KEY `uk_commission_withdraw_serial` (`SerialNumber`),
|
||
KEY `idx_commission_withdraw_customer` (`CustomerId`, `Status`, `CreateTime`)
|
||
) COMMENT='佣金提现/转余额申请';
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 5.1 营销审计日志
|
||
-- ---------------------------------------------------------------------------
|
||
CREATE TABLE IF NOT EXISTS `t_marketing_audit_log` (
|
||
`Id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
`Action` VARCHAR(64) NOT NULL COMMENT 'grantCoupon/adjustPoints/rebindReferral 等',
|
||
`OperatorId` INT NOT NULL DEFAULT 0 COMMENT '操作人 mapId',
|
||
`TargetType` VARCHAR(32) NOT NULL COMMENT 'customer/template/order 等',
|
||
`TargetId` INT NULL COMMENT '目标主键',
|
||
`BeforeJson` JSON NULL COMMENT '变更前快照',
|
||
`AfterJson` JSON NULL COMMENT '变更后快照',
|
||
`Remark` VARCHAR(512) NULL COMMENT '原因/备注',
|
||
`IsDeleted` TINYINT NOT NULL DEFAULT 0 COMMENT '软删除:0-否,1-是',
|
||
`ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000' COMMENT '并发戳',
|
||
`CreateUserId` INT NOT NULL DEFAULT 0 COMMENT '创建人',
|
||
`CreateTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`UpdateUserId` INT NULL COMMENT '更新人',
|
||
`UpdateTime` DATETIME NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`Id`),
|
||
KEY `idx_marketing_audit_action_time` (`Action`, `CreateTime`),
|
||
KEY `idx_marketing_audit_target` (`TargetType`, `TargetId`)
|
||
) COMMENT='营销高危操作审计';
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 6. 订单营销快照
|
||
-- ---------------------------------------------------------------------------
|
||
SET @col_exists := (
|
||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 't_order' AND COLUMN_NAME = 'MemberLevelId'
|
||
);
|
||
SET @sql := IF(@col_exists = 0,
|
||
'ALTER TABLE `t_order`
|
||
ADD COLUMN `MemberLevelId` INT NULL COMMENT ''下单时会员等级快照'' AFTER `CustomerId`,
|
||
ADD COLUMN `PriceTierKey` VARCHAR(32) NULL COMMENT ''下单时价区键快照'' AFTER `MemberLevelId`,
|
||
ADD COLUMN `ReceivableSubtotal` DECIMAL(18,2) NULL COMMENT ''等级价后小计'' AFTER `PriceTierKey`,
|
||
ADD COLUMN `LevelDiscountAmount` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT ''等级额外折扣额'' AFTER `ReceivableSubtotal`,
|
||
ADD COLUMN `CouponInstanceId` INT NULL COMMENT ''核销券实例Id'' AFTER `LevelDiscountAmount`,
|
||
ADD COLUMN `CouponDiscountAmount` DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT ''优惠券抵扣额'' AFTER `CouponInstanceId`,
|
||
ADD COLUMN `PayableAmount` DECIMAL(18,2) NULL COMMENT ''应付实付'' AFTER `CouponDiscountAmount`,
|
||
ADD KEY `idx_ord_coupon` (`CouponInstanceId`)',
|
||
'SELECT 1');
|
||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- 7. 种子:默认会员等级(映射原 CustomerGroup 价区)
|
||
-- ---------------------------------------------------------------------------
|
||
INSERT INTO `t_member_level`
|
||
(`LevelCode`, `LevelName`, `MinPoints`, `PriceTierKey`, `ExtraDiscountRate`, `Sort`, `BenefitDesc`, `Status`, `CreateUserId`)
|
||
VALUES
|
||
('normal', '普通会员', 0, '普通客户', 0.0000, 10, '标准运价', 2, 0),
|
||
('silver', '银卡会员', 5000, 'VIP1', 0.0000, 20, 'VIP1 价区', 2, 0),
|
||
('gold', '金卡会员', 20000, 'VIP2', 0.0100, 30, 'VIP2 价区 + 额外 1% 折', 2, 0),
|
||
('diamond', '钻石会员', 100000, 'VIP3', 0.0200, 40, 'VIP3 价区 + 额外 2% 折', 2, 0)
|
||
ON DUPLICATE KEY UPDATE
|
||
`LevelName` = VALUES(`LevelName`),
|
||
`MinPoints` = VALUES(`MinPoints`),
|
||
`PriceTierKey` = VALUES(`PriceTierKey`),
|
||
`ExtraDiscountRate` = VALUES(`ExtraDiscountRate`),
|
||
`Sort` = VALUES(`Sort`),
|
||
`BenefitDesc` = VALUES(`BenefitDesc`);
|
||
|
||
-- 主客户 MemberLevelId 迁移(按原 CustomerGroup)
|
||
UPDATE `t_customer` c
|
||
LEFT JOIN `t_member_level` ml ON (
|
||
(c.CustomerGroup IS NULL OR c.CustomerGroup = 0 OR c.CustomerGroup = 1) AND ml.LevelCode = 'normal'
|
||
OR (c.CustomerGroup = 2 AND ml.LevelCode = 'silver')
|
||
OR (c.CustomerGroup = 3 AND ml.LevelCode = 'gold')
|
||
OR (c.CustomerGroup = 4 AND ml.LevelCode = 'diamond')
|
||
OR (c.CustomerGroup >= 5 AND ml.LevelCode = 'diamond')
|
||
)
|
||
SET c.MemberLevelId = ml.Id
|
||
WHERE c.ParentCustomerId IS NULL AND c.MemberLevelId IS NULL AND ml.Id IS NOT NULL;
|
||
|
||
-- 默认积分规则
|
||
INSERT INTO `t_member_points_rule`
|
||
(`RuleName`, `PointsPerYuan`, `FirstOrderMultiplier`, `MaxPointsPerOrder`, `Status`, `CreateUserId`)
|
||
SELECT '默认积分规则', 1.0000, 1.00, 10000, 2, 0
|
||
FROM DUAL
|
||
WHERE NOT EXISTS (SELECT 1 FROM `t_member_points_rule` WHERE `IsDeleted` = 0 LIMIT 1);
|
||
|
||
-- 默认分成规则:每 1000 元 → 2 元
|
||
INSERT INTO `t_referral_commission_rule`
|
||
(`RuleName`, `CommissionMode`, `BaseAmount`, `CommissionAmount`, `FreezeDays`, `Status`, `CreateUserId`)
|
||
SELECT '默认分成', 'per_amount', 1000.00, 2.00, 7, 2, 0
|
||
FROM DUAL
|
||
WHERE NOT EXISTS (SELECT 1 FROM `t_referral_commission_rule` WHERE `IsDeleted` = 0 LIMIT 1);
|