Initial commit: 风影 OA 全栈源码(API/Web/Flutter/IM)
含 Phase 1.1 IM seq 排序、断线重连、多端已读同步与微信式语音转文字 UI。 排除 node_modules、构建产物、安装包与 .env 密钥。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
-- Employee: salary, reporting line, lifecycle dates, compensatory leave
|
||||
ALTER TABLE "Employee" ADD COLUMN "internStartAt" TIMESTAMP(3);
|
||||
ALTER TABLE "Employee" ADD COLUMN "probationEndAt" TIMESTAMP(3);
|
||||
ALTER TABLE "Employee" ADD COLUMN "leftAt" TIMESTAMP(3);
|
||||
ALTER TABLE "Employee" ADD COLUMN "managerId" TEXT;
|
||||
ALTER TABLE "Employee" ADD COLUMN "baseSalary" DECIMAL(18,2) NOT NULL DEFAULT 0;
|
||||
ALTER TABLE "Employee" ADD COLUMN "perfBase" DECIMAL(18,2) NOT NULL DEFAULT 0;
|
||||
ALTER TABLE "Employee" ADD COLUMN "socialBase" DECIMAL(18,2) NOT NULL DEFAULT 0;
|
||||
ALTER TABLE "Employee" ADD COLUMN "compLeaveHours" DECIMAL(10,2) NOT NULL DEFAULT 0;
|
||||
|
||||
CREATE INDEX "Employee_departmentId_idx" ON "Employee"("departmentId");
|
||||
CREATE INDEX "Employee_managerId_idx" ON "Employee"("managerId");
|
||||
|
||||
ALTER TABLE "Employee" ADD CONSTRAINT "Employee_managerId_fkey" FOREIGN KEY ("managerId") REFERENCES "Employee"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
UPDATE "Employee" SET "baseSalary" = 8000, "perfBase" = 0, "socialBase" = 8000 WHERE "employeeNo" = 'E000';
|
||||
UPDATE "Employee" SET "baseSalary" = 25000, "perfBase" = 10000, "socialBase" = 20000 WHERE "employeeNo" = 'E001';
|
||||
UPDATE "Employee" SET "baseSalary" = 18000, "perfBase" = 8000, "socialBase" = 18000 WHERE "employeeNo" = 'E010';
|
||||
UPDATE "Employee" SET "baseSalary" = 9000, "perfBase" = 2500, "socialBase" = 9000 WHERE "employeeNo" = 'E011';
|
||||
UPDATE "Employee" SET "baseSalary" = 15000, "perfBase" = 5000, "socialBase" = 15000 WHERE "employeeNo" IN ('E020','E021','E022','E023');
|
||||
UPDATE "Employee" SET "baseSalary" = 10000, "perfBase" = 2000, "socialBase" = 10000 WHERE "employeeNo" = 'E030';
|
||||
UPDATE "Employee" SET "baseSalary" = 9000, "perfBase" = 2000, "socialBase" = 9000 WHERE "employeeNo" = 'E040';
|
||||
UPDATE "Employee" SET "baseSalary" = 10000, "perfBase" = 3000, "socialBase" = 10000 WHERE "employeeNo" = 'E100';
|
||||
|
||||
UPDATE "Employee" AS e
|
||||
SET "managerId" = d.id
|
||||
FROM "Employee" AS d
|
||||
WHERE e."employeeNo" = 'E100' AND d."employeeNo" = 'E023';
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "EmploymentEvent" (
|
||||
"id" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL DEFAULT '1',
|
||||
"employeeId" TEXT NOT NULL,
|
||||
"kind" TEXT NOT NULL,
|
||||
"fromStatus" TEXT,
|
||||
"toStatus" TEXT,
|
||||
"fromDeptId" TEXT,
|
||||
"toDeptId" TEXT,
|
||||
"effectiveAt" TIMESTAMP(3) NOT NULL,
|
||||
"comment" TEXT,
|
||||
"actorId" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "EmploymentEvent_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX "EmploymentEvent_employeeId_idx" ON "EmploymentEvent"("employeeId");
|
||||
CREATE INDEX "EmploymentEvent_effectiveAt_idx" ON "EmploymentEvent"("effectiveAt");
|
||||
|
||||
ALTER TABLE "EmploymentEvent" ADD CONSTRAINT "EmploymentEvent_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "Employee"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "EmploymentEvent" ADD CONSTRAINT "EmploymentEvent_fromDeptId_fkey" FOREIGN KEY ("fromDeptId") REFERENCES "Department"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
ALTER TABLE "EmploymentEvent" ADD CONSTRAINT "EmploymentEvent_toDeptId_fkey" FOREIGN KEY ("toDeptId") REFERENCES "Department"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
ALTER TABLE "EmploymentEvent" ADD CONSTRAINT "EmploymentEvent_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "AttendanceMonth" (
|
||||
"id" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL DEFAULT '1',
|
||||
"employeeId" TEXT NOT NULL,
|
||||
"yearMonth" TEXT NOT NULL,
|
||||
"workDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"leaveDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"sickDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"overtimeHours" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"compLeaveDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"remark" TEXT,
|
||||
"importedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"importedById" TEXT,
|
||||
|
||||
CONSTRAINT "AttendanceMonth_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "AttendanceMonth_employeeId_yearMonth_key" ON "AttendanceMonth"("employeeId", "yearMonth");
|
||||
CREATE INDEX "AttendanceMonth_yearMonth_idx" ON "AttendanceMonth"("yearMonth");
|
||||
|
||||
ALTER TABLE "AttendanceMonth" ADD CONSTRAINT "AttendanceMonth_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "Employee"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
ALTER TABLE "AttendanceMonth" ADD CONSTRAINT "AttendanceMonth_importedById_fkey" FOREIGN KEY ("importedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "PayrollRun" (
|
||||
"id" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL DEFAULT '1',
|
||||
"yearMonth" TEXT NOT NULL,
|
||||
"status" TEXT NOT NULL DEFAULT 'DRAFT',
|
||||
"createdById" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"confirmedAt" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "PayrollRun_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "PayrollRun_tenantId_yearMonth_key" ON "PayrollRun"("tenantId", "yearMonth");
|
||||
|
||||
ALTER TABLE "PayrollRun" ADD CONSTRAINT "PayrollRun_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "PayrollItem" (
|
||||
"id" TEXT NOT NULL,
|
||||
"runId" TEXT NOT NULL,
|
||||
"employeeId" TEXT NOT NULL,
|
||||
"prorationFactor" DECIMAL(8,6) NOT NULL DEFAULT 1,
|
||||
"scheduledDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"dailyRate" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"basePay" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"performancePay" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"performanceRatio" DECIMAL(5,2) NOT NULL DEFAULT 100,
|
||||
"leaveDeduct" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"sickDeduct" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"socialPersonal" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"housingFund" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"tax" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"grossPay" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"netPay" DECIMAL(18,2) NOT NULL DEFAULT 0,
|
||||
"overtimeHours" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"compLeaveUsedDays" DECIMAL(6,2) NOT NULL DEFAULT 0,
|
||||
"compLeaveHours" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
||||
|
||||
CONSTRAINT "PayrollItem_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX "PayrollItem_runId_employeeId_key" ON "PayrollItem"("runId", "employeeId");
|
||||
|
||||
ALTER TABLE "PayrollItem" ADD CONSTRAINT "PayrollItem_runId_fkey" FOREIGN KEY ("runId") REFERENCES "PayrollRun"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
ALTER TABLE "PayrollItem" ADD CONSTRAINT "PayrollItem_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "Employee"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- Directors only see 绩效发放 under 组织人事, not the full HR module
|
||||
INSERT INTO "RolePermission" ("roleId", "permissionId")
|
||||
SELECT r.id, p.id
|
||||
FROM "Role" r
|
||||
CROSS JOIN "Permission" p
|
||||
WHERE r.code IN ('tech_director', 'biz_director')
|
||||
AND p.code = 'hr:performance'
|
||||
ON CONFLICT DO NOTHING;
|
||||
Reference in New Issue
Block a user