<view class="page">
  <view class="notice">一行 = 一个客户 × 一个商机。进度按「任务截止 + 节点停留 + 客诉 + 待确认变更」自动算，取最差值；人工覆盖必须填原因并留痕。节点、进度、延期均不影响 V1 预测金额。</view>

  <view class="card">
    <view class="card-title">客户商机一栏看板</view>
    <input class="input" value="{{keyword}}" bindinput="onKeyword" placeholder="搜索客户 / 商机 / 商机 ID" />
    <view class="chips" style="margin-top:18rpx">
      <view class="chip {{scope === 'active' && flag === '' ? 'on' : ''}}" data-scope="active" data-flag="" bindtap="onFilter">进行中</view>
      <view class="chip {{scope === 'all' && flag === '' ? 'on' : ''}}" data-scope="all" data-flag="" bindtap="onFilter">全部 341</view>
      <view class="chip {{flag === 'mine' ? 'on' : ''}}" data-scope="active" data-flag="mine" bindtap="onFilter">我的客户</view>
      <view class="chip {{flag === 'complaint' ? 'on' : ''}}" data-scope="active" data-flag="complaint" bindtap="onFilter">有客诉</view>
      <view class="chip {{flag === 'delayed' ? 'on' : ''}}" data-scope="active" data-flag="delayed" bindtap="onFilter">延期</view>
      <view class="chip {{flag === 'change' ? 'on' : ''}}" data-scope="active" data-flag="change" bindtap="onFilter">待确认变更 {{pendingCount > 0 ? '(' + pendingCount + ')' : ''}}</view>
    </view>
    <view class="card-sub" style="margin-top:8rpx;margin-bottom:0">当前 {{rows.length}} 行 · 当前身份 {{sales}}（{{roleName}}）</view>
  </view>

  <view wx:if="{{rows.length === 0}}" class="empty">没有符合条件的商机</view>

  <view wx:for="{{rows}}" wx:for-item="r" wx:key="key" class="lane {{r.healthLevel === 2 ? 'delay' : (r.healthLevel === 1 ? 'warn' : '')}}">
    <view class="lane-head" data-key="{{r.key}}" bindtap="toggle">
      <view style="flex:1">
        <view class="lane-title">{{r.customer}} · {{r.oppName}}</view>
        <view class="lane-meta">{{r.oppId || '待建商机'}} · {{r.sales || '—'}} · {{r.isNew ? '新增' : 'V1基线'}} · {{r.rawText}} 万</view>
      </view>
      <text class="badge {{r.healthClass}}">{{r.healthLabel}}</text>
    </view>

    <view class="lane-grid">
      <view class="lane-cell"><view class="lane-cell-label">项目节点</view><view class="lane-cell-value">{{r.nodeName}} · {{r.stayDays}}天</view></view>
      <view class="lane-cell"><view class="lane-cell-label">客诉</view><view class="lane-cell-value {{r.openComplaintCount > 0 ? 'danger' : ''}}">{{r.complaintCount}} 条 / 未关闭 {{r.openComplaintCount}}</view></view>
      <view class="lane-cell"><view class="lane-cell-label">任务</view><view class="lane-cell-value">{{r.taskCount}} 个</view></view>
      <view class="lane-cell"><view class="lane-cell-label">承接人</view><view class="lane-cell-value ellipsis">{{r.assigneesText}}</view></view>
      <view class="lane-cell"><view class="lane-cell-label">延期</view><view class="lane-cell-value {{r.delayedDays > 0 ? 'danger' : ''}}">{{r.delayedText}}</view></view>
      <view class="lane-cell"><view class="lane-cell-label">变更确认</view><view class="lane-cell-value {{r.pendingChangeCount > 0 ? 'warn' : ''}}">{{r.pendingChangeCount > 0 ? '待处理 ' + r.pendingChangeCount : '—'}}</view></view>
    </view>
    <view class="lane-meta">判定依据：{{r.healthReasons}}{{r.healthManual ? ' · 人工覆盖（' + r.healthManualReason + '）' : ''}}</view>
    <view wx:if="{{r.changeFlagText}}" class="lane-meta" style="color:#b06000">{{r.changeFlagText}}</view>

    <view wx:if="{{expanded === r.key}}" style="margin-top:20rpx;border-top:1rpx solid #eef1f6;padding-top:20rpx">
      <view class="card-title" style="font-size:27rpx">项目节点</view>
      <picker range="{{nodeNames}}" value="{{nodeIndex}}" data-key="{{r.key}}" bindchange="onNodePick">
        <view class="picker">改为：{{nodeNames[nodeIndex]}}</view>
      </picker>
      <view class="small-btn primary" data-key="{{r.key}}" bindtap="saveNode">保存节点（记录进入日期）</view>

      <view class="divider"></view>
      <view class="card-title" style="font-size:27rpx">进度人工覆盖</view>
      <picker range="{{healthNames}}" value="{{healthIndex}}" bindchange="onHealthPick">
        <view class="picker">覆盖为：{{healthNames[healthIndex]}}</view>
      </picker>
      <input class="input" style="margin-top:12rpx" value="{{healthReason}}" bindinput="onHealthReason" placeholder="覆盖原因（必填，会留痕）" />
      <view class="small-btn primary" data-key="{{r.key}}" bindtap="saveHealthOverride">保存覆盖</view>

      <view class="divider"></view>
      <view class="card-title" style="font-size:27rpx">客诉 {{r.complaints.length}} 条</view>
      <view wx:if="{{r.complaints.length === 0}}" class="lane-meta">暂无客诉</view>
      <view wx:for="{{r.complaints}}" wx:for-item="cp" wx:key="id" class="sub-item">
        <view class="sub-row"><text class="list-title" style="font-size:25rpx">{{cp.level}} · {{cp.date}}</text><text class="badge {{cp.status === '已关闭' ? 'badge-gray' : 'badge-red'}}">{{cp.status}}</text></view>
        <view class="list-desc">{{cp.desc}}</view>
        <view wx:if="{{cp.status !== '已关闭'}}" class="small-btn" data-id="{{cp.id}}" bindtap="closeComplaint">标记已关闭</view>
      </view>
      <view class="small-btn" data-key="{{r.key}}" bindtap="openComplaint">登记客诉</view>

      <view class="divider"></view>
      <view class="card-title" style="font-size:27rpx">任务 {{r.tasks.length}} 个</view>
      <view wx:if="{{r.tasks.length === 0}}" class="lane-meta">暂无任务</view>
      <view wx:for="{{r.tasks}}" wx:for-item="tk" wx:key="id" class="sub-item">
        <view class="sub-row"><text class="list-title" style="font-size:25rpx">{{tk.typeName}}</text><text class="badge {{tk.overdueDays > 0 ? 'badge-red' : 'badge-blue'}}">{{tk.overdueDays > 0 ? '逾期' + tk.overdueDays + '天' : tk.status}}</text></view>
        <view class="list-desc">承接人 {{tk.assignee}} · 截止 {{tk.dueDate || '未设定'}}</view>
        <view class="small-btn" data-id="{{tk.id}}" data-key="{{r.key}}" bindtap="openChange">承接人发起延期变更</view>
      </view>

      <view class="divider"></view>
      <view class="card-title" style="font-size:27rpx">延期变更单 {{r.changes.length}} 条</view>
      <view wx:if="{{r.changes.length === 0}}" class="lane-meta">暂无变更单</view>
      <view wx:for="{{r.changes}}" wx:for-item="ch" wx:key="id" class="sub-item">
        <view class="sub-row"><text class="list-title" style="font-size:25rpx">{{ch.taskName}}</text><text class="badge {{ch.badgeClass}}">{{ch.statusName}}</text></view>
        <view class="list-desc">发起人 {{ch.initiator}} · 原截止 {{ch.originalDue}} → 申请 {{ch.requestedDue}}（+{{ch.deltaDays}}天）</view>
        <view class="list-desc">原因：{{ch.reason}}</view>
        <view wx:if="{{ch.flagText}}" class="lane-meta" style="color:#b06000">{{ch.flagText}}</view>
        <block wx:if="{{ch.status === 'pending_sales' && ch.sales === sales}}">
          <view class="small-btn primary" data-id="{{ch.id}}" bindtap="openConfirm">销售确认</view>
        </block>
        <block wx:if="{{ch.status === 'pending_manager' && canManager}}">
          <view class="small-btn primary" data-id="{{ch.id}}" bindtap="openManager">主管裁定</view>
        </block>
      </view>

      <view class="divider"></view>
      <view class="small-btn" data-key="{{r.key}}" bindtap="openAudit">查看审计日志</view>
    </view>
  </view>
</view>

<view class="overlay-mask" wx:if="{{overlay}}" bindtap="closeOverlay"></view>
<view class="overlay" wx:if="{{overlay}}">
  <view class="card-title">{{overlayTitle}}</view>

  <block wx:if="{{overlay === 'change'}}">
    <view class="card-sub">仅承接人可发起延期变更；同一任务最多 3 次。销售确认前原截止日继续有效。</view>
    <view class="row"><text class="row-label">任务</text><text class="row-value">{{form.taskName}}</text></view>
    <view class="row"><text class="row-label">原截止</text><text class="row-value">{{form.originalDue}}</text></view>
    <view class="field"><text class="field-label">申请新截止<text class="req">*</text></text>
      <picker mode="date" value="{{form.requestedDue}}" bindchange="onFormDate"><view class="picker">{{form.requestedDue}}</view></picker>
    </view>
    <view class="field"><text class="field-label">延期原因<text class="req">*</text></text>
      <textarea class="textarea" value="{{form.reason}}" data-field="reason" bindinput="onForm" placeholder="例：客户下机文件回传延迟，需补做一轮验证" /></view>
    <view class="field"><text class="field-label">影响评估<text class="req">*</text></text>
      <textarea class="textarea" value="{{form.impact}}" data-field="impact" bindinput="onForm" placeholder="对项目节点、客户交付的影响" /></view>
    <view class="field"><text class="field-label">是否影响项目节点</text>
      <view class="chips"><view class="chip {{form.affectsNode === item ? 'on' : ''}}" wx:for="{{yesNo}}" wx:key="*this" data-value="{{item}}" bindtap="onAffects">{{item}}</view></view>
    </view>
    <view class="btn btn-primary" bindtap="submitChange">提交变更（通知销售确认）</view>
  </block>

  <block wx:if="{{overlay === 'confirm'}}">
    <view class="card-sub">接受后新截止立即生效并自动重算进度；拒绝必须填理由，且会立即升级主管裁定。</view>
    <view class="row"><text class="row-label">任务</text><text class="row-value">{{form.taskName}}</text></view>
    <view class="row"><text class="row-label">发起人</text><text class="row-value">{{form.initiator}}</text></view>
    <view class="row"><text class="row-label">原截止 → 新截止</text><text class="row-value">{{form.originalDue}} → {{form.requestedDue}}</text></view>
    <view class="row"><text class="row-label">延期原因</text><text class="row-value" style="font-size:24rpx">{{form.reason}}</text></view>
    <view class="field"><text class="field-label">确认意见（拒绝时必填）</text>
      <textarea class="textarea" value="{{form.comment}}" data-field="comment" bindinput="onForm" placeholder="接受可留空；拒绝请写明理由" /></view>
    <view class="btn btn-primary" bindtap="acceptChange">接受变更</view>
    <view class="btn btn-ghost" bindtap="rejectChange">拒绝并升级主管裁定</view>
  </block>

  <block wx:if="{{overlay === 'manager'}}">
    <view class="card-sub">销售已拒绝，需主管裁定。裁定意见必填；超 48h 未裁定将升级总监。</view>
    <view class="row"><text class="row-label">销售拒绝理由</text><text class="row-value" style="font-size:24rpx">{{form.salesComment}}</text></view>
    <view class="field"><text class="field-label">裁定结果<text class="req">*</text></text>
      <picker range="{{decisionNames}}" value="{{decisionIndex}}" bindchange="onDecisionPick"><view class="picker">{{decisionNames[decisionIndex]}}</view></picker>
    </view>
    <view wx:if="{{decisionIndex === 2}}" class="field"><text class="field-label">折中日期<text class="req">*</text></text>
      <picker mode="date" value="{{form.managerDate}}" bindchange="onManagerDate"><view class="picker">{{form.managerDate}}</view></picker>
    </view>
    <view class="field"><text class="field-label">裁定意见<text class="req">*</text></text>
      <textarea class="textarea" value="{{form.managerComment}}" data-field="managerComment" bindinput="onForm" placeholder="写明裁定依据" /></view>
    <view class="btn btn-primary" bindtap="submitManager">提交裁定</view>
  </block>

  <block wx:if="{{overlay === 'complaint'}}">
    <view class="card-sub">客诉是独立事件，会自动拉高该商机的进度风险；可另行发起售后单。</view>
    <view class="field"><text class="field-label">客诉级别</text>
      <picker range="{{complaintLevels}}" value="{{complaintLevelIndex}}" bindchange="onComplaintLevel"><view class="picker">{{complaintLevels[complaintLevelIndex]}}</view></picker>
    </view>
    <view class="field"><text class="field-label">发生日期</text>
      <picker mode="date" value="{{form.date}}" bindchange="onComplaintDate"><view class="picker">{{form.date}}</view></picker>
    </view>
    <view class="field"><text class="field-label">关联货号 / 批次</text>
      <input class="input" value="{{form.sku}}" data-field="sku" bindinput="onForm" placeholder="可留空" /></view>
    <view class="field"><text class="field-label">客诉描述<text class="req">*</text></text>
      <textarea class="textarea" value="{{form.desc}}" data-field="desc" bindinput="onForm" placeholder="客户反馈的问题现象" /></view>
    <view class="btn btn-primary" bindtap="submitComplaint">登记客诉</view>
  </block>

  <block wx:if="{{overlay === 'audit'}}">
    <view wx:if="{{auditList.length === 0}}" class="empty">暂无审计记录</view>
    <view wx:for="{{auditList}}" wx:key="id" class="sub-item">
      <view class="sub-row"><text class="list-title" style="font-size:24rpx">{{item.action}}</text><text class="lane-meta">{{item.at}}</text></view>
      <view class="list-desc">{{item.by}} · {{item.fromText}} → {{item.toText}}</view>
      <view wx:if="{{item.reason}}" class="list-desc">原因：{{item.reason}}</view>
    </view>
  </block>

  <view wx:if="{{msg}}" class="notice" style="margin-top:16rpx;margin-bottom:0">{{msg}}</view>
  <view class="btn btn-light" bindtap="closeOverlay">关闭</view>
</view>
