Просмотр исходного кода

perf(payroll): allow income filters before corrected row projection

彭峰 8 часов назад
Родитель
Сommit
df47a96424
2 измененных файлов с 55 добавлено и 5 удалено
  1. 28 0
      scripts/sql/admin-read-performance.sql
  2. 27 5
      scripts/sql/review-rewards.sql

+ 28 - 0
scripts/sql/admin-read-performance.sql

@@ -0,0 +1,28 @@
+-- Preserve every column and correction rule while allowing tenant/month predicates
+-- to reach the indexed receipt table before projecting corrected amounts.
+CREATE OR REPLACE VIEW "ReviewRewardIncome" AS
+SELECT
+  r."objectId",
+  r."company",
+  r."taskId",
+  r."taskKey",
+  r."coachId",
+  r."coachName",
+  r."studentId",
+  r."studentName",
+  r."courseName",
+  r."storeId",
+  r."storeName",
+  r."plannedDate",
+  r."completedAt",
+  r."incomeMonth",(r.amount+COALESCE(c.amount,0))::numeric(12,2) AS amount,
+  CASE WHEN c."objectId" IS NULL THEN r.status ELSE 'ineligible' END AS status,
+  r."exception",
+  r."createdAt",
+  CASE WHEN c."objectId" IS NULL THEN r."ineligibleReason" ELSE 'corrected_overdue' END AS "ineligibleReason",
+  r.amount AS "originalAmount",
+  c."objectId" AS "correctionId",
+  c.reason AS "correctionReason",
+  c.amount AS "correctionAmount",
+  c."adjustmentBatchId"
+FROM "ReviewReward" r LEFT JOIN "ReviewRewardCorrection" c ON c.company=r.company AND c."rewardId"=r."objectId";

+ 27 - 5
scripts/sql/review-rewards.sql

@@ -39,12 +39,34 @@ CREATE TABLE IF NOT EXISTS "ReviewRewardCorrection" (
  "sourceBatchId" text, "adjustmentBatchId" text, "adjustmentRequestId" text,
  "sourceBatchId" text, "adjustmentBatchId" text, "adjustmentRequestId" text,
  UNIQUE(company,"rewardId"), FOREIGN KEY("rewardId") REFERENCES "ReviewReward"("objectId")
  UNIQUE(company,"rewardId"), FOREIGN KEY("rewardId") REFERENCES "ReviewReward"("objectId")
 );
 );
+-- Preserve every column and correction rule while allowing tenant/month predicates
+-- to reach the indexed receipt table before projecting corrected amounts.
 CREATE OR REPLACE VIEW "ReviewRewardIncome" AS
 CREATE OR REPLACE VIEW "ReviewRewardIncome" AS
- SELECT projected.*,r.amount AS "originalAmount",c."objectId" AS "correctionId",c.reason AS "correctionReason",c.amount AS "correctionAmount",c."adjustmentBatchId"
- FROM "ReviewReward" r LEFT JOIN "ReviewRewardCorrection" c ON c.company=r.company AND c."rewardId"=r."objectId"
- CROSS JOIN LATERAL jsonb_populate_record(NULL::"ReviewReward",to_jsonb(r)||jsonb_build_object(
- 'amount',r.amount+COALESCE(c.amount,0),'status',CASE WHEN c."objectId" IS NULL THEN r.status ELSE 'ineligible' END,
- 'ineligibleReason',CASE WHEN c."objectId" IS NULL THEN r."ineligibleReason" ELSE 'corrected_overdue' END)) projected;
+SELECT
+  r."objectId",
+  r."company",
+  r."taskId",
+  r."taskKey",
+  r."coachId",
+  r."coachName",
+  r."studentId",
+  r."studentName",
+  r."courseName",
+  r."storeId",
+  r."storeName",
+  r."plannedDate",
+  r."completedAt",
+  r."incomeMonth",(r.amount+COALESCE(c.amount,0))::numeric(12,2) AS amount,
+  CASE WHEN c."objectId" IS NULL THEN r.status ELSE 'ineligible' END AS status,
+  r."exception",
+  r."createdAt",
+  CASE WHEN c."objectId" IS NULL THEN r."ineligibleReason" ELSE 'corrected_overdue' END AS "ineligibleReason",
+  r.amount AS "originalAmount",
+  c."objectId" AS "correctionId",
+  c.reason AS "correctionReason",
+  c.amount AS "correctionAmount",
+  c."adjustmentBatchId"
+FROM "ReviewReward" r LEFT JOIN "ReviewRewardCorrection" c ON c.company=r.company AND c."rewardId"=r."objectId";
 CREATE OR REPLACE FUNCTION xs_review_correction_guard() RETURNS trigger LANGUAGE plpgsql AS $$
 CREATE OR REPLACE FUNCTION xs_review_correction_guard() RETURNS trigger LANGUAGE plpgsql AS $$
 BEGIN
 BEGIN
  IF TG_OP<>'INSERT' OR current_setting('xiaoshu.review_correction',true) IS DISTINCT FROM 'yes' THEN RAISE EXCEPTION '工资纠正凭据只能由核对事务新增,不能改写或删除'; END IF;
  IF TG_OP<>'INSERT' OR current_setting('xiaoshu.review_correction',true) IS DISTINCT FROM 'yes' THEN RAISE EXCEPTION '工资纠正凭据只能由核对事务新增,不能改写或删除'; END IF;