fix(会商第三步): 流程图入库限 rwfx-A + 修复跳过报告生成流程图出现双调度中卡片
- 入库功能仅 rwfx-A(businessCode 6BF)深链会商模式提供,其它业务深链生成流程图不再出现入库按钮/询问 - 流程图抽取串行化:auto 自动出图与用户「跳过报告直接生成流程图」手动出图竞态时,先中止上一轮、复用/移除被取代气泡,保证任意时刻只有一张流程图卡片 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
04e6d0aa00
commit
893f1e6933
19 files changed
+559
-51
No files matched your search
@@ -11,7 +11,7 @@
|
||||
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { Navigate } from "react-router-dom";
|
||||
import { ArrowDown, ArrowUp, Download, MousePointerClick, Plus, Save, Trash2 } from "lucide-react";
|
||||
import { ArrowDown, ArrowUp, Download, MousePointerClick, Plus, Save, Trash2, X } from "lucide-react";
|
||||
import { toast } from "sonner";
|
||||
|
||||
import { Button } from "@/components/ui/button";
|
||||
@@ -37,7 +37,9 @@ import {
|
||||
defaultTaskButtons,
|
||||
type TaskBusiness,
|
||||
type TaskButton,
|
||||
type TaskButtonLoginParam,
|
||||
} from "@/core/auth/task-buttons";
|
||||
import { LOGIN_SOURCE_OPTIONS } from "@/strategy-components/lib/light-app";
|
||||
import { useTaskButtonActions, useTaskButtons } from "@/strategy-components/api/task-buttons";
|
||||
|
||||
let _seq = 1;
|
||||
@@ -105,12 +107,28 @@ export default function TaskButtonsPage() {
|
||||
idParam: "id",
|
||||
idKind: "task",
|
||||
openMode: "blank",
|
||||
loginParams: [],
|
||||
enabled: true,
|
||||
sortOrder: maxSort + 1,
|
||||
},
|
||||
]);
|
||||
};
|
||||
|
||||
// ── 登录参数(url 外链追加,与应用管理一致)增删改 ──
|
||||
const updateLoginParams = (id: string, fn: (ps: TaskButtonLoginParam[]) => TaskButtonLoginParam[]) =>
|
||||
setRows((rs) =>
|
||||
rs.map((r) => (r.id === id ? { ...r, loginParams: fn(r.loginParams ?? []) } : r)),
|
||||
);
|
||||
|
||||
const addLoginParam = (id: string) =>
|
||||
updateLoginParams(id, (ps) => [...ps, { key: "", source: "accessToken", customValue: "" }]);
|
||||
|
||||
const patchLoginParam = (id: string, idx: number, patch: Partial<TaskButtonLoginParam>) =>
|
||||
updateLoginParams(id, (ps) => ps.map((p, i) => (i === idx ? { ...p, ...patch } : p)));
|
||||
|
||||
const removeLoginParam = (id: string, idx: number) =>
|
||||
updateLoginParams(id, (ps) => ps.filter((_, i) => i !== idx));
|
||||
|
||||
const moveRow = (id: string, dir: "up" | "down") => {
|
||||
const list = [...tabRows];
|
||||
const i = list.findIndex((r) => r.id === id);
|
||||
@@ -335,6 +353,77 @@ export default function TaskButtonsPage() {
|
||||
</Select>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* 登录参数(仅外链):与「应用管理」一致,运行时从 userInfo 解析后拼到地址尾部 */}
|
||||
{r.linkType === "url" && (
|
||||
<div className="border-border/60 ml-16 flex flex-col gap-2 rounded-md border border-dashed bg-muted/30 p-2">
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-muted-foreground text-xs">
|
||||
登录参数(追加到地址,值取自登录信息)
|
||||
</span>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="h-7"
|
||||
onClick={() => addLoginParam(r.id)}
|
||||
>
|
||||
<Plus className="h-3.5 w-3.5" /> 添加登录参数
|
||||
</Button>
|
||||
</div>
|
||||
{(r.loginParams ?? []).length === 0 ? (
|
||||
<span className="text-muted-foreground text-[11px]">
|
||||
暂无登录参数,跳转时不追加额外参数。
|
||||
</span>
|
||||
) : (
|
||||
(r.loginParams ?? []).map((p, pi) => (
|
||||
<div key={pi} className="flex flex-wrap items-center gap-2">
|
||||
<Input
|
||||
value={p.key}
|
||||
onChange={(e) => patchLoginParam(r.id, pi, { key: e.target.value })}
|
||||
placeholder="参数名 key"
|
||||
className="h-8 w-32"
|
||||
title="拼到地址的查询参数名"
|
||||
/>
|
||||
<span className="text-muted-foreground text-xs">=</span>
|
||||
<Select
|
||||
value={p.source}
|
||||
onValueChange={(v) => patchLoginParam(r.id, pi, { source: v })}
|
||||
>
|
||||
<SelectTrigger className="h-8 w-36" title="取值来源">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{LOGIN_SOURCE_OPTIONS.map((o) => (
|
||||
<SelectItem key={o.value} value={o.value}>
|
||||
{o.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
{p.source === "other" && (
|
||||
<Input
|
||||
value={p.customValue}
|
||||
onChange={(e) =>
|
||||
patchLoginParam(r.id, pi, { customValue: e.target.value })
|
||||
}
|
||||
placeholder="自定义值"
|
||||
className="h-8 w-40"
|
||||
/>
|
||||
)}
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="text-muted-foreground hover:text-destructive h-8 w-8"
|
||||
onClick={() => removeLoginParam(r.id, pi)}
|
||||
title="删除该登录参数"
|
||||
>
|
||||
<X className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-1">
|
||||
|
||||
Reference in new issue
Block a user