petstore-backend/db/migrations/20260801_split_service_identity.sql

60 lines
2.4 KiB
SQL

-- Petstore Phase 0: split customer / creator / service staff / report author identity.
-- Target: MySQL. One-time migration; back up the database before execution.
-- Existing legacy columns remain for compatibility and are not dropped here.
ALTER TABLE t_appointment
ADD COLUMN customer_user_id BIGINT NULL COMMENT '被服务客户账号',
ADD COLUMN created_by_user_id BIGINT NULL COMMENT '预约创建账号';
CREATE INDEX idx_appt_customer_status_time
ON t_appointment (customer_user_id, status, appointment_time);
ALTER TABLE t_report
ADD COLUMN customer_user_id BIGINT NULL COMMENT '报告归属客户账号',
ADD COLUMN author_staff_id BIGINT NULL COMMENT '报告提交门店账号';
CREATE INDEX idx_report_customer_time
ON t_report (customer_user_id, create_time);
CREATE INDEX idx_report_author_time
ON t_report (author_staff_id, create_time);
-- Appointment backfill priority:
-- 1. pet.owner_user_id (strongest customer ownership evidence)
-- 2. legacy user_id only when that account is a customer
-- Legacy staff-created rows without pet ownership remain NULL for manual correction.
UPDATE t_appointment a
LEFT JOIN t_pet p
ON p.id = a.pet_id AND p.deleted = 0
LEFT JOIN t_user legacy_user
ON legacy_user.id = a.user_id AND legacy_user.deleted = 0
SET a.customer_user_id = COALESCE(
a.customer_user_id,
p.owner_user_id,
CASE WHEN legacy_user.role = 'customer' THEN a.user_id ELSE NULL END
),
a.created_by_user_id = COALESCE(a.created_by_user_id, a.user_id)
WHERE a.customer_user_id IS NULL OR a.created_by_user_id IS NULL;
-- Report user_id historically means report author/service staff.
-- Customer ownership must come from the linked appointment, never from report.user_id.
UPDATE t_report r
LEFT JOIN t_appointment a
ON a.id = r.appointment_id AND a.deleted = 0
SET r.customer_user_id = COALESCE(r.customer_user_id, a.customer_user_id),
r.author_staff_id = COALESCE(r.author_staff_id, r.user_id)
WHERE r.customer_user_id IS NULL OR r.author_staff_id IS NULL;
-- Verification queries. unresolved_assisted_appointments must be reviewed manually.
SELECT COUNT(*) AS unresolved_assisted_appointments
FROM t_appointment
WHERE deleted = 0 AND customer_user_id IS NULL;
SELECT COUNT(*) AS reports_without_customer
FROM t_report
WHERE deleted = 0 AND customer_user_id IS NULL;
SELECT COUNT(*) AS reports_without_author
FROM t_report
WHERE deleted = 0 AND author_staff_id IS NULL;