feat(server): 工作流扩展 leave 实体骨架(F24)

- workflow_instances 解耦 reimbursement FK:新增 reimbursement_id/leave_request_id + 回填迁移
- 新增 leave_requests 表与 /api/leave-requests 最小链路(create/submit)
- workflow approve/reject/return 支持 leave 状态更新;transfer 非报销任务禁用
- seed-config 增加 leave workflow definition;更新 v3 CSV 状态推进
这个提交包含在:
2026-02-09 21:24:53 +08:00
父节点 3cc3013d5a
当前提交 70f4d729f0
共修改 9 个文件,包含 695 行新增和 132 行删除
@@ -0,0 +1,56 @@
-- CreateEnum
CREATE TYPE "LeaveRequestStatus" AS ENUM ('draft', 'reviewing', 'approved', 'rejected', 'cancelled');
-- DropForeignKey
ALTER TABLE "workflow_instances" DROP CONSTRAINT "workflow_instances_entity_id_fkey";
-- AlterTable
ALTER TABLE "workflow_instances" ADD COLUMN "leave_request_id" UUID,
ADD COLUMN "reimbursement_id" UUID;
-- CreateTable
CREATE TABLE "leave_requests" (
"id" UUID NOT NULL,
"owner_id" UUID NOT NULL,
"department_id" UUID NOT NULL,
"start_date" DATE NOT NULL,
"end_date" DATE NOT NULL,
"reason" TEXT,
"status" "LeaveRequestStatus" NOT NULL DEFAULT 'draft',
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"created_by" UUID,
"updated_at" TIMESTAMP(3) NOT NULL,
"updated_by" UUID,
CONSTRAINT "leave_requests_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "leave_requests_owner_id_idx" ON "leave_requests"("owner_id");
-- CreateIndex
CREATE INDEX "leave_requests_department_id_idx" ON "leave_requests"("department_id");
-- CreateIndex
CREATE INDEX "leave_requests_status_idx" ON "leave_requests"("status");
-- CreateIndex
CREATE INDEX "idx_leave_owner_status_updated_at" ON "leave_requests"("owner_id", "status", "updated_at");
-- CreateIndex
CREATE INDEX "workflow_instances_reimbursement_id_idx" ON "workflow_instances"("reimbursement_id");
-- CreateIndex
CREATE INDEX "workflow_instances_leave_request_id_idx" ON "workflow_instances"("leave_request_id");
-- AddForeignKey
ALTER TABLE "leave_requests" ADD CONSTRAINT "leave_requests_owner_id_fkey" FOREIGN KEY ("owner_id") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "leave_requests" ADD CONSTRAINT "leave_requests_department_id_fkey" FOREIGN KEY ("department_id") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "workflow_instances" ADD CONSTRAINT "workflow_instances_reimbursement_id_fkey" FOREIGN KEY ("reimbursement_id") REFERENCES "reimbursement_forms"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "workflow_instances" ADD CONSTRAINT "workflow_instances_leave_request_id_fkey" FOREIGN KEY ("leave_request_id") REFERENCES "leave_requests"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,12 @@
-- Backfill workflow_instances.*_id columns for existing rows.
-- Reimbursement instances historically used entity_id as FK target.
UPDATE "workflow_instances"
SET reimbursement_id = entity_id
WHERE entity_type = 'reimbursement'
AND reimbursement_id IS NULL;
UPDATE "workflow_instances"
SET leave_request_id = entity_id
WHERE entity_type = 'leave'
AND leave_request_id IS NULL;