# Generate a single-sheet testcase list combining atomic, branch, flow, and composition evidence.
$ErrorActionPreference = 'Stop'

$Root = (Resolve-Path '.').Path
$Output = Join-Path $Root 'SaaS_E2E测试用例_单Sheet用例测试列表.xlsx'

function Steps {
    param([string[]]$Items)
    $result = @()
    for ($i = 0; $i -lt $Items.Count; $i++) {
        $result += ('{0}. {1}' -f ($i + 1), $Items[$i])
    }
    return ($result -join "`n")
}

function Add-Row {
    param($Worksheet, [int]$Row, [object[]]$Values)
    if ($Values.Count -eq ($headers.Count - 1)) {
        $loginHint = Get-LoginHint $Values
        $normalized = @()
        $normalized += $Values[0..4]
        $normalized += $loginHint
        $normalized += $Values[5..($Values.Count - 1)]
        $Values = $normalized
    }
    for ($i = 0; $i -lt $Values.Count; $i++) {
        $Worksheet.Cells.Item($Row, $i + 1).Value2 = [string]$Values[$i]
    }
    $Worksheet.Rows.Item($Row).WrapText = $true
    $Worksheet.Rows.Item($Row).VerticalAlignment = -4160
}

function Get-LoginHint {
    param([object[]]$Values)
    $id = [string]$Values[0]
    $module = [string]$Values[3]
    $title = [string]$Values[4]
    $text = "$id $module $title"
    if ($id -eq 'F-MAIN-001') { return '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号。' }
    if ($id -match '^F-CANCEL') { return '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号（按撤销节点需要）。' }
    if ($id -match '^F-DISPATCH') { return '丸友集：工作室主账号；打手应用：多个打手子账号。' }
    if ($id -match '^F-MULTI') { return '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：一个或多个打手子账号。' }
    if ($id -match '^F-PRICE') { return '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号。' }
    if ($text -match '注册|应用开通') { return '租户平台：企业主账号；SaaS主站：主站管理员账号。' }
    if ($text -match '授权') { return '丸友集：企业主账号；丸掌柜：企业主账号。' }
    if ($text -match '推单|工作室') { return '丸掌柜：企业主账号；丸友集：工作室主账号。' }
    if ($text -match '订单创建|发单|抖音|手工录单') { return '丸掌柜：企业主账号；丸友集：工作室主账号。' }
    if ($text -match '撤销') { return '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号（按撤销节点需要）。' }
    if ($text -match '接单|分发|抢单|分配') { return '丸友集：工作室主账号；打手应用：打手子账号。' }
    if ($text -match '履约|验收|收入') { return '打手应用：打手子账号；丸友集：工作室主账号；丸掌柜：企业主账号。' }
    if ($text -match '成员|账号') { return '丸友集：企业主账号；租户平台/丸友集：客服或打手子账号。' }
    if ($text -match '结算|打款|支付') { return '支付中心/财务结算：丸掌柜主账号、丸友集主账号；打手应用：打手子账号；审核/财务账号（如有）。' }
    if ($text -match '处罚|追缴') { return '处罚/追缴：管理员或审核账号；责任方：打手账号或工作室账号。' }
    return '按用例步骤切换对应平台角色账号。'
}

function Normalize-TextRow {
    param([object[]]$Values)
    $normalized = @()
    foreach ($value in $Values) {
        $text = [string]$value
        $text = $text.Replace('settings.admin_username/settings.admin_password', '主站管理员账号/密码')
        $text = $text.Replace('certification_status=approved', '企业认证状态=已通过')
        $text = $text.Replace('wanyouji_status=opened', '丸友集应用状态=已开通')
        $text = $text.Replace('wanzhanggui_status=opened', '丸掌柜应用状态=已开通')
        $text = $text.Replace('latest_auth_key', '最新授权密钥')
        $text = $text.Replace('wanzhanggui_phone', '丸掌柜企业手机号')
        $text = $text.Replace('workshop_enterprise_name', '工作室企业名称')
        $text = $text.Replace('workshop_enterprise_names', '工作室企业名称列表')
        $text = $text.Replace('strategy_name', '策略名称')
        $text = $text.Replace('strategy_type', '策略类型')
        $text = $text.Replace('assignment_method', '分配方式')
        $text = $text.Replace('player_account', '打手账号')
        $text = $text.Replace('wanyouji_account', '丸友集主账号')
        $text = $text.Replace('wanzhanggui_account', '丸掌柜主账号')
        $text = $text.Replace('expected_amount', '预期收入金额')
        $text = $text.Replace('expected_scope', '预期可见范围')
        $text = $text.Replace('role_mode', '成员角色模式')
        $text = $text.Replace('member phone', '成员手机号')
        $text = $text.Replace('member role', '成员角色')
        $text = $text.Replace('auth_key', '授权密钥')
        $text = $text.Replace('phone', '手机号')
        $text = $text.Replace('password', '密码')
        $text = $text.Replace('status=dispatched', '状态=已派单')
        $text = $text.Replace('status=revoked', '状态=已撤销')
        $text = $text.Replace('status=task_player_accepted', '状态=打手已抢单')
        $text = $text.Replace('status=delivery_submitted', '状态=已提交验收')
        $text = $text.Replace('status=upstream_acceptance_applied', '状态=已申请上游验收')
        $text = $text.Replace('status=income_verified', '状态=收入已验证')
        $text = $text.Replace('status=task_accepted', '状态=工作室已接单')
        $text = $text.Replace('status=task_dispatched_to_player_hall', '状态=已发给打手')
        $text = $text.Replace('task_accepted', '工作室已接单')
        $text = $text.Replace('task_dispatched_to_player_hall', '已发给打手')
        $text = $text.Replace('task_player_accepted', '打手已抢单')
        $text = $text.Replace('delivery_submitted', '已提交验收')
        $text = $text.Replace('upstream_acceptance_applied', '已申请上游验收')
        $text = $text.Replace('upstream_completed', '上游已完结')
        $text = $text.Replace('income_verified', '收入已验证')
        $text = $text.Replace('dispatched', '已派单')
        $text = $text.Replace('revoked', '已撤销')
        $text = $text.Replace('填写来源单号来源单号', '填写来源单号')
        $text = $text.Replace('填写订单标题订单标题', '填写订单标题')
        $text = $text.Replace('来源单号=E2EORDER时间戳', '来源单号=自动生成')
        $text = $text.Replace('E2EORDER', '自动生成编号')
        $normalized += $text
    }
    return $normalized
}

$headers = @(
    '用例编号',
    '用例层级',
    '来源/组合依据',
    '所属模块',
    '用例标题',
    '登录平台/角色账号',
    '前置条件',
    '测试数据',
    '执行步骤',
    '预期结果',
    '跨端/状态断言',
    '可组合/被引用关系',
    '自动化状态',
    '备注'
)

$rows = @(
    @('A-SAAS-001','脚本原子用例','test_e2e_saas_001_enterprise_certification.py','企业准备','租户企业注册并由主站认证',
        '租户平台：待注册企业账号；SaaS主站：主站管理员账号。',
        '测试手机号可用；租户注册入口可访问；SaaS主站管理员账号可登录。',
        '手机号、企业名称、账号密码；主站管理员账号。',
        (Steps @(
            '打开租户平台登录/注册页。',
            '进入注册/企业入驻入口。',
            '填写手机号并获取短信验证码。',
            '填写企业名称、联系人、账号密码等企业注册信息。',
            '提交注册和认证资料。',
            '打开SaaS主站后台。',
            '使用主站管理员账号登录。',
            '进入企业认证/商户认证审核列表。',
            '按企业名称或手机号搜索新注册企业。',
            '打开认证详情并审核通过。',
            '回到租户平台，使用注册账号登录。',
            '进入企业信息/认证状态页，确认认证通过。'
        )),
        '企业注册成功；主站审核通过；租户端展示认证通过。',
        '企业名称、手机号、企业ID在租户端和主站一致；台账企业认证状态=已通过。',
        '被F-REG-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-SAAS-003','脚本原子用例','test_e2e_saas_003_wanyouji_app_opening.py','应用开通','已认证企业开通丸友集应用',
        '租户平台：已认证企业主账号；SaaS主站：主站管理员账号。',
        '企业已认证；租户账号可登录；主站管理员可审批应用。',
        '应用=丸友集；企业账号来自台账。',
        (Steps @(
            '登录租户平台已认证企业账号。',
            '进入后台/订阅购买/应用中心。',
            '找到丸友集应用卡片。',
            '点击申请开通/立即开通。',
            '确认提交开通申请。',
            '打开SaaS主站后台并登录管理员账号。',
            '进入应用开通/商户应用审核列表。',
            '搜索该企业的丸友集申请。',
            '打开申请详情并点击同意/审批通过。',
            '回到租户平台刷新应用中心。',
            '确认丸友集展示已开通或可进入。'
        )),
        '丸友集申请提交成功；主站审批通过；租户端丸友集入口可用。',
        '主站应用状态与租户端入口一致；台账丸友集应用状态=已开通。',
        '被F-REG-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-SAAS-004','脚本原子用例','test_e2e_saas_004_wanzhanggui_app_opening.py','应用开通','已认证企业开通丸掌柜应用',
        '租户平台：已认证企业主账号；SaaS主站：主站管理员账号。',
        '企业已认证；租户账号可登录；主站管理员可审批应用。',
        '应用=丸掌柜；企业账号来自台账。',
        (Steps @(
            '登录租户平台已认证企业账号。',
            '进入后台/订阅购买/应用中心。',
            '找到丸掌柜应用卡片。',
            '点击申请开通/立即开通。',
            '确认提交开通申请。',
            '打开SaaS主站后台并登录管理员账号。',
            '进入应用开通/商户应用审核列表。',
            '搜索该企业的丸掌柜申请。',
            '打开申请详情并点击同意/审批通过。',
            '回到租户平台刷新应用中心。',
            '确认丸掌柜展示已开通或可进入。'
        )),
        '丸掌柜申请提交成功；主站审批通过；租户端丸掌柜入口可用。',
        '主站应用状态与租户端入口一致；台账丸掌柜应用状态=已开通。',
        '被F-REG-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-AUTH-001','脚本原子用例','test_e2e_auth_001_authorization_closed_loop.py','授权绑定','丸友集生成授权密钥并由丸掌柜激活',
        '丸友集：丸友集企业主账号；丸掌柜：丸掌柜企业主账号。',
        '丸友集企业和丸掌柜企业均已开通；两个主账号可登录。',
        '丸友集账号；丸掌柜账号；授权密钥；权限至少包含创建订单。',
        (Steps @(
            '登录丸友集主账号。',
            '进入企业管理-授权管理-授权密钥。',
            '点击生成/新增授权密钥。',
            '按页面要求填写密钥名称、授权应用、有效期等字段。',
            '保存并复制授权密钥。',
            '退出后登录丸掌柜主账号。',
            '进入企业管理-授权管理-我的授权。',
            '点击激活密钥。',
            '粘贴丸友集授权密钥并提交激活。',
            '重新登录丸友集主账号。',
            '进入企业管理-授权管理-管理授权。',
            '打开该授权关系的权限配置。',
            '勾选或保存创建订单等授权权限。',
            '回到丸掌柜授权详情，确认已获得创建订单权限。'
        )),
        '授权密钥生成成功；丸掌柜激活成功；丸友集侧管理授权权限保存成功；丸掌柜具备创建订单能力。',
        '授权方、被授权方、密钥状态、权限项跨端一致；台账记录最新授权密钥。',
        '被F-CONFIG-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-PUSH-001','脚本原子用例','test_e2e_push_001_wanzhanggui_workshop_authorization.py','推单配置前置','丸掌柜新增丸友集工作室授权',
        '丸掌柜：丸掌柜企业主账号。',
        '丸掌柜已激活丸友集授权；丸友集账号尚未被该丸掌柜添加工作室授权。',
        '丸掌柜企业手机号；丸友集企业名称/工作室名称。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入商家管理或履约工作室平台。',
            '进入工作室管理。',
            '点击新增/添加工作室授权。',
            '选择已绑定的丸友集企业或授权关系。',
            '选择丸友集工作室。',
            '按页面要求补充授权范围、状态等字段。',
            '点击保存。',
            '返回工作室管理列表。',
            '搜索或查看新增工作室授权记录。',
            '确认授权状态为启用/可用。'
        )),
        '丸友集工作室授权添加成功；后续推单配置可选择该工作室。',
        '工作室名称、授权关系、状态在丸掌柜侧展示正确；台账workshop_authorized=true。',
        '被F-CONFIG-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-PUSH-003','脚本原子用例','test_e2e_push_003_dispatch_strategy.py','推单配置','丸掌柜新增推单配置策略',
        '丸掌柜：丸掌柜企业主账号。',
        '丸掌柜已添加足够数量的丸友集工作室授权；策略类型符合脚本参数。',
        '策略类型=单平台指定/多工作室同时分发/多平台分发；策略名称；工作室企业名称列表。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入履约工作室平台-推单配置。',
            '点击新增推单配置。',
            '填写策略名称。',
            '选择策略类型。',
            '单平台指定时选择1个已授权丸友集工作室。',
            '多工作室同时分发或多平台分发时选择多个已授权工作室。',
            '填写页面必填的推单范围、订单类型、状态等配置。',
            '点击保存。',
            '返回推单配置列表。',
            '搜索策略名称。',
            '确认策略名称、策略类型、绑定工作室展示正确。'
        )),
        '推单策略新增成功；策略可用；后续手工录单添加子单时能选择该策略。',
        '策略名称、策略类型、工作室列表与台账一致；台账dispatch_strategy_created。',
        '被F-CONFIG-001、F-MAIN-001、F-DISPATCH-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-ORDER-001','脚本原子用例','test_e2e_order_001_manual_order_dispatch_closed_loop.py','订单创建/发单','丸掌柜手工录单创建外来订单并发布到丸友集',
        '丸掌柜：丸掌柜企业主账号；丸友集：相关工作室主账号。',
        '丸掌柜已开通；已存在可用推单策略；相关丸友集账号可登录。',
        '来源单号=自动生成；订单标题；策略名称；策略类型。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入商家管理-订单管理。',
            '进入手工录单。',
            '点击新增订单。',
            '填写来源单号来源单号。',
            '填写订单标题订单标题。',
            '填写客户信息、游戏、区服、服务项目等主单必填字段。',
            '点击添加子单。',
            '在子单中选择推单策略名称。',
            '填写子单金额、数量、服务要求、备注等页面必填项。',
            '保存子单。',
            '提交/保存主单。',
            '登录丸友集相关主账号。',
            '进入工作室履约应用-抢单大厅。',
            '根据策略类型进入私单或公池单/私单范围。',
            '按来源单号或订单标题搜索订单。',
            '确认丸友集抢单大厅展示该外来订单。'
        )),
        '丸掌柜订单提交成功；丸友集抢单大厅可见该外来订单。',
        '来源单号、订单标题、策略名称、策略类型在丸掌柜和丸友集一致；台账订单状态=已派单。',
        '被F-MAIN-001、F-CANCEL-001、F-DISPATCH-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-ORDER-002','脚本原子用例','test_e2e_order_002_revoke_dispatch_closed_loop.py','撤销','丸掌柜撤销已派单订单并验证丸友集不可见',
        '丸掌柜：丸掌柜企业主账号；丸友集：相关工作室主账号。',
        '台账存在订单状态=已派单的订单；订单尚未被丸友集管理员接单。',
        '来源单号；订单标题；策略类型；预期可见范围。',
        (Steps @(
            '从台账选择一笔已派单订单。',
            '登录丸掌柜主账号。',
            '进入商家管理-订单管理。',
            '按来源单号或订单标题搜索订单。',
            '打开订单详情或列表操作区。',
            '点击撤销派单/撤销订单。',
            '按页面要求填写或确认撤销原因。',
            '提交撤销。',
            '刷新丸掌柜订单列表，确认订单进入撤销/关闭状态。',
            '登录丸友集相关账号。',
            '进入工作室履约应用-抢单大厅。',
            '进入预期范围：私单或公池单/私单。',
            '按来源单号或订单标题搜索。',
            '确认订单不可见或不可接。',
            '多工作室/多平台策略下逐个相关丸友集账号重复验证。'
        )),
        '撤销后丸友集抢单大厅不可见；订单不会继续进入打手履约链路。',
        '丸掌柜撤销状态与丸友集不可见状态一致；台账订单状态=已撤销。',
        '组合F-CANCEL-001=A-ORDER-001 -> A-ORDER-002','已自动化','来自现有脚本小用例'
    ),
    @('A-TASK-001','脚本原子用例','test_e2e_task_001_external_order_dispatch_to_player.py','接单/分发/打手抢单','丸友集接外部订单并发给打手，打手抢单',
        '丸友集：工作室主账号；打手应用：打手子账号。',
        '台账存在订单状态=已派单/工作室已接单/已发给打手的订单；丸友集主账号和打手账号可登录。',
        '来源单号；订单标题；分配方式=抢单大厅/指派打手/智能派单；打手账号。',
        (Steps @(
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '根据订单策略进入私单或公池单/私单。',
            '按来源单号或订单标题搜索外部订单。',
            '如果订单尚未接入，点击立即接单。',
            '确认订单进入工作室履约应用-订单列表。',
            '进入工作室履约应用-订单列表。',
            '按来源单号或订单标题搜索该订单。',
            '点击立即发单。',
            '选择或确认分配方式。',
            '填写发单价、服务时限、订单标题、交付要求等必填字段。',
            '提交发单。',
            '打手子账号通过短信验证码登录。',
            '进入打手应用-抢单大厅。',
            '按来源单号或订单标题搜索订单。',
            '点击立即抢单。',
            '进入打手应用-我的订单。',
            '确认订单出现在我的订单列表。'
        )),
        '丸友集管理员接外部订单成功；订单发到打手侧；打手抢单成功并进入我的订单。',
        '台账状态依次为工作室已接单、已发给打手、打手已抢单；订单号、标题、价格、打手信息一致。',
        '被F-MAIN-001、F-DISPATCH-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-DELIVERY-001','脚本原子用例','test_e2e_delivery_001_player_submit_acceptance.py','打手履约','打手提交验收，主账号查看待验收',
        '打手应用：打手子账号；丸友集：工作室主账号。',
        '台账存在订单状态=打手已抢单的订单；打手账号和丸友集主账号可登录。',
        '来源单号；订单标题；打手账号；丸友集主账号。',
        (Steps @(
            '打手子账号短信登录。',
            '进入打手应用-我的订单。',
            '按来源单号或订单标题搜索已接订单。',
            '打开订单详情。',
            '点击确认上号。',
            '按页面要求上传首图或履约凭证。',
            '填写成果说明或交付备注。',
            '点击提交验收。',
            '退出或切换账号，登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '按来源单号或订单标题搜索订单。',
            '确认订单状态为待验收或出现申请上游验收入口。'
        )),
        '打手提交验收成功；丸友集主账号能看到待验收/申请上游验收状态。',
        '台账订单状态=已提交验收；成果内容、提交人、提交时间可追踪。',
        '被F-MAIN-001、F-SETTLE-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-DELIVERY-002','脚本原子用例','test_e2e_delivery_002_upstream_acceptance_settlement.py','验收/结算/收入','申请上游验收、丸掌柜完结主单、打手收入验证',
        '丸友集：工作室主账号；丸掌柜：丸掌柜企业主账号；打手应用：打手子账号。',
        '台账存在订单状态=已提交验收或已申请上游验收的订单。',
        '来源单号；订单标题；丸友集主账号；丸掌柜主账号；打手账号；预期收入金额。',
        (Steps @(
            '登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '按来源单号或订单标题搜索已提交验收的订单。',
            '点击申请上游验收。',
            '退出并登录丸掌柜主账号。',
            '进入商家管理-订单管理或订单验收入口。',
            '按来源单号或订单标题搜索同一订单。',
            '打开订单详情。',
            '执行完结主单/验收通过。',
            '确认页面没有未完成子单提示。',
            '重新登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '搜索订单并确认状态为已完成或结算中。',
            '打手子账号短信登录。',
            '进入打手应用-我的收入。',
            '按订单号或标题查找收入记录。',
            '核对预期收入金额或页面实际金额。'
        )),
        '上游验收申请成功；丸掌柜主单完结；丸友集订单完成或结算中；打手收入可见。',
        '台账状态依次为已申请上游验收、上游已完结、收入已验证；三端订单号、金额、状态一致。',
        '被F-MAIN-001、F-SETTLE-001引用','已自动化','来自现有脚本小用例'
    ),
    @('A-MEMBER-001','脚本原子用例','test_e2e_member_001_enterprise_member_invitation.py','成员/账号','丸友集邀请客服/打手子成员并验证登录权限',
        '丸友集企业主账号可登录；企业管理-成员管理可访问；测试手机号可用。',
        '丸友集：企业主账号；租户平台/丸友集：客服或打手子账号。',
        '成员角色模式=全部/客服/打手；成员手机号；成员角色。',
        (Steps @(
            '登录丸友集主账号。',
            '进入企业管理-成员管理。',
            '点击新增成员/邀请成员。',
            '选择成员角色：客服或打手。',
            '填写成员手机号、姓名等字段。',
            '生成邀请链接或提交邀请。',
            '通过邀请链接完成成员注册或加入企业。',
            '主账号在成员管理中确认成员加入。',
            '子成员使用短信验证码登录租户平台。',
            '在账号选择页选择子账号身份。',
            '进入丸友集应用。',
            '打手角色进入打手应用，确认可见抢单大厅、我的订单、我的收入。',
            '客服角色进入收单应用或客服相关菜单。',
            '尝试访问企业管理/授权配置等越权入口，确认不可见或不可操作。'
        )),
        '客服/打手子成员可加入企业并登录；菜单权限符合角色。',
        '台账新增member account；角色、手机号、企业归属一致。',
        '被F-ACCOUNT-001、F-MAIN-001引用','已自动化','来自现有脚本小用例'
    ),
    @('B-SOURCE-DOUYIN-001','分支小用例','替代A-ORDER-001','订单来源','抖音录单创建外来订单并发布到丸友集',
        '已完成授权、工作室授权、推单策略；抖音店铺/抖音录单入口可用。',
        '抖音订单号；来源单号；订单标题；strategy_name。',
        (Steps @(
            '登录丸掌柜具备抖音录单权限的账号。',
            '进入商家管理-订单管理。',
            '进入抖音录单或抖音订单入口。',
            '创建或同步一笔抖音来源订单。',
            '记录抖音订单号和丸掌柜来源单号。',
            '打开订单详情，确认来源标识为抖音。',
            '点击添加子单。',
            '选择已启用推单策略。',
            '填写子单金额、数量、服务项目、交付要求。',
            '保存并发布订单。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '按抖音订单号、来源单号或订单标题搜索。',
            '确认订单可见且来源标识保留。'
        )),
        '抖音来源订单正向可替代手工录单进入后续接单、发打手、履约、验收链路。',
        '抖音订单号、丸掌柜来源单号、丸友集订单映射一致；撤销回传规则另测。',
        '组合F-SOURCE-001=B-SOURCE-DOUYIN-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002','待自动化','分支小用例'
    ),
    @('B-CANCEL-002','分支小用例','插入A-TASK-001中：接外部订单之后、立即发单之前','撤销','丸友集已接外部订单但未发给打手时撤销',
        '订单已由丸友集主账号接入工作室订单列表；尚未点击立即发单。',
        '来源单号；订单标题；task_accepted状态订单。',
        (Steps @(
            '先执行用例A-ORDER-001，生成已派单订单。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '搜索该外部订单并点击立即接单。',
            '进入工作室履约应用-订单列表。',
            '按来源单号或订单标题搜索订单。',
            '确认订单已进入订单列表且尚未发给打手。',
            '在订单详情或列表操作区查找撤销/关闭/拒绝入口。',
            '如丸友集侧无入口，则登录丸掌柜进入商家管理-订单管理发起撤销。',
            '填写撤销原因并提交。',
            '打手账号进入打手应用-抢单大厅。',
            '搜索同一订单并确认不可见。',
            '丸掌柜订单详情回查主单/子单撤销状态。'
        )),
        '工作室已接但未发给打手的订单撤销后，不得继续流入打手侧。',
        'task_accepted节点撤销后，打手侧无订单，丸掌柜和丸友集状态一致。',
        '组合F-CANCEL-002=A-ORDER-001 -> A-TASK-001前半段 -> B-CANCEL-002','待自动化','分支小用例'
    ),
    @('B-CANCEL-003','分支小用例','插入A-TASK-001之后、A-DELIVERY-001之前','撤销','打手已抢单未提交验收时撤销',
        '订单已发给打手且打手已抢单；尚未提交验收。',
        '来源单号；订单标题；player_account。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '再执行用例A-TASK-001，直到打手抢单成功。',
            '打手进入打手应用-我的订单。',
            '搜索订单并确认状态为待履约/进行中。',
            '不要点击确认上号或提交验收。',
            '登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '搜索该订单。',
            '从订单详情发起撤销/终止履约。',
            '填写撤销原因并提交。',
            '打手刷新我的订单。',
            '确认订单关闭或不可继续提交验收。',
            '进入打手应用-我的收入，确认无该订单收入。',
            '丸掌柜进入商家管理-订单管理回查子单状态。'
        )),
        '打手已接单未履约时撤销，不生成收入，不允许继续验收。',
        '打手我的订单、丸友集订单列表、丸掌柜子单状态一致。',
        '组合F-CANCEL-003=A-ORDER-001 -> A-TASK-001 -> B-CANCEL-003','待自动化','分支小用例'
    ),
    @('B-CANCEL-004','分支小用例','插入A-DELIVERY-001之后、A-DELIVERY-002之前','撤销','打手已提交验收但未申请上游验收时驳回/撤销',
        '订单已提交验收；丸友集主账号尚未申请上游验收。',
        '来源单号；订单标题；提交成果。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '再执行用例A-TASK-001。',
            '再执行用例A-DELIVERY-001，直到打手提交验收。',
            '登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '搜索该订单。',
            '打开订单详情，查看打手提交的上号/首图/成果内容。',
            '不要点击申请上游验收。',
            '点击驳回成果、撤销订单或关闭订单。',
            '填写驳回/撤销原因。',
            '打手登录打手应用-我的订单。',
            '查看驳回或撤销原因。',
            '若为驳回，重新提交验收。',
            '若为撤销，确认不可继续提交。',
            '打手应用-我的收入确认无收入。'
        )),
        '提交验收后异常处理清晰，驳回不结算，撤销不继续流转。',
        '成果内容、驳回原因、订单状态在主账号和打手侧一致。',
        '组合F-CANCEL-004=A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> B-CANCEL-004','待自动化','分支小用例'
    ),
    @('B-CANCEL-005','分支小用例','插入A-DELIVERY-002中：申请上游验收之后、丸掌柜完结之前','撤销','已申请上游验收但丸掌柜未完结时驳回',
        '订单已申请上游验收；丸掌柜尚未完结主单。',
        '来源单号；订单标题；upstream_acceptance_applied状态订单。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '再执行用例A-TASK-001。',
            '再执行用例A-DELIVERY-001。',
            '执行用例A-DELIVERY-002的前半段：丸友集主账号进入工作室履约应用-订单列表并点击申请上游验收。',
            '登录丸掌柜主账号。',
            '进入商家管理-订单管理。',
            '进入待验收/待完结订单入口。',
            '按来源单号或订单标题搜索订单。',
            '打开订单详情并查看丸友集提交成果。',
            '点击验收驳回/不通过。',
            '填写驳回原因并提交。',
            '丸友集主账号回到工作室履约应用-订单列表查看状态回写。',
            '打手进入打手应用-我的订单查看原因。',
            '打手应用-我的收入确认未生成收入。'
        )),
        '上游验收被驳回时状态回写丸友集和打手，不产生收入。',
        '丸掌柜驳回原因、丸友集订单状态、打手订单状态一致。',
        '组合F-CANCEL-005=A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002前半段 -> B-CANCEL-005','待自动化','分支小用例'
    ),
    @('B-MULTI-001','分支小用例','替代A-ORDER-001','主子单','一主两子一次发出',
        '手工录单页面支持一个主单添加多个子单；推单策略可用。',
        '主单1个；子单1、子单2；策略可相同或不同。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入商家管理-订单管理。',
            '进入手工录单。',
            '点击新增订单。',
            '填写主单基础信息。',
            '点击添加子单。',
            '创建子单1，选择策略A，填写金额、数量、服务项目并保存。',
            '再次点击添加子单。',
            '创建子单2，选择策略A或策略B，填写金额、数量、服务项目并保存。',
            '回到主单页面确认子单列表有2条记录。',
            '核对主单金额与两个子单金额汇总。',
            '保存并发布主单。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '按主单号或标题搜索。',
            '确认两个子单均可识别，或主单可展开看到两个子单。'
        )),
        '一主两子均可进入丸友集，子单状态独立。',
        '主单号相同、子单号不同；子单金额和策略独立。',
        '组合F-MULTI-001=B-MULTI-001 -> A-TASK-001按子单执行 -> A-DELIVERY-001/002按子单执行','待自动化','分支小用例'
    ),
    @('B-MULTI-002','分支小用例','插入A-DELIVERY-002之后','主子单','第1子单完成后续发第2子单',
        '系统支持主单完成部分子单后追加/续发子单。',
        '主单；已完成子单1；待追加子单2。',
        (Steps @(
            '先执行用例A-ORDER-001、A-TASK-001、A-DELIVERY-001、A-DELIVERY-002，完成子单1并验证收入。',
            '登录丸掌柜主账号。',
            '进入商家管理-订单管理。',
            '搜索已完成子单1所在主单。',
            '打开主单详情。',
            '确认子单1状态为已完成/已结算。',
            '点击追加子单/添加子单/续发子单。',
            '填写子单2服务项目、金额、数量、策略、交付要求。',
            '保存并发布子单2。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '搜索主单号或子单2标题。',
            '对子单2继续执行接单、发打手、提交验收、上游验收、收入验证。',
            '回到丸掌柜主单详情，检查主单最终状态和两个子单状态。'
        )),
        '第1子单完成不影响续发第2子单；主单最终按全部子单汇总。',
        '子单1收入不被影响；子单2生成独立履约和收入记录。',
        '组合F-MULTI-002=A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001/002 -> B-MULTI-002','待自动化','分支小用例'
    ),
    @('B-DISPATCH-ASSIGN-001','分支小用例','替换A-TASK-001中的立即发单分配方式','分配方式','指派打手',
        '订单已进入工作室履约应用-订单列表；目标打手可用。',
        '来源单号；订单标题；指定打手账号。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅。',
            '接入外部订单。',
            '进入工作室履约应用-订单列表。',
            '搜索订单。',
            '点击立即发单。',
            '选择分配方式为指派打手。',
            '在打手选择框中选择目标打手。',
            '填写发单价、服务时限、交付要求。',
            '提交发单。',
            '目标打手登录打手应用。',
            '进入打手应用-我的订单，确认订单出现。',
            '非目标打手登录打手应用-抢单大厅搜索同一订单。',
            '确认非目标打手不可见或不可操作。'
        )),
        '只有被指派打手能处理订单。',
        '指派打手、订单号、订单状态在管理员和打手侧一致。',
        '组合F-DISPATCH-001的指派分支','待自动化','分支小用例'
    ),
    @('B-DISPATCH-AUTO-001','分支小用例','替换A-TASK-001中的立即发单分配方式','分配方式','智能派单',
        '订单已进入工作室履约应用-订单列表；智能派单规则已配置。',
        '来源单号；订单标题；候选打手。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '登录丸友集主账号。',
            '进入工作室履约应用-抢单大厅并接入外部订单。',
            '进入工作室履约应用-订单列表。',
            '搜索订单。',
            '点击立即发单。',
            '选择分配方式为智能派单。',
            '填写发单价、服务时限、订单标题。',
            '提交派单。',
            '查看页面是否展示派单成功或命中打手。',
            '命中打手登录打手应用-我的订单。',
            '确认订单出现。',
            '未命中打手登录打手应用。',
            '确认不可处理该订单。',
            '如派单失败，记录失败提示和候选规则。'
        )),
        '智能派单命中正确打手或给出明确失败提示。',
        '派单方式、命中打手、订单状态、失败提示可追踪。',
        '组合F-DISPATCH-001的智能派单分支','待自动化','分支小用例'
    ),
    @('B-PRICE-PERCENT-001','分支小用例','替换A-PUSH-003/A-ORDER-001中的价格配置','价格模式','百分比发单价',
        '发单设置或推单配置支持百分比价格；主单金额可控。',
        '主单金额样本A/B；百分比；保底/封顶/小数规则。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入履约工作室平台-推单配置或发单设置。',
            '新增百分比发单价策略。',
            '填写百分比、最低发单价、最大发单价、小数规则。',
            '保存策略。',
            '进入商家管理-订单管理-手工录单。',
            '创建主单金额为样本A的订单。',
            '添加子单并选择百分比策略。',
            '保存子单后核对系统计算出的发单价。',
            '发布订单并完成接单、打手履约、上游验收、收入验证。',
            '创建主单金额为样本B的订单。',
            '重复选择同一百分比策略。',
            '核对样本B计算价与公式一致。',
            '记录小数、保底、封顶触发规则。'
        )),
        '百分比计算正确，并贯穿订单展示、结算、收入。',
        '主单金额、百分比、计算价、收入金额可追踪。',
        '组合F-PRICE-001=B-PRICE-PERCENT-001 -> A-TASK-001 -> A-DELIVERY-001/002','待自动化','分支小用例'
    ),
    @('B-PRICE-SKU-001','分支小用例','替换A-PUSH-003/A-ORDER-001中的价格配置','价格模式','SKU报价',
        'SKU报价表可配置；订单可选择或携带SKU。',
        'SKU-A、SKU-B、未配置SKU-C；数量样本。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入SKU报价或发单价格配置入口。',
            '配置SKU-A报价。',
            '配置SKU-B报价。',
            '进入商家管理-订单管理-手工录单。',
            '创建包含SKU-A的订单。',
            '添加子单并选择SKU报价模式。',
            '保存子单，核对命中SKU-A报价。',
            '创建SKU-A数量为2的订单，核对单价乘数量或固定价规则。',
            '创建同时包含SKU-A和SKU-B的订单，核对累加、拆单或拦截规则。',
            '创建未配置SKU-C的订单。',
            '尝试保存或发布。',
            '观察系统是拦截、提示补报价，还是使用默认价。',
            '对可发布订单完成履约到收入。',
            '核对SKU价格和收入一致。'
        )),
        'SKU报价命中、数量、组合SKU、未命中处理明确。',
        'SKU编码/名称、数量、报价、子单价、收入金额一致。',
        '组合F-PRICE-002=B-PRICE-SKU-001 -> A-TASK-001 -> A-DELIVERY-001/002','待自动化','分支小用例'
    ),
    @('B-PENALTY-001','分支小用例','插入A-DELIVERY-002之后','处罚追缴','已完成子单处罚追缴',
        '订单已完结且打手收入已验证。',
        '已完成子单；责任方；处罚金额；处罚原因。',
        (Steps @(
            '先执行用例F-MAIN-001或A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002。',
            '记录已完成订单的来源单号、订单标题、子单号、收入金额。',
            '登录有处罚权限的管理员账号。',
            '进入处罚/追缴入口，或从订单详情进入处罚操作。',
            '选择目标订单和子单。',
            '选择责任方：打手或工作室。',
            '填写处罚原因、处罚金额、凭证或备注。',
            '提交处罚申请。',
            '如存在审核流，登录审核账号。',
            '进入处罚审核列表。',
            '审核通过处罚申请。',
            '责任方账号进入我的收入或账户流水。',
            '确认出现扣减/追缴记录。',
            '主站或财务页面查看处罚记录。'
        )),
        '已完成子单可按规则追缴，原订单终态保留，追加流水。',
        '处罚单号、订单号、责任方、金额、流水在各端一致。',
        '组合F-PENALTY-001=F-MAIN-001 -> B-PENALTY-001','待自动化','分支小用例'
    ),
    @('B-PENALTY-002','分支小用例','插入任一撤销完成流程之后','处罚追缴','撤销完成子单处罚追缴',
        '子单已撤销完成；处罚入口或拦截规则待确认。',
        '撤销完成子单；责任方；处罚原因。',
        (Steps @(
            '先执行任一撤销流程，例如F-CANCEL-001、F-CANCEL-002或F-CANCEL-003。',
            '记录撤销完成子单号、撤销节点、责任方。',
            '登录有处罚权限的管理员账号。',
            '打开该撤销完成子单详情。',
            '查找处罚/追缴入口。',
            '如入口可用，选择责任方并填写金额、原因、凭证。',
            '提交处罚申请。',
            '如入口不可用，记录页面拦截提示。',
            '如存在审核流，执行审核通过或拒绝。',
            '责任方账号查看收入/流水/处罚记录。',
            '再次尝试对同一子单同一原因发起处罚。',
            '确认重复处罚被限制，或二次处罚有独立审批记录。'
        )),
        '撤销完成子单允许追缴或明确拦截；不得重复扣款。',
        '撤销状态、处罚状态、责任方、金额、流水一致。',
        '组合F-PENALTY-002=任一F-CANCEL流程 -> B-PENALTY-002','待自动化','分支小用例'
    ),
    @('B-SETTLE-PAYCENTER-001','分支小用例','插入B-SETTLE-CONFIG-001前','支付中心配置','支付中心配置交易应用、交易通道和账号配置',
        '丸友集、丸掌柜主账号可登录；账号具备支付中心配置权限；交易应用、交易通道、账号配置资料已准备。',
        '应用名称、应用编码、回调地址、通道编码、通道名称、业务类型、支付方式、账号编码、账号名称、支付应用ID、密钥、证书配置。',
        (Steps @(
            '登录丸友集或丸掌柜主账号。',
            '进入丸游管理后台。',
            '切换到需要配置的应用入口，例如丸友集或丸掌柜。',
            '在左侧菜单展开支付中心。',
            '进入支付中心-交易应用。',
            '点击新增或编辑目标交易应用。',
            '填写应用名称、应用编码、回调地址和状态。',
            '保存交易应用配置。',
            '回到交易应用列表，按应用编码查询并确认状态为启用。',
            '进入支付中心-交易通道。',
            '点击创建或编辑目标交易通道。',
            '选择刚配置的交易应用。',
            '填写通道编码、通道名称、业务类型、支付方式、排序和状态。',
            '保存交易通道配置。',
            '回到交易通道列表，按通道编码查询并确认状态为启用。',
            '进入支付中心-账号配置。',
            '点击新增或编辑支付应用配置。',
            '填写编码、名称、显示名称、账号名称、账号号、支付方式、支付应用ID。',
            '填写支付宝支付配置、接口密钥、公钥、应用公钥证书、支付宝公钥证书、支付宝根证书等页面要求字段。',
            '保存账号配置。',
            '回到账号配置列表，按编码或名称查询并确认配置可用。',
            '如丸友集和丸掌柜需要分别配置，切换应用后重复交易应用、交易通道、账号配置三段配置。',
            '确认支付中心三类配置完成后，再执行B-SETTLE-CONFIG-001。'
        )),
        '支付中心交易应用、交易通道、账号配置均已保存并启用；后续商家结算信息配置具备支付基础资料。',
        '交易应用、交易通道、账号配置三处列表状态均为启用；应用编码、通道编码、账号配置与后续结算配置引用一致。',
        'B-SETTLE-CONFIG-001前置；被F-SETTLE-CONFIG-001引用','待自动化','根据用户补充新增：丸友集/丸掌柜结算前需先做支付中心基础配置'
    ),
    @('B-SETTLE-CONFIG-001','分支小用例','B-SETTLE-PAYCENTER-001之后；插入打款/结算流程前','结算配置','丸掌柜、丸友集完善商户打款配置',
        '已完成B-SETTLE-PAYCENTER-001；丸掌柜、丸友集主账号可登录；支付中心可访问；商户支付信息资料已准备。',
        '商户名称、商户号、开户主体、银行卡/对公账户、支付渠道、结算方式、联系人信息。',
        (Steps @(
            '先执行用例B-SETTLE-PAYCENTER-001，完成支付中心-交易应用、交易通道、账号配置。',
            '登录丸掌柜主账号。',
            '进入支付中心。',
            '进入商户支付信息/商户打款配置页面。',
            '搜索当前丸掌柜商户。',
            '检查是否已完善商户支付信息。',
            '如已完善，记录当前配置状态并跳过新增。',
            '如未完善，点击新增/编辑商户支付信息。',
            '填写商户号、开户主体、开户行、银行卡或对公账户、支付渠道、联系人等必填项。',
            '保存配置。',
            '刷新页面并确认配置状态为已完善/启用。',
            '登录丸友集主账号。',
            '进入支付中心。',
            '进入商户支付信息/商户打款配置页面。',
            '按同样方式检查并完善丸友集商户支付信息。',
            '分别回到丸掌柜和丸友集结算相关页面，确认结算/打款入口不再提示缺少商户支付配置。'
        )),
        '丸掌柜、丸友集商户支付信息均已完善；已完善时流程可跳过；未完善时保存后状态可用。',
        '支付中心基础配置、商户主体、商户号、账户信息与结算页面前置校验一致。',
        '依赖B-SETTLE-PAYCENTER-001；组合F-SETTLE-PAY-001、F-SETTLE-PAY-002前置','待自动化','新增结算/打款小用例'
    ),
    @('B-SETTLE-PLAYER-ACCOUNT-001','分支小用例','插入打手一键结算前','结算配置','完善打手打款账户信息',
        '打手账号可登录；打手应用-我的收入可访问；打款账户资料已准备。',
        '打手姓名、手机号、收款账户、开户行/支付账号、身份证或页面要求资料。',
        (Steps @(
            '打手子账号短信登录。',
            '进入打手应用。',
            '进入打手应用-我的收入。',
            '查找打款账户、收款账户、结算账户或账户设置入口。',
            '检查打款账户信息是否已完善。',
            '如已完善，记录账户状态并跳过编辑。',
            '如未完善，点击完善/新增打款账户。',
            '填写收款人姓名、手机号、银行卡号或支付账号、开户行等页面必填项。',
            '如页面要求上传身份资料或绑定验证码，按页面提示完成。',
            '保存打款账户。',
            '返回打手应用-我的收入。',
            '确认账户状态为已完善/可结算。',
            '尝试点击一键结算入口，确认不再因账户未完善被拦截。'
        )),
        '打手打款账户已完善；已完善时可跳过；未完善保存后可进入一键结算。',
        '打手账户状态与一键结算前置校验一致；账户信息不为空且保存后刷新不丢失。',
        '组合F-SETTLE-PAY-001前置','待自动化','新增结算/打款小用例'
    ),
    @('B-SETTLE-PLAYER-APPLY-001','分支小用例','插入A-DELIVERY-002之后','打手结算','打手在我的收入中对已完成订单一键结算',
        '订单已完结并产生打手收入；打手打款账户已完善。',
        '来源单号、订单标题、打手账号、可结算收入金额。',
        (Steps @(
            '先执行用例F-MAIN-001，完成订单履约、上游验收和收入验证。',
            '先执行用例B-SETTLE-PLAYER-ACCOUNT-001，确认打手打款账户已完善。',
            '打手子账号登录。',
            '进入打手应用-我的收入。',
            '按来源单号或订单标题搜索已完成订单收入。',
            '确认收入状态为可结算/待结算。',
            '勾选该订单收入记录，或进入收入详情。',
            '点击一键结算。',
            '确认结算金额、订单数、收款账户信息。',
            '提交一键结算申请。',
            '刷新我的收入页面。',
            '确认收入状态变为结算中/待审核/已申请结算。',
            '记录生成的结算申请号或账单号。',
            '登录丸友集主账号。',
            '进入工作室基础应用-财务结算列表。',
            '进入员工结算汇总。',
            '按来源单号、订单标题、打手账号或结算申请号搜索记录。',
            '点击目标汇总记录的详细/详情/查看。',
            '在员工结算汇总详情中确认打手账号、来源单号/订单标题、结算金额、收款账户和结算状态。'
        )),
        '打手可对已完成订单收入发起一键结算；提交后在工作室基础应用-财务结算列表生成待处理打手结算申请或账单。',
        '收入金额、来源单号、订单标题、收款账户、结算申请号一致；财务结算列表-员工结算汇总-详情可查看同一笔打手结算记录；重复点击一键结算应被拦截或提示已申请。说明：丸友集与打手之间的打款看工作室基础应用-财务结算列表，丸友集与丸掌柜之间的打款看结算中心。',
        '组合F-SETTLE-PAY-001=F-MAIN-001 -> B-SETTLE-PLAYER-ACCOUNT-001 -> B-SETTLE-PLAYER-APPLY-001 -> B-SETTLE-WANYOUJI-PAY-001','待自动化','新增结算/打款小用例'
    ),
    @('B-SETTLE-L1L2-AUDIT-001','分支小用例','插入A-DELIVERY-001之后','1级-2级结算前置','丸友集审核打手完成的子单并确认可结算',
        '打手已完成子单并提交验收；丸友集主账号可进入工作室订单列表或打手订单审核入口。',
        '来源单号、订单标题、子单号、打手账号、打手提交成果。',
        (Steps @(
            '先执行用例A-ORDER-001，创建外来订单。',
            '先执行用例A-TASK-001，丸友集接外部订单并发给打手，打手抢单。',
            '先执行用例A-DELIVERY-001，打手完成子单并提交验收。',
            '登录丸友集主账号。',
            '进入工作室履约应用-订单列表。',
            '按来源单号或订单标题搜索订单。',
            '打开子单详情或打手提交成果详情。',
            '核对打手提交的上号、首图、成果说明等履约内容。',
            '点击审核通过/确认完成/验收通过。',
            '如页面要求填写审核备注，填写审核通过说明。',
            '提交审核结果。',
            '刷新工作室订单列表。',
            '确认该子单在丸友集侧状态为已完成/待结算/可结算。',
            '打手账号进入打手应用-我的收入。',
            '确认该子单收入记录出现，并处于可结算/待结算状态。'
        )),
        '打手完成子单后，经丸友集审核通过，即满足1级-2级结算前置；无需等待丸掌柜上级验收即可进入打手结算流程。',
        '子单号、打手账号、审核状态、可结算收入在丸友集主账号和打手账号侧一致。',
        '组合F-SETTLE-L1L2-001前置；体现打手与丸友集之间的直接结算关系','待自动化','新增1级-2级结算需求'
    ),
    @('B-SETTLE-WANYOUJI-PAY-001','分支小用例','插入打手一键结算之后','丸友集给打手打款','丸友集审核处理打手账单并给打手打款',
        '打手已提交一键结算申请；丸友集主账号可进入财务结算列表；商户支付配置可用。',
        '结算申请号/账单号、打手账号、结算金额、来源单号、订单标题。',
        (Steps @(
            '先执行用例B-SETTLE-PLAYER-APPLY-001，生成打手结算申请。',
            '登录丸友集主账号。',
            '进入工作室基础应用。',
            '进入工作室基础应用-财务结算列表。',
            '按打手账号、结算申请号、来源单号或订单标题搜索记录。',
            '确认待处理的打手结算记录存在。',
            '点击员工结算汇总。',
            '确认汇总中包含目标打手、订单数量、结算金额。',
            '生成或保存员工结算汇总。',
            '进入结算账单列表。',
            '按账单号、打手账号或结算金额搜索账单。',
            '勾选目标结算账单。',
            '点击批量审核。',
            '选择审核通过。',
            '确认打款账户和打款金额。',
            '提交打款。',
            '刷新结算账单列表。',
            '确认账单状态变为已审核/打款中/打款完成。',
            '打手账号进入打手应用-我的收入，确认该笔收入状态变为已结算/已打款。'
        )),
        '丸友集可对打手结算申请生成员工结算汇总，并在结算账单列表批量审核打款；打手侧收入状态同步更新。',
        '员工结算汇总金额、结算账单金额、打手我的收入金额一致；打款账号和责任方一致。',
        '组合F-SETTLE-L1L2-001核心步骤；1级-2级直接结算','待自动化','新增1级-2级结算需求'
    ),
    @('B-SETTLE-WANYOUJI-REJECT-001','分支小用例','替代B-SETTLE-WANYOUJI-PAY-001审核通过步骤','丸友集给打手打款逆向','丸友集驳回打手结算账单',
        '打手已提交一键结算申请；丸友集结算账单处于待审核。',
        '结算申请号/账单号、驳回原因。',
        (Steps @(
            '先执行用例B-SETTLE-PLAYER-APPLY-001，生成待审核打手结算账单。',
            '登录丸友集主账号。',
            '进入工作室基础应用-财务结算列表。',
            '进入结算账单列表。',
            '搜索目标结算账单。',
            '打开账单详情。',
            '点击审核。',
            '选择驳回/审核不通过。',
            '填写驳回原因。',
            '提交驳回。',
            '刷新结算账单列表，确认账单状态为已驳回/审核不通过。',
            '打手账号进入打手应用-我的收入。',
            '查看该订单收入状态和驳回原因。',
            '确认收入可重新发起结算或按规则保持驳回状态。'
        )),
        '丸友集驳回打手结算账单后，不发生打款；打手侧可看到驳回状态和原因。',
        '驳回原因、账单状态、打手收入状态一致；无打款流水生成。',
        '组合F-SETTLE-REJECT-001逆向流程','待自动化','新增结算/打款小用例'
    ),
    @('B-SETTLE-PLAYER-ACCOUNT-REJECT-001','分支小用例','插入B-SETTLE-PLAYER-ACCOUNT-001','打手打款账户逆向','打手打款账户未完善或审核不通过时一键结算拦截',
        '打手账号可登录；打手应用-我的收入可访问；打款账户未完善或资料审核不通过。',
        '打手账号、未完善账户资料、审核不通过原因。',
        (Steps @(
            '打手子账号登录。',
            '进入打手应用-我的收入。',
            '进入打款账户/收款账户设置。',
            '清空必填账户信息或使用审核不通过的账户资料。',
            '保存账户信息。',
            '如页面存在账户审核流程，使用审核账号将账户资料审核不通过。',
            '回到打手应用-我的收入。',
            '选择一笔已完成且可结算的收入。',
            '点击一键结算。',
            '观察系统提示。',
            '确认系统拦截结算申请，并提示需完善打款账户或账户审核未通过。',
            '完善正确账户信息并重新保存。',
            '再次点击一键结算，确认可进入结算确认页。'
        )),
        '打手账户未完善或审核不通过时不能发起一键结算；完善后才可继续。',
        '账户状态、一键结算拦截提示、后续可结算状态一致。',
        '组合F-SETTLE-REJECT-003逆向流程','待自动化','新增结算/打款逆向小用例'
    ),
    @('B-SETTLE-CONFIG-REJECT-001','分支小用例','插入B-SETTLE-CONFIG-001','商户打款配置逆向','商户支付信息缺失或审核不通过时打款拦截',
        '丸掌柜或丸友集支付中心商户支付信息未完善、停用或审核不通过。',
        '商户主体、商户号、缺失字段或驳回原因。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入支付中心-商户支付信息/商户打款配置。',
            '选择当前丸掌柜商户。',
            '将商户支付信息置为未完善、停用或审核不通过状态。',
            '进入丸掌柜-财务结算/工作室结算/供应商结算入口。',
            '选择一笔待给丸友集打款的结算账单。',
            '尝试审核通过并提交打款。',
            '确认系统拦截并提示商户支付信息缺失、停用或审核不通过。',
            '登录丸友集主账号。',
            '进入支付中心-商户支付信息/商户打款配置。',
            '将丸友集商户支付信息置为未完善、停用或审核不通过状态。',
            '进入丸友集-工作室基础应用-结算账单列表。',
            '选择一笔待给打手打款的结算账单。',
            '尝试审核通过并提交打款。',
            '确认系统拦截并提示商户支付信息不可用。',
            '恢复商户支付配置后重新提交，确认可继续。'
        )),
        '商户支付信息缺失、停用或审核不通过时，丸掌柜给丸友集、丸友集给打手的打款都应被拦截。',
        '支付中心配置状态与财务结算打款前置校验一致；无误生成打款流水。',
        '组合F-SETTLE-REJECT-004逆向流程','待自动化','新增结算/打款逆向小用例'
    ),
    @('B-SETTLE-EMP-SUMMARY-REJECT-001','分支小用例','插入B-SETTLE-WANYOUJI-PAY-001员工结算汇总步骤','丸友集给打手打款逆向','员工结算汇总异常或驳回',
        '打手已提交一键结算申请；丸友集主账号可进入财务结算列表。',
        '打手账号、结算申请号、异常原因：金额不一致/订单缺失/账户异常。',
        (Steps @(
            '先执行用例B-SETTLE-PLAYER-APPLY-001，生成打手结算申请。',
            '登录丸友集主账号。',
            '进入工作室基础应用-财务结算列表。',
            '按打手账号或结算申请号搜索记录。',
            '点击员工结算汇总。',
            '人为构造或选择异常记录，例如金额不一致、订单缺失、打手账户异常。',
            '尝试生成员工结算汇总。',
            '如页面支持审核汇总，选择驳回或不通过。',
            '填写驳回原因。',
            '提交处理结果。',
            '刷新财务结算列表。',
            '确认该记录状态为汇总失败/已驳回/待打手处理。',
            '打手进入打手应用-我的收入。',
            '确认收入未进入已打款状态，并可看到异常提示或仍为待处理状态。'
        )),
        '员工结算汇总异常时不能进入结算账单打款；驳回或失败原因可追踪。',
        '财务结算列表状态、员工汇总状态、打手收入状态一致；无打款流水。',
        '组合F-SETTLE-REJECT-005逆向流程','待自动化','新增结算/打款逆向小用例'
    ),
    @('B-SETTLE-BATCH-AUDIT-PARTIAL-REJECT-001','分支小用例','插入B-SETTLE-WANYOUJI-PAY-001批量审核步骤','丸友集给打手打款逆向','结算账单批量审核部分通过部分驳回',
        '结算账单列表存在多笔待审核打手账单；至少一笔正常、一笔异常。',
        '账单A正常；账单B异常；批量审核原因。',
        (Steps @(
            '登录丸友集主账号。',
            '进入工作室基础应用-结算账单列表。',
            '筛选待审核账单。',
            '勾选账单A和账单B。',
            '点击批量审核。',
            '选择批量审核通过。',
            '系统识别账单B存在异常，例如账户异常或金额不一致。',
            '确认账单A审核通过并进入打款中/打款完成。',
            '确认账单B审核失败、已驳回或仍待处理。',
            '打开账单B详情查看失败原因。',
            '打手A进入我的收入，确认已结算/已打款。',
            '打手B进入我的收入，确认未打款并可见异常状态。',
            '检查批量操作日志，确认部分成功部分失败记录清楚。'
        )),
        '批量审核中正常账单可通过，异常账单应被单独驳回或失败，不影响正常账单。',
        '批量审核结果、账单状态、打手收入状态、操作日志一致。',
        '组合F-SETTLE-REJECT-006逆向流程','待自动化','新增结算/打款逆向小用例'
    ),
    @('B-SETTLE-PAY-FAIL-001','分支小用例','插入B-SETTLE-WANYOUJI-PAY-001或B-SETTLE-WZG-TO-WYJ-PAY-001提交打款之后','打款失败逆向','审核通过后打款失败/退票处理',
        '结算账单已审核通过并提交打款；支付通道可模拟失败或账户信息异常。',
        '账单号、收款账户、失败原因：账户异常/通道失败/余额不足/退票。',
        (Steps @(
            '选择一笔待打款结算账单。',
            '审核通过并提交打款。',
            '模拟或触发支付通道失败、账户异常、余额不足或退票。',
            '刷新结算账单列表。',
            '确认账单状态变为打款失败/退票/待重新打款。',
            '打开账单详情。',
            '查看失败原因、失败时间、支付流水号。',
            '责任方账号进入收入或收款记录页面。',
            '确认未显示已到账。',
            '修正失败原因，例如修改收款账户或恢复通道。',
            '重新提交打款。',
            '确认重新打款成功后状态更新为打款完成。',
            '检查原失败流水和重试流水均可追踪。'
        )),
        '审核通过不代表打款一定成功；支付失败/退票需有失败状态、失败原因和重试机制。',
        '账单状态、支付流水、收款方收入/收款记录一致；失败不应误记为已打款。',
        '组合F-SETTLE-REJECT-007逆向流程','待自动化','新增结算/打款逆向小用例'
    ),
    @('B-SETTLE-WZG-TO-WYJ-PAY-001','分支小用例','插入丸友集提交上级验收且丸掌柜验收通过之后','丸掌柜给丸友集打款','丸掌柜处理给丸友集的结算打款',
        '丸友集已将打手完成的子单提交给上级丸掌柜验收；丸掌柜验收通过；丸掌柜和丸友集商户支付配置已完善。',
        '丸友集工作室、来源单号、订单标题、应付金额、结算账单号。',
        (Steps @(
            '先执行用例A-ORDER-001，丸掌柜发布外来订单。',
            '先执行用例A-TASK-001，丸友集接单并发给打手。',
            '先执行用例A-DELIVERY-001，打手完成子单并提交验收。',
            '先执行用例A-DELIVERY-002，丸友集提交给上级丸掌柜验收，且丸掌柜验收通过。',
            '先执行用例B-SETTLE-CONFIG-001，确认丸掌柜和丸友集商户支付配置已完善。',
            '登录丸掌柜主账号。',
            '进入财务结算/工作室结算/供应商结算相关入口。',
            '按丸友集工作室、来源单号或订单标题搜索待结算记录。',
            '确认待给丸友集打款的结算记录存在。',
            '进入结算账单列表或生成工作室结算账单。',
            '核对丸友集工作室名称、订单数、应付金额。',
            '勾选目标账单。',
            '点击审核/确认结算。',
            '选择审核通过。',
            '确认丸友集商户收款信息和打款金额。',
            '提交打款。',
            '刷新账单列表。',
            '确认账单状态为打款中/打款完成。',
            '登录丸友集主账号。',
            '进入财务结算/收款记录页面。',
            '确认收到丸掌柜对该订单或账单的打款记录。'
        )),
        '丸友集提交给上级丸掌柜验收通过后，丸掌柜可对丸友集应收账单完成审核和打款；丸友集侧可查看收款记录。',
        '丸掌柜应付金额、丸友集收款金额、来源单号/账单号一致；商户支付配置被正确使用。',
        '组合F-SETTLE-L2L3-001核心步骤；2级-3级直接结算','待自动化','新增2级-3级结算需求'
    ),
    @('B-SETTLE-WZG-TO-WYJ-REJECT-001','分支小用例','替代B-SETTLE-WZG-TO-WYJ-PAY-001审核通过步骤','丸掌柜给丸友集打款逆向','丸掌柜驳回丸友集结算账单',
        '丸掌柜侧存在待审核/待打款的丸友集结算账单。',
        '结算账单号、丸友集工作室、驳回原因。',
        (Steps @(
            '登录丸掌柜主账号。',
            '进入财务结算/工作室结算/供应商结算入口。',
            '进入结算账单列表。',
            '搜索目标丸友集结算账单。',
            '打开账单详情。',
            '核对订单数、应付金额、丸友集收款信息。',
            '点击审核。',
            '选择驳回/审核不通过。',
            '填写驳回原因。',
            '提交驳回。',
            '刷新丸掌柜结算账单列表，确认状态为已驳回/审核不通过。',
            '登录丸友集主账号。',
            '进入财务结算/收款记录或账单列表。',
            '查看该账单驳回状态和驳回原因。',
            '确认未生成打款流水。'
        )),
        '丸掌柜驳回丸友集结算账单后，不发生打款；丸友集侧可看到驳回状态和原因。',
        '驳回原因、账单状态、流水状态在丸掌柜和丸友集一致。',
        '组合F-SETTLE-REJECT-002逆向流程','待自动化','新增结算/打款小用例'
    ),
    @('F-REG-001','组合流程用例','A-SAAS-001 -> A-SAAS-003 -> A-SAAS-004','注册开通','企业注册认证并开通双应用流程',
        '测试手机号可用；主站管理员账号可用。',
        '企业账号；丸友集应用；丸掌柜应用。',
        (Steps @(
            '先执行用例A-SAAS-001。',
            '在租户平台企业信息页确认认证通过。',
            '先执行用例A-SAAS-003。',
            '进入租户平台-应用中心，确认丸友集入口可进入。',
            '先执行用例A-SAAS-004。',
            '进入租户平台-应用中心，确认丸掌柜入口可进入。',
            '打开SaaS主站企业应用列表。',
            '搜索该企业。',
            '确认丸友集、丸掌柜两条应用状态均为已开通。'
        )),
        '企业已认证；丸友集和丸掌柜均开通；后续授权和派单流程具备账号基础。',
        '同一企业账号贯穿三个小用例；企业ID、手机号、企业名称一致。',
        '组合举证：A-SAAS-001产出approved；A-SAAS-003/A-SAAS-004产出opened','已自动化组合','大流程组合'
    ),
    @('F-CONFIG-001','组合流程用例','A-AUTH-001 -> A-PUSH-001 -> A-PUSH-003','授权配置','授权绑定、工作室授权、推单策略配置流程',
        '企业已开通丸友集和丸掌柜；两个主账号可登录。',
        'auth_key；workshop_enterprise_name；strategy_name；strategy_type。',
        (Steps @(
            '先执行用例A-AUTH-001。',
            '进入丸掌柜-企业管理-授权管理-我的授权，确认授权关系可用。',
            '先执行用例A-PUSH-001。',
            '进入丸掌柜-工作室管理，确认丸友集工作室授权状态为启用。',
            '先执行用例A-PUSH-003。',
            '进入丸掌柜-履约工作室平台-推单配置。',
            '搜索strategy_name。',
            '确认策略类型、绑定工作室、启用状态正确。',
            '进入丸掌柜-商家管理-订单管理-手工录单。',
            '点击添加子单。',
            '打开策略名称下拉框，确认strategy_name可选择。'
        )),
        '授权关系、工作室授权、推单策略三项配置均可用。',
        'A-AUTH-001产出的授权关系被A-PUSH-001使用；A-PUSH-001产出的工作室被A-PUSH-003使用；A-PUSH-003产出的strategy_name可被订单使用。',
        '组合举证：授权 -> 工作室 -> 策略 -> 手工录单可选策略','已自动化组合','大流程组合'
    ),
    @('F-MAIN-001','组合流程用例','A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002','主流程','手工录单外来订单派单履约结算完整流程',
        '已完成F-CONFIG-001；打手子账号存在；订单策略可用。',
        '来源单号；订单标题；strategy_name；assignment_method；player_account。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '进入丸友集-工作室履约应用-抢单大厅，确认订单可见。',
            '先执行用例A-TASK-001。',
            '进入丸友集-工作室履约应用-订单列表，确认订单已发给打手。',
            '进入打手应用-我的订单，确认打手已抢单。',
            '先执行用例A-DELIVERY-001。',
            '进入丸友集-工作室履约应用-订单列表，确认订单待验收/可申请上游验收。',
            '先执行用例A-DELIVERY-002。',
            '进入丸掌柜-商家管理-订单管理，确认主单已完结。',
            '进入丸友集-工作室履约应用-订单列表，确认订单完成或结算中。',
            '进入打手应用-我的收入，确认该订单收入记录存在。'
        )),
        '外来订单从丸掌柜发布到丸友集、再到打手履约、上游验收、收入验证完整闭环。',
        '来源单号/订单标题贯穿所有小用例；台账状态按dispatched -> task_player_accepted -> delivery_submitted -> income_verified推进。',
        '组合举证：A-ORDER-001产出dispatched；A-TASK-001产出task_player_accepted；A-DELIVERY-001产出delivery_submitted；A-DELIVERY-002产出income_verified','已自动化组合','核心大流程'
    ),
    @('F-CANCEL-001','组合流程用例','A-ORDER-001 -> A-ORDER-002','撤销流程','已派单未接单撤销流程',
        '订单已由丸掌柜发布，但丸友集尚未接外部订单。',
        '来源单号；订单标题；strategy_type。',
        (Steps @(
            '先执行用例A-ORDER-001。',
            '进入丸友集-工作室履约应用-抢单大厅，确认订单可见。',
            '不要执行A-TASK-001中的立即接单。',
            '先执行用例A-ORDER-002。',
            '进入丸掌柜-商家管理-订单管理，确认订单已撤销。',
            '进入丸友集-工作室履约应用-抢单大厅。',
            '按来源单号或订单标题搜索。',
            '确认订单不可见或不可接。',
            '进入打手应用-抢单大厅搜索订单。',
            '确认打手侧不可见。'
        )),
        '已派单未接单状态下撤销成功，丸友集抢单大厅不可见。',
        '撤销用例复用A-ORDER-001产出的订单，不独立造数据；台账status=revoked。',
        '组合举证：A-ORDER-001产出dispatched；A-ORDER-002消费该订单并产出revoked','已自动化组合','撤销大流程'
    ),
    @('F-DISPATCH-001','组合流程用例','A-ORDER-001 -> A-TASK-001/B-DISPATCH-ASSIGN-001/B-DISPATCH-AUTO-001','分配流程','外来订单接入后不同打手分配方式流程',
        '订单已派到丸友集；存在可用打手；assignment_method分别取抢单大厅/指派打手/智能派单。',
        '来源单号；订单标题；assignment_method；player_account。',
        (Steps @(
            '先执行用例A-ORDER-001生成订单。',
            '进入丸友集-工作室履约应用-抢单大厅接入订单。',
            '进入丸友集-工作室履约应用-订单列表。',
            '打开订单详情并点击立即发单。',
            '分支1：按A-TASK-001选择抢单大厅，进入打手应用-抢单大厅验证多个打手可见并抢单。',
            '重新生成订单或使用新订单。',
            '分支2：执行B-DISPATCH-ASSIGN-001，进入打手应用-我的订单验证只有被指派打手可见。',
            '重新生成订单或使用新订单。',
            '分支3：执行B-DISPATCH-AUTO-001，进入打手应用-我的订单验证命中打手可见。',
            '回到丸友集-工作室履约应用-订单列表，核对每个分支的打手信息和分配方式。'
        )),
        '三种分配方式均能从同一个订单接入节点分支出去，并产生明确打手可见/可操作结果。',
        '每次分配都使用A-ORDER-001产出的订单结构；差异只在立即发单分配方式。',
        '组合举证：抢单大厅复用A-TASK-001；指派和智能派单复用分支小用例','部分自动化','分配大流程'
    ),
    @('F-MULTI-001','组合流程用例','B-MULTI-001 -> A-TASK-001按子单执行 -> A-DELIVERY-001/002按子单执行','多子单流程','一主两子一次发出并分别履约',
        '手工录单页面支持多子单；至少一个推单策略可用；打手账号可用。',
        '主单1个；子单1/子单2；strategy_name；player_account。',
        (Steps @(
            '先执行用例B-MULTI-001，创建一主两子并发布。',
            '进入丸友集-工作室履约应用-抢单大厅。',
            '搜索主单号或子单1标题。',
            '对子单1执行A-TASK-001中的接单、立即发单、打手抢单。',
            '对子单1执行A-DELIVERY-001和A-DELIVERY-002完成收入验证。',
            '搜索主单号或子单2标题。',
            '对子单2执行A-TASK-001中的接单、立即发单、打手抢单。',
            '对子单2执行A-DELIVERY-001和A-DELIVERY-002完成收入验证。',
            '进入丸掌柜-商家管理-订单管理打开主单详情。',
            '确认两个子单状态均已完成，主单汇总状态正确。',
            '进入打手应用-我的收入，分别确认两个子单收入记录。'
        )),
        '一主两子均可独立履约和结算；主单汇总正确。',
        '主单号相同、子单号不同；子单状态和收入独立。',
        '组合举证：B-MULTI-001产出多子单；后续按子单复用A-TASK/A-DELIVERY','待自动化','多子单大流程'
    ),
    @('F-PRICE-001','组合流程用例','B-PRICE-PERCENT-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002','价格流程','百分比发单价履约结算流程',
        '发单设置支持百分比发单价；主单金额可控。',
        '百分比策略；主单金额样本A/B；来源单号。',
        (Steps @(
            '先执行用例B-PRICE-PERCENT-001中的价格策略配置和订单创建。',
            '进入丸掌柜-商家管理-订单管理-订单详情，核对子单计算价。',
            '进入丸友集-工作室履约应用-抢单大厅，核对订单展示价格。',
            '执行A-TASK-001完成接单、立即发单、打手抢单。',
            '进入打手应用-我的订单，核对打手可见价格。',
            '执行A-DELIVERY-001提交验收。',
            '执行A-DELIVERY-002完结主单并查看收入。',
            '进入打手应用-我的收入，核对收入金额等于百分比计算价。',
            '使用样本B重复执行，确认金额随主单金额变化。'
        )),
        '百分比价格贯穿订单展示、打手可见价、结算收入。',
        '主单金额、百分比、计算价、收入金额一致。',
        '组合举证：价格分支小用例替换订单价格配置，后续复用主流程小用例','待自动化','价格大流程'
    ),
    @('F-PENALTY-001','组合流程用例','F-MAIN-001 -> B-PENALTY-001','处罚追缴流程','已完成子单处罚追缴流程',
        '已完成F-MAIN-001并产生打手收入；处罚入口和审核账号可用。',
        '已完成订单；子单号；责任方；处罚金额。',
        (Steps @(
            '先执行用例F-MAIN-001，完成手工录单外来订单履约结算。',
            '进入打手应用-我的收入，记录该订单收入金额。',
            '执行用例B-PENALTY-001。',
            '进入处罚/追缴审核列表，确认处罚单状态。',
            '进入责任方账户流水或打手应用-我的收入，确认扣减/追缴记录。',
            '进入主站或财务结算页面，查询该订单关联流水。',
            '回到丸掌柜-商家管理-订单管理，确认原订单终态仍保留。',
            '确认处罚追缴作为附加记录存在，不静默修改原履约记录。'
        )),
        '已完成子单可按规则追缴，原订单终态保留，追加流水。',
        '处罚单号、订单号、责任方、金额、流水在各端一致。',
        '组合举证：F-MAIN-001产出income_verified；B-PENALTY-001消费已完成子单','待自动化','处罚大流程'
    ),
    @('F-SETTLE-CONFIG-001','组合流程用例','B-SETTLE-PAYCENTER-001 -> B-SETTLE-CONFIG-001 -> B-SETTLE-PLAYER-ACCOUNT-001','结算配置流程','支付中心基础配置、商户支付配置和打手打款账户完善流程',
        '丸掌柜、丸友集、打手账号均可登录；支付中心和打手收入入口可访问。',
        '交易应用、交易通道、账号配置、商户支付信息、打手收款账户信息。',
        (Steps @(
            '先执行用例B-SETTLE-PAYCENTER-001。',
            '进入丸掌柜/丸友集-支付中心-交易应用，确认目标交易应用已启用。',
            '进入丸掌柜/丸友集-支付中心-交易通道，确认目标交易通道已启用。',
            '进入丸掌柜/丸友集-支付中心-账号配置，确认目标支付账号配置已启用。',
            '先执行用例B-SETTLE-CONFIG-001。',
            '进入丸掌柜-支付中心-商户支付信息或商户打款配置，确认丸掌柜商户支付配置已完善。',
            '进入丸友集-支付中心-商户支付信息或商户打款配置，确认丸友集商户支付配置已完善。',
            '先执行用例B-SETTLE-PLAYER-ACCOUNT-001。',
            '进入打手应用-我的收入。',
            '进入打款账户/收款账户设置。',
            '确认打手打款账户已完善。',
            '返回打手应用-我的收入。',
            '确认一键结算入口可用，且不再提示账户未完善。'
        )),
        '支付中心基础配置可用；丸掌柜、丸友集商户支付配置可用；打手打款账户可用；后续打款链路前置满足。',
        '交易应用、交易通道、账号配置、商户支付配置、打手账户状态、一键结算前置校验一致。',
        '组合举证：B-SETTLE-PAYCENTER-001解决支付中心基础配置；B-SETTLE-CONFIG-001解决商户打款配置；B-SETTLE-PLAYER-ACCOUNT-001解决打手收款账户','待自动化','新增结算/打款大流程'
    ),
    @('F-SETTLE-PAY-001','组合流程用例','F-MAIN-001 -> F-SETTLE-CONFIG-001 -> B-SETTLE-PLAYER-APPLY-001 -> B-SETTLE-WANYOUJI-PAY-001','打手结算正向流程','丸友集审核打手账单并给打手打款',
        '订单已完成并产生打手收入；商户支付配置和打手打款账户均已完善。',
        '来源单号、订单标题、打手账号、收入金额、结算申请号/账单号。',
        (Steps @(
            '先执行用例F-MAIN-001，完成外来订单履约、上游验收和收入验证。',
            '先执行用例F-SETTLE-CONFIG-001，确认支付配置和打手账户完善。',
            '先执行用例B-SETTLE-PLAYER-APPLY-001。',
            '进入打手应用-我的收入，确认一键结算申请已提交。',
            '先执行用例B-SETTLE-WANYOUJI-PAY-001。',
            '进入丸友集-工作室基础应用-财务结算列表。',
            '确认员工结算汇总已生成。',
            '进入丸友集-工作室基础应用-结算账单列表。',
            '确认目标账单已批量审核并提交打款。',
            '回到打手应用-我的收入。',
            '确认收入状态为已结算/已打款。',
            '如存在账户流水入口，进入打手账户流水核对到账记录。'
        )),
        '打手发起一键结算后，丸友集可完成员工结算汇总、结算账单批量审核和打款，打手侧状态同步为已结算/已打款。',
        '打手收入金额、员工结算汇总金额、结算账单金额、打款流水金额一致。',
        '组合举证：income_verified订单 -> 打手一键结算 -> 员工结算汇总 -> 结算账单批量审核打款','待自动化','新增结算/打款大流程'
    ),
    @('F-SETTLE-L1L2-001','组合流程用例','A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> B-SETTLE-L1L2-AUDIT-001 -> B-SETTLE-PLAYER-APPLY-001 -> B-SETTLE-WANYOUJI-PAY-001','1级-2级结算流程','打手完成子单后，丸友集审核并给打手结算打款',
        '打手已完成子单并提交验收；丸友集可审核该子单；打手打款账户已完善；丸友集商户支付配置已完善。',
        '来源单号、订单标题、子单号、打手账号、打手收入金额、结算申请号/账单号。',
        (Steps @(
            '先执行用例A-ORDER-001，丸掌柜创建外来订单并派到丸友集。',
            '先执行用例A-TASK-001，丸友集接外部订单并发给打手，打手抢单。',
            '先执行用例A-DELIVERY-001，打手完成子单并提交验收。',
            '先执行用例B-SETTLE-L1L2-AUDIT-001。',
            '进入丸友集-工作室履约应用-订单列表，确认子单已由丸友集审核通过。',
            '进入打手应用-我的收入，确认该子单收入变为可结算/待结算。',
            '先执行用例B-SETTLE-PLAYER-ACCOUNT-001，确认打手打款账户已完善。',
            '先执行用例B-SETTLE-PLAYER-APPLY-001，打手在我的收入中点击一键结算。',
            '进入打手应用-我的收入，确认结算申请已提交。',
            '先执行用例B-SETTLE-WANYOUJI-PAY-001。',
            '进入丸友集-工作室基础应用-财务结算列表，确认员工结算汇总已生成。',
            '进入丸友集-工作室基础应用-结算账单列表，确认账单已审核并打款。',
            '回到打手应用-我的收入，确认收入状态为已结算/已打款。'
        )),
        '1级-2级结算成立：打手完成子单并经丸友集审核通过后，丸友集即可直接给打手结算打款。',
        '该流程不依赖丸掌柜对丸友集的上级验收结果；子单审核状态、打手收入、结算账单、打款流水一致。',
        '组合举证：打手完成子单 -> 丸友集审核通过 -> 打手一键结算 -> 丸友集员工结算汇总 -> 丸友集给打手打款','待自动化','新增1级-2级结算大流程'
    ),
    @('F-SETTLE-REJECT-001','组合流程用例','F-MAIN-001 -> F-SETTLE-CONFIG-001 -> B-SETTLE-PLAYER-APPLY-001 -> B-SETTLE-WANYOUJI-REJECT-001','打手结算逆向流程','丸友集驳回打手结算账单',
        '订单已完成并产生打手收入；打手已提交一键结算申请；结算账单待丸友集审核。',
        '结算申请号/账单号、驳回原因。',
        (Steps @(
            '先执行用例F-MAIN-001。',
            '先执行用例F-SETTLE-CONFIG-001。',
            '先执行用例B-SETTLE-PLAYER-APPLY-001。',
            '进入丸友集-工作室基础应用-财务结算列表。',
            '进入结算账单列表。',
            '搜索打手结算账单。',
            '执行用例B-SETTLE-WANYOUJI-REJECT-001。',
            '回到结算账单列表，确认账单状态为已驳回/审核不通过。',
            '进入打手应用-我的收入。',
            '查看对应收入记录。',
            '确认展示驳回状态或驳回原因。',
            '确认没有生成打款流水。',
            '如业务允许重新申请，确认一键结算按钮可再次使用。'
        )),
        '丸友集驳回打手结算账单后，不打款；打手侧可见驳回状态和原因。',
        '结算账单状态、驳回原因、打手收入状态一致；无打款流水。',
        '组合举证：打手一键结算申请 -> 丸友集审核驳回 -> 打手侧状态回写','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-PAY-002','组合流程用例','F-MAIN-001 -> B-SETTLE-CONFIG-001 -> B-SETTLE-WZG-TO-WYJ-PAY-001','丸掌柜给丸友集打款正向流程','丸掌柜处理给丸友集的结算打款',
        '外来订单已完成；丸掌柜和丸友集商户支付配置已完善；丸友集形成对丸掌柜应收。',
        '丸友集工作室、来源单号、订单标题、应付金额、结算账单号。',
        (Steps @(
            '先执行用例F-MAIN-001，完成外来订单履约和上游验收。',
            '先执行用例B-SETTLE-CONFIG-001，确认丸掌柜和丸友集商户支付配置已完善。',
            '先执行用例B-SETTLE-WZG-TO-WYJ-PAY-001。',
            '进入丸掌柜-财务结算/工作室结算/供应商结算入口。',
            '进入结算账单列表。',
            '确认目标丸友集账单状态为打款中/打款完成。',
            '登录丸友集主账号。',
            '进入丸友集-财务结算/收款记录页面。',
            '按来源单号、订单标题或账单号搜索。',
            '确认收到丸掌柜对该订单或账单的打款记录。',
            '核对丸友集收款金额和丸掌柜付款金额。'
        )),
        '丸掌柜可对丸友集应收账单完成审核和打款；丸友集侧可查看收款记录。',
        '丸掌柜应付金额、丸友集收款金额、账单号、订单号一致。',
        '组合举证：F-MAIN-001产生应付 -> 支付中心配置 -> 丸掌柜审核打款 -> 丸友集收款','待自动化','新增结算/打款大流程'
    ),
    @('F-SETTLE-L2L3-001','组合流程用例','A-ORDER-001 -> A-TASK-001 -> A-DELIVERY-001 -> A-DELIVERY-002 -> B-SETTLE-WZG-TO-WYJ-PAY-001','2级-3级结算流程','丸友集提交上级验收后，丸掌柜给丸友集结算打款',
        '打手已完成子单；丸友集已将子单提交给上级丸掌柜验收；丸掌柜验收通过；丸掌柜和丸友集商户支付配置已完善。',
        '来源单号、订单标题、子单号、丸友集工作室、丸掌柜应付金额、结算账单号。',
        (Steps @(
            '先执行用例A-ORDER-001，丸掌柜创建外来订单并派到丸友集。',
            '先执行用例A-TASK-001，丸友集接外部订单并发给打手。',
            '先执行用例A-DELIVERY-001，打手完成子单并提交验收。',
            '先执行用例A-DELIVERY-002，丸友集在工作室履约应用-订单列表点击申请上游验收。',
            '登录丸掌柜主账号，进入丸掌柜-商家管理-订单管理。',
            '按来源单号或订单标题搜索订单。',
            '丸掌柜验收通过并完结主单。',
            '先执行用例B-SETTLE-CONFIG-001，确认丸掌柜和丸友集商户支付配置已完善。',
            '先执行用例B-SETTLE-WZG-TO-WYJ-PAY-001。',
            '进入丸掌柜-财务结算/工作室结算/供应商结算入口。',
            '进入结算账单列表，确认丸友集账单已审核并打款。',
            '登录丸友集主账号。',
            '进入丸友集-财务结算/收款记录页面。',
            '按来源单号、订单标题或账单号搜索。',
            '确认丸友集收到丸掌柜打款记录。'
        )),
        '2级-3级结算成立：丸友集将打手完成的子单提交给上级丸掌柜验收，丸掌柜验收通过后给丸友集结算打款。',
        '丸掌柜验收状态、丸掌柜应付账单、丸友集收款记录、订单来源单号一致。',
        '组合举证：打手完成子单 -> 丸友集提交上级验收 -> 丸掌柜验收通过 -> 丸掌柜给丸友集打款','待自动化','新增2级-3级结算大流程'
    ),
    @('F-SETTLE-REJECT-002','组合流程用例','B-SETTLE-WZG-TO-WYJ-PAY-001前置账单 -> B-SETTLE-WZG-TO-WYJ-REJECT-001','丸掌柜给丸友集打款逆向流程','丸掌柜驳回丸友集结算账单',
        '丸掌柜侧存在待审核/待打款的丸友集结算账单。',
        '结算账单号、丸友集工作室、驳回原因。',
        (Steps @(
            '先准备一笔丸掌柜待审核的丸友集结算账单。',
            '登录丸掌柜主账号。',
            '进入财务结算/工作室结算/供应商结算入口。',
            '进入结算账单列表。',
            '搜索目标丸友集结算账单。',
            '执行用例B-SETTLE-WZG-TO-WYJ-REJECT-001。',
            '回到丸掌柜结算账单列表。',
            '确认账单状态为已驳回/审核不通过。',
            '登录丸友集主账号。',
            '进入丸友集-财务结算/收款记录或账单列表。',
            '搜索同一账单。',
            '确认丸友集侧可见驳回状态和原因。',
            '确认未生成收款流水。'
        )),
        '丸掌柜驳回丸友集结算账单后，不发生打款；丸友集侧可见驳回状态和原因。',
        '驳回原因、账单状态、流水状态在丸掌柜和丸友集一致。',
        '组合举证：待审核丸友集账单 -> 丸掌柜驳回 -> 丸友集侧回写','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-REJECT-003','组合流程用例','F-MAIN-001 -> B-SETTLE-PLAYER-ACCOUNT-REJECT-001','打手结算逆向流程','打手打款账户未完善或审核不通过导致一键结算拦截',
        '已完成订单并产生打手收入；打手账户未完善、停用或审核不通过。',
        '打手账号、来源单号、订单标题、账户异常原因。',
        (Steps @(
            '先执行用例F-MAIN-001，生成一笔已完成且有收入的订单。',
            '执行用例B-SETTLE-PLAYER-ACCOUNT-REJECT-001。',
            '进入打手应用-我的收入。',
            '选择该订单收入。',
            '点击一键结算。',
            '确认页面拦截并提示打款账户未完善或审核不通过。',
            '进入打款账户设置，完善账户信息。',
            '再次回到打手应用-我的收入。',
            '重新点击一键结算。',
            '确认可进入结算确认页。'
        )),
        '打手账户不满足条件时不能发起结算；完善后才能继续。',
        '账户状态、一键结算拦截、后续恢复一致。',
        '组合举证：收入已生成 -> 账户异常 -> 一键结算拦截 -> 完善账户后恢复','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-REJECT-004','组合流程用例','B-SETTLE-CONFIG-REJECT-001','打款配置逆向流程','商户支付信息缺失或审核不通过导致打款拦截',
        '丸掌柜或丸友集存在待打款账单；商户支付信息未完善、停用或审核不通过。',
        '丸掌柜商户、丸友集商户、结算账单号、配置异常原因。',
        (Steps @(
            '执行用例B-SETTLE-CONFIG-REJECT-001。',
            '进入丸掌柜-财务结算/工作室结算/供应商结算入口。',
            '选择一笔待给丸友集打款账单。',
            '尝试审核通过并提交打款。',
            '确认因丸掌柜或丸友集商户支付信息不可用被拦截。',
            '进入丸友集-工作室基础应用-结算账单列表。',
            '选择一笔待给打手打款账单。',
            '尝试批量审核并打款。',
            '确认因商户支付信息不可用被拦截。',
            '恢复支付中心商户配置。',
            '重新提交打款，确认可继续。'
        )),
        '商户支付配置不可用时，两段打款都应被拦截，恢复配置后可继续。',
        '支付中心配置状态与打款前置校验一致；无误打款流水。',
        '组合举证：支付配置异常 -> 1级-2级打款拦截 + 2级-3级打款拦截 -> 配置恢复','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-REJECT-005','组合流程用例','B-SETTLE-PLAYER-APPLY-001 -> B-SETTLE-EMP-SUMMARY-REJECT-001','丸友集给打手打款逆向流程','员工结算汇总异常或驳回',
        '打手已提交一键结算申请；员工结算汇总阶段存在异常数据。',
        '打手账号、结算申请号、异常原因。',
        (Steps @(
            '先执行用例B-SETTLE-PLAYER-APPLY-001，生成打手结算申请。',
            '执行用例B-SETTLE-EMP-SUMMARY-REJECT-001。',
            '进入丸友集-工作室基础应用-财务结算列表。',
            '搜索打手账号或结算申请号。',
            '确认该申请未进入可打款账单。',
            '查看汇总失败或驳回原因。',
            '进入打手应用-我的收入。',
            '确认该收入未显示已打款。',
            '修正异常后重新生成员工结算汇总。',
            '确认可进入结算账单列表。'
        )),
        '员工结算汇总异常时不能进入打款；异常原因可追踪，修复后可继续。',
        '财务结算列表、打手收入状态、汇总异常原因一致。',
        '组合举证：打手结算申请 -> 员工结算汇总异常 -> 不生成打款账单','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-REJECT-006','组合流程用例','B-SETTLE-BATCH-AUDIT-PARTIAL-REJECT-001','丸友集给打手打款逆向流程','结算账单批量审核部分通过部分驳回',
        '结算账单列表存在多笔待审核打手账单，且至少一笔异常。',
        '账单A正常；账单B异常；批量审核原因。',
        (Steps @(
            '执行用例B-SETTLE-BATCH-AUDIT-PARTIAL-REJECT-001。',
            '进入丸友集-工作室基础应用-结算账单列表。',
            '查看批量审核结果。',
            '确认账单A状态为审核通过/打款中/打款完成。',
            '确认账单B状态为审核失败/已驳回/待处理。',
            '进入打手A的打手应用-我的收入，确认已结算或已打款。',
            '进入打手B的打手应用-我的收入，确认未打款并显示异常状态。',
            '查看操作日志，确认部分成功部分失败有明确记录。'
        )),
        '批量审核不能因为一笔异常导致正常账单失败，也不能把异常账单误打款。',
        '批量结果、账单状态、打手收入状态、操作日志一致。',
        '组合举证：多账单批量审核 -> 正常账单通过 -> 异常账单驳回','待自动化','新增结算/打款逆向流程'
    ),
    @('F-SETTLE-REJECT-007','组合流程用例','B-SETTLE-PAY-FAIL-001','打款失败逆向流程','审核通过后打款失败或退票处理',
        '结算账单已审核通过并提交打款；支付通道可模拟失败或收款账户异常。',
        '账单号、收款账户、失败原因。',
        (Steps @(
            '执行用例B-SETTLE-PAY-FAIL-001。',
            '进入对应结算账单列表。',
            '搜索目标账单。',
            '确认账单状态为打款失败/退票/待重新打款。',
            '打开账单详情查看失败原因和失败流水。',
            '进入收款方收入或收款记录页面。',
            '确认未显示已到账。',
            '修正失败原因。',
            '重新提交打款。',
            '确认账单状态更新为打款完成。',
            '确认失败流水和重试流水均可追踪。'
        )),
        '审核通过后打款失败要有失败状态、原因、流水和重试能力，不能误记为已打款。',
        '账单状态、支付流水、收款方记录一致。',
        '组合举证：审核通过 -> 支付失败 -> 失败状态 -> 修复后重试成功','待自动化','新增结算/打款逆向流程'
    )
)

$stateMapRows = @(
    @('S-MAIN-001','主单状态','待付款','可为空/待付款',
        '丸掌柜-商家管理-订单管理；创建订单后未完成收款或付款确认。',
        '丸掌柜：企业主账号；必要时销售客服账号。',
        '校验待付款主单是否可查询、可编辑、是否允许撤销或继续付款；确认未进入丸友集接单链路。',
        '订单状态=待付款；子单未进入履约；丸友集抢单大厅不可见该订单。',
        'B-ORDER-STATUS-001','来自订单管理查询栏实际枚举。'
    ),
    @('S-MAIN-002','主单状态','待接单','待接单/待接单-已推单',
        '丸掌柜-商家管理-订单管理；手工录单或抖音录单提交并推单。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '区分未推单和已推单两类子单：未推单应仍可编辑/撤销；已推单应能在丸友集抢单大厅查看。',
        '订单状态=待接单；子单状态=待接单或待接单-已推单；丸友集抢单大厅可按来源单号/订单标题查询。',
        'A-ORDER-001、A-ORDER-002、F-CANCEL-001','这是外来订单进入丸友集前后的核心分支。'
    ),
    @('S-MAIN-003','主单状态','代练中','代练中',
        '丸友集接外部订单并发给打手；打手在打手应用-抢单大厅接单。',
        '丸友集：工作室主账号；打手应用：打手子账号；丸掌柜：企业主账号查看状态。',
        '验证接单供应链名称、打手接单结果、丸掌柜侧主单状态同步；验证履约中撤销/异常入口。',
        '订单状态=代练中；子单状态=代练中；打手应用-我的订单存在待履约订单。',
        'A-TASK-001、F-DISPATCH-001','对抢单大厅、指派打手、智能派单三种分配方式分别覆盖。'
    ),
    @('S-MAIN-004','主单状态','待验收','待验收',
        '打手应用-我的订单提交验收；丸友集工作室履约应用-订单列表申请/处理验收。',
        '打手应用：打手子账号；丸友集：工作室主账号；丸掌柜：企业主账号。',
        '验证打手提交成果后状态同步；验证丸友集验收通过/驳回；验证丸掌柜完结主单前是否存在未完成子单拦截。',
        '订单状态=待验收；子单状态=待验收；丸友集侧可处理验收或申请上游验收。',
        'A-DELIVERY-001、A-DELIVERY-002、F-MAIN-001','验收分支要拆通过、驳回、资料不完整三类。'
    ),
    @('S-MAIN-005','主单状态','异常中','推单异常/代练中异常',
        '丸掌柜-商家管理-订单管理；推单失败、打手履约异常、接口或业务异常。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号（按异常节点）。',
        '验证异常原因可见、异常订单不可误进入正常完成/结算；验证可重试推单、改派、处理异常或转售后。',
        '订单状态=异常中；子单状态=推单异常或代练中异常；异常原因、处理按钮和操作日志可追踪。',
        'B-ORDER-EXCEPTION-001、B-ORDER-EXCEPTION-002','真实子单异常枚举来自查询栏。'
    ),
    @('S-MAIN-006','主单状态','售后中','售后中',
        '丸掌柜-商家管理-订单管理；点击主单售后或发起售后处理。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号（如需举证）。',
        '验证售后创建、处理、责任方、金额影响；验证售后中订单不应直接进入普通完结和打款。',
        '订单状态=售后中；子单状态=售后中；订单操作区展示售后处理入口或售后记录。',
        'B-AFTERSALE-001','售后状态独立于结算状态，后续需补售后金额影响。'
    ),
    @('S-MAIN-007','主单状态','已完成','已完成/已完成→申诉中/已完成→申诉完成',
        '丸掌柜验收通过/完结主单；或已完成后发起申诉。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号。',
        '验证主单完成、子单完成、完结主单按钮行为；验证已完成后可发起申诉，以及申诉中/申诉完成对子单状态和结算的影响。',
        '订单状态=已完成；子单状态=已完成，或进入已完成→申诉中/已完成→申诉完成；完成时间有值。',
        'A-DELIVERY-002、F-MAIN-001、B-PENALTY-001','结算入口不在订单状态里，完成后再进入结算中心/财务结算。'
    ),
    @('S-MAIN-008','主单状态','已售后','售后中/已完成→申诉完成',
        '售后处理完成；订单归档到已售后。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证售后完成后的订单归档、金额调整、责任追踪；确认不再按普通已完成订单重复打款。',
        '订单状态=已售后；售后记录可查；金额调整与后续结算/追缴一致。',
        'B-AFTERSALE-002、B-PENALTY-002','需要结合售后业务规则补充金额断言。'
    ),
    @('S-MAIN-009','主单状态','已取消','可为空/待接单/待接单-已推单',
        '丸掌柜-商家管理-订单管理；未履约前点击撤销/取消。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '区分创建后未推单取消、已推单未接单取消、丸友集已可见后撤销；验证下游不可继续接单。',
        '订单状态=已取消；丸友集抢单大厅不可见或不可接；打手应用不可见该订单。',
        'A-ORDER-002、F-CANCEL-001','替换之前泛化的“撤销完成”，以页面实际“已取消”为准。'
    ),
    @('S-SUB-001','子订单状态','待付款','待付款',
        '主单或子单创建后未完成付款/确认。',
        '丸掌柜：企业主账号。',
        '验证待付款子单不应流入丸友集或打手；可编辑、取消、补付款。',
        '子单状态=待付款；订单状态通常=待付款；无接单供应链。',
        'B-SUB-STATUS-001','子订单状态查询栏实际枚举。'
    ),
    @('S-SUB-002','子订单状态','待接单','待接单',
        '子单已创建但未推给丸友集或尚未被接单。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证可推单、撤销、编辑；丸友集未接前的状态和操作边界。',
        '子单状态=待接单；如未推单，下游不可见；如已推单，应进入待接单-已推单。',
        'A-ORDER-001、B-CANCEL-BEFORE-PUSH-001','需和“待接单-已推单”明确区分。'
    ),
    @('S-SUB-003','子订单状态','待接单','待接单-已推单',
        '丸掌柜提交推单；丸友集工作室履约应用-抢单大厅展示外部订单。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证推单策略、工作室可见范围、订单来源、价格模式；验证推单后撤销。',
        '子单状态=待接单-已推单；丸友集抢单大厅可见；接单后进入代练中或待打手分配链路。',
        'A-ORDER-001、F-DISPATCH-001','覆盖手工录单和抖音录单。'
    ),
    @('S-SUB-004','子订单状态','代练中','代练中',
        '丸友集接外部订单后发给打手；打手抢单/确认接单。',
        '丸友集：工作室主账号；打手应用：打手子账号。',
        '验证打手我的订单出现；验证履约中可提交验收、异常、售后/撤销边界。',
        '子单状态=代练中；打手应用-我的订单展示同一订单。',
        'A-TASK-001、A-DELIVERY-001','分配方式需拆抢单大厅/指派打手/智能派单。'
    ),
    @('S-SUB-005','子订单状态','待验收','待验收',
        '打手完成订单并在打手应用-我的订单提交验收。',
        '打手应用：打手子账号；丸友集：工作室主账号。',
        '验证提交验收资料、丸友集审核通过/驳回、申请上游验收。',
        '子单状态=待验收；丸友集订单列表可看到验收入口；丸掌柜侧主单可能显示待验收。',
        'A-DELIVERY-001、A-DELIVERY-002','1级-2级结算在丸友集审核通过后触发，不等同于订单状态枚举。'
    ),
    @('S-SUB-006','子订单状态','异常中','推单异常',
        '丸掌柜推单到丸友集失败、策略/授权/接口异常。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证异常提示、可重推、改策略、撤销；验证下游不可误接单。',
        '子单状态=推单异常；订单状态可进入异常中；异常原因可见。',
        'B-ORDER-EXCEPTION-001','推单配置、授权、价格模式都要作为异常原因来源。'
    ),
    @('S-SUB-007','子订单状态','异常中','代练中异常',
        '打手履约中发生异常、超时、申诉或人工标记异常。',
        '丸友集：工作室主账号；打手应用：打手子账号；丸掌柜：企业主账号。',
        '验证异常上报、处理、继续履约、改派、售后；验证异常中不可直接完成打款。',
        '子单状态=代练中异常；订单状态可进入异常中；处理后回到代练中/待验收/售后中。',
        'B-ORDER-EXCEPTION-002','需后续探测异常处理按钮。'
    ),
    @('S-SUB-008','子订单状态','售后中','售后中',
        '订单或子单发起售后。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号。',
        '验证售后举证、责任划分、退款/扣款影响；验证售后中不能误完成普通结算。',
        '子单状态=售后中；售后记录和订单操作区一致。',
        'B-AFTERSALE-001','与处罚追缴、结算扣款联动。'
    ),
    @('S-SUB-009','子订单状态','已完成','已完成',
        '丸友集验收通过并/或丸掌柜上游验收通过。',
        '丸友集：工作室主账号；丸掌柜：企业主账号；打手应用：打手子账号。',
        '验证完成后收入生成、可结算；验证一主多子时全部子单完成后主单才能完结。',
        '子单状态=已完成；主单可进入已完成或待完结；打手应用-我的收入生成记录。',
        'A-DELIVERY-002、F-SETTLE-L1L2-001、F-SETTLE-L2L3-001','结算状态在财务/结算中心校验。'
    ),
    @('S-SUB-010','子订单状态','已完成','已完成→申诉中',
        '已完成订单点击发起申诉。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：打手子账号（如需举证）。',
        '验证申诉创建、状态展示、完成订单是否冻结结算/打款。',
        '子单状态=已完成→申诉中；订单操作区展示申诉处理或申诉记录。',
        'B-APPEAL-001','页面真实枚举使用箭头状态。'
    ),
    @('S-SUB-011','子订单状态','已完成','已完成→申诉完成',
        '申诉处理完成。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证申诉结果、责任扣罚、补偿/追缴、结算恢复或调整。',
        '子单状态=已完成→申诉完成；申诉结果与后续处罚追缴/结算金额一致。',
        'B-APPEAL-002、B-PENALTY-001','完成后追缴需要绑定该分支。'
    ),
    @('S-COMBO-001','组合状态','待接单','多子单：待接单 + 待接单-已推单',
        '一主多子，一部分子单已推单，一部分子单暂未推单。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证主单聚合状态、子单计数、不同子单操作互不影响。',
        '主单订单状态可能仍为待接单；子单状态分别展示；已推单子单丸友集可见，未推单不可见。',
        'F-MULTI-SUB-001','用于一主多子细分。'
    ),
    @('S-COMBO-002','组合状态','代练中/待验收','多子单：代练中 + 待验收 + 已完成',
        '一主多子，不同子单处于不同履约阶段。',
        '丸掌柜：企业主账号；丸友集：工作室主账号；打手应用：多个打手子账号。',
        '验证主单不能提前完结；验证各子单验收、异常、撤销互不串状态。',
        '存在未完成子单时，丸掌柜完结主单提示子单未完成/未完结。',
        'F-MULTI-SUB-002','来自自动化中已有未完成子单拦截断言。'
    ),
    @('S-COMBO-003','组合状态','已完成','多子单：全部已完成',
        '一主多子全部完成，丸掌柜完结主单。',
        '丸掌柜：企业主账号；丸友集：工作室主账号。',
        '验证主单完成时间、完成状态、结算前置数据生成。',
        '所有子单状态=已完成；主单状态=已完成；可进入1级-2级和2级-3级结算流程。',
        'F-MAIN-001、F-SETTLE-L1L2-001、F-SETTLE-L2L3-001','结算独立到结算用例，不写成订单状态。'
    )
)

function Convert-StateMapRowToCaseRow {
    param([object[]]$StateRow)
    $caseId = [string]$StateRow[0]
    $level = [string]$StateRow[1]
    $orderStatus = [string]$StateRow[2]
    $subStatus = [string]$StateRow[3]
    $trigger = [string]$StateRow[4]
    $login = [string]$StateRow[5]
    $focus = [string]$StateRow[6]
    $expected = [string]$StateRow[7]
    $related = [string]$StateRow[8]
    $remark = [string]$StateRow[9]
    return @(
        $caseId,
        '订单状态分支用例',
        '丸掌柜-商家管理-订单管理查询栏实际枚举',
        '订单状态分支',
        ("{0}：订单状态【{1}】/子订单状态【{2}】分支" -f $level, $orderStatus, $subStatus),
        $login,
        '丸掌柜账号可登录；进入丸掌柜-商家管理-订单管理；页面查询栏存在订单状态和子订单状态筛选项。',
        ("订单状态={0}；子订单状态={1}；来源单号/订单标题/主单号按用例准备。" -f $orderStatus, $subStatus),
        (Steps @(
            '登录对应平台角色账号。',
            '进入丸掌柜-商家管理-订单管理。',
            ("在查询栏选择订单状态【{0}】。" -f $orderStatus),
            ("在查询栏选择子订单状态【{0}】。" -f $subStatus),
            '点击查询。',
            '打开或定位目标订单行，查看订单编号、订单信息、订单状态、子单状态、接单供应链名称、录单时间和完成时间。',
            ("按该分支触发动作继续验证：{0}" -f $trigger),
            '如涉及下游，切换到丸友集-工作室履约应用-抢单大厅/订单列表或打手应用-我的订单进行同步校验。',
            '如涉及完成后资金，只进入结算中心/财务结算用例校验，不把结算状态写作订单管理状态。'
        )),
        $expected,
        $focus,
        $related,
        '待自动化',
        $remark
    )
}

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
try {
    if (Test-Path $Output) { Remove-Item $Output -Force }
    $wb = $excel.Workbooks.Add()
    while ($wb.Worksheets.Count -gt 2) { $wb.Worksheets.Item($wb.Worksheets.Count).Delete() }
    while ($wb.Worksheets.Count -lt 2) { $wb.Worksheets.Add([Type]::Missing, $wb.Worksheets.Item($wb.Worksheets.Count)) | Out-Null }
    $ws = $wb.Worksheets.Item(1)
    $ws.Name = '用例测试列表'
    $flowWs = $wb.Worksheets.Item(2)
    $flowWs.Name = '组合流程用例'
    Add-Row $ws 1 $headers
    $ws.Rows.Item(1).Font.Bold = $true
    $ws.Rows.Item(1).Interior.ColorIndex = 37
    Add-Row $flowWs 1 $headers
    $flowWs.Rows.Item(1).Font.Bold = $true
    $flowWs.Rows.Item(1).Interior.ColorIndex = 37

    $caseRow = 2
    $flowRow = 2
    for ($i = 0; $i -lt $rows.Count; $i++) {
        $row = Normalize-TextRow $rows[$i]
        if ([string]$row[1] -eq '组合流程用例') {
            Add-Row $flowWs $flowRow $row
            $flowRow++
        } else {
            Add-Row $ws $caseRow $row
            $caseRow++
        }
    }
    foreach ($row in $stateMapRows) {
        $caseRowData = Normalize-TextRow (Convert-StateMapRowToCaseRow $row)
        Add-Row $ws $caseRow $caseRowData
        $caseRow++
    }
    foreach ($sheet in @($ws, $flowWs)) {
        $sheet.UsedRange.WrapText = $true
        $sheet.UsedRange.VerticalAlignment = -4160
        $sheet.Columns.AutoFit() | Out-Null
        for ($c = 1; $c -le $sheet.UsedRange.Columns.Count; $c++) {
            if ($sheet.Columns.Item($c).ColumnWidth -gt 62) {
                $sheet.Columns.Item($c).ColumnWidth = 62
            }
        }
    }
    $ws.Activate()
    $wb.SaveAs($Output, 51)
    $wb.Close($true)
}
finally {
    $excel.Quit()
}

$excel2 = New-Object -ComObject Excel.Application
$excel2.Visible = $false
$excel2.DisplayAlerts = $false
try {
    $wb2 = $excel2.Workbooks.Open($Output)
    $ws2 = $wb2.Worksheets.Item('用例测试列表')
    Write-Output 'excel_open_ok=True'
    Write-Output ('sheets=' + $wb2.Worksheets.Count)
    Write-Output ('rows=' + $ws2.UsedRange.Rows.Count)
    Write-Output ('cols=' + $ws2.UsedRange.Columns.Count)
    Write-Output ('first_case=' + $ws2.Cells.Item(2,1).Text + '/' + $ws2.Cells.Item(2,5).Text)
    $wb2.Close($false)
}
finally {
    $excel2.Quit()
}

Write-Output $Output
