修正CEO报销财务兜底与部署护栏(07-28-ceo-finance-fallback)
这个提交包含在:
@@ -8,7 +8,7 @@ export type ApprovalRoleCode =
|
||||
| "finance_mgr"
|
||||
| "administration"
|
||||
| "hr";
|
||||
export type ApprovalOwnerSelfFallbackRoleCode = "finance_mgr";
|
||||
export type ApprovalOwnerSelfFallbackRoleCode = "finance" | "finance_mgr";
|
||||
|
||||
export type ApprovalRule = {
|
||||
id: string;
|
||||
|
||||
@@ -27,9 +27,13 @@ const ROLE_OPTIONS: Array<{ code: ApprovalRoleCode; label: string }> = [
|
||||
{ code: "finance", label: "finance" },
|
||||
{ code: "finance_mgr", label: "finance_mgr" },
|
||||
];
|
||||
const OWNER_SELF_FALLBACK_ROLE_OPTIONS = ROLE_OPTIONS.filter(
|
||||
(role) => role.code === "finance_mgr",
|
||||
);
|
||||
const OWNER_SELF_FALLBACK_ROLE_OPTIONS: Array<{
|
||||
code: ApprovalOwnerSelfFallbackRoleCode;
|
||||
label: string;
|
||||
}> = [
|
||||
{ code: "finance", label: "财务" },
|
||||
{ code: "finance_mgr", label: "财务负责人(兼容)" },
|
||||
];
|
||||
|
||||
function formatAmount(value: string | null) {
|
||||
if (!value) return "-";
|
||||
@@ -47,7 +51,7 @@ export function ApprovalRulesPage() {
|
||||
const [level1Role, setLevel1Role] = useState<ApprovalRoleCode>("manager");
|
||||
const [level2Role, setLevel2Role] = useState<ApprovalRoleCode | "">("");
|
||||
const [level3Role, setLevel3Role] = useState<ApprovalRoleCode | "">("");
|
||||
const [ownerSelfFallbackRole, setOwnerSelfFallbackRole] = useState<ApprovalOwnerSelfFallbackRoleCode | "">("finance_mgr");
|
||||
const [ownerSelfFallbackRole, setOwnerSelfFallbackRole] = useState<ApprovalOwnerSelfFallbackRoleCode | "">("finance");
|
||||
const [enabled, setEnabled] = useState(true);
|
||||
|
||||
const [editOpen, setEditOpen] = useState(false);
|
||||
@@ -102,7 +106,7 @@ export function ApprovalRulesPage() {
|
||||
setLevel1Role("manager");
|
||||
setLevel2Role("");
|
||||
setLevel3Role("");
|
||||
setOwnerSelfFallbackRole("finance_mgr");
|
||||
setOwnerSelfFallbackRole("finance");
|
||||
setEnabled(true);
|
||||
setError("");
|
||||
toast.success("规则已创建");
|
||||
@@ -334,7 +338,7 @@ export function ApprovalRulesPage() {
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
<p className="text-xs text-zinc-500">推荐 finance_mgr;不使用 admin。</p>
|
||||
<p className="text-xs text-zinc-500">推荐财务;系统管理员不参与业务审批。</p>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2 pt-6">
|
||||
|
||||
@@ -899,7 +899,7 @@ async function mockWave4Apis(page: Page, options: Wave4MockOptions = {}) {
|
||||
level1Role: "manager",
|
||||
level2Role: null,
|
||||
level3Role: null,
|
||||
ownerSelfFallbackRole: "finance_mgr",
|
||||
ownerSelfFallbackRole: "finance",
|
||||
enabled: true,
|
||||
priority: 1,
|
||||
createdAt: "2026-05-29T08:00:00.000Z",
|
||||
@@ -1067,6 +1067,19 @@ test("PC 财务列表使用明确动作入口", async ({ page }) => {
|
||||
await expect(page.getByTestId("invoice-export-csv")).toBeVisible();
|
||||
});
|
||||
|
||||
test("审批规则负责人本人兜底默认财务并兼容财务负责人", async ({ page }) => {
|
||||
await mockWave4Apis(page);
|
||||
await page.setViewportSize({ width: 1440, height: 960 });
|
||||
await login(page);
|
||||
|
||||
await page.goto("/system/approval-rules");
|
||||
const fallbackSelect = page.getByTestId("approval-rules-create-owner-self-fallback");
|
||||
await expect(fallbackSelect).toHaveValue("finance");
|
||||
await expect(fallbackSelect.locator('option[value="finance"]')).toHaveText("财务");
|
||||
await expect(fallbackSelect.locator('option[value="finance_mgr"]')).toHaveText("财务负责人(兼容)");
|
||||
await expect(page.getByText("推荐财务;系统管理员不参与业务审批。")).toBeVisible();
|
||||
});
|
||||
|
||||
test("/payment-batches 在 768x1024 与 1024x768 下操作列可达", async ({ page }) => {
|
||||
await mockWave4Apis(page);
|
||||
await login(page);
|
||||
|
||||
在新工单中引用
屏蔽一个用户