support-requests.sql 2.4 KB

1234567891011121314151617181920212223242526272829303132
  1. CREATE TABLE IF NOT EXISTS "SupportRequestResolution" (
  2. company text NOT NULL,
  3. "requestId" text NOT NULL,
  4. "ownerId" numeric NOT NULL,
  5. status text NOT NULL CHECK(status IN ('processed','approved','rejected')),
  6. comment text NOT NULL CHECK(length(btrim(comment)) BETWEEN 1 AND 1000),
  7. actor text NOT NULL,
  8. "actorName" text NOT NULL,
  9. "handledAt" timestamptz NOT NULL DEFAULT now(),
  10. "readAt" timestamptz,
  11. PRIMARY KEY(company,"requestId")
  12. );
  13. CREATE INDEX IF NOT EXISTS support_reply_owner ON "SupportRequestResolution"(company,"ownerId","handledAt" DESC);
  14. CREATE OR REPLACE FUNCTION xs_support_request_process(co text,rid text,actor_id text,actor_name text,next_status text,note text,expected text)
  15. RETURNS jsonb LANGUAGE plpgsql AS $$
  16. DECLARE g "Guestbook"; r "SupportRequestResolution"; kind text; fingerprint text;
  17. BEGIN
  18. IF NULLIF(btrim(co),'') IS NULL OR NULLIF(btrim(actor_id),'') IS NULL OR note IS NULL OR next_status IS NULL OR length(btrim(note)) NOT BETWEEN 1 AND 1000 OR next_status NOT IN ('processed','approved','rejected') THEN RAISE EXCEPTION '请填写处理结果和 1 至 1000 字的处理意见'; END IF;
  19. SELECT * INTO g FROM "Guestbook" WHERE company=co AND "objectId"=rid AND COALESCE(parentid,0)=0 AND COALESCE(status,0)<>-2 AND (cateid=22 OR "sourceKey" LIKE 'cloud:guestbook_add:%') FOR UPDATE;
  20. IF NOT FOUND THEN RAISE EXCEPTION '申请不存在或已删除'; END IF;
  21. SELECT * INTO r FROM "SupportRequestResolution" WHERE company=co AND "requestId"=rid;
  22. IF FOUND THEN
  23. IF r.actor=actor_id AND r.status=next_status AND r.comment=btrim(note) THEN RETURN to_jsonb(r); END IF;
  24. RAISE EXCEPTION '该申请已处理,请刷新查看结果';
  25. END IF;
  26. fingerprint=md5(COALESCE(g.title,'')||chr(10)||COALESCE(g.tcontent,'')||chr(10)||COALESCE(g.userid::text,''));
  27. IF expected IS DISTINCT FROM fingerprint THEN RAISE EXCEPTION '申请内容已变化,请刷新后重新处理'; END IF;
  28. kind=CASE WHEN g.title LIKE '【休假申请】%' THEN 'leave' ELSE 'feedback' END;
  29. IF (kind='leave' AND next_status NOT IN ('approved','rejected')) OR (kind='feedback' AND next_status<>'processed') THEN RAISE EXCEPTION '处理结果与申请类型不符'; END IF;
  30. INSERT INTO "SupportRequestResolution"(company,"requestId","ownerId",status,comment,actor,"actorName") VALUES(co,rid,g.userid,next_status,btrim(note),actor_id,actor_name) RETURNING * INTO r;
  31. RETURN to_jsonb(r);
  32. END $$;