2026-10-09 22:46:32 +08:00
|
|
|
<!-- 红娘工作台(ZC-MM-002:普通红娘仅见本人有效分配,无接单) -->
|
2026-09-09 22:05:00 +08:00
|
|
|
<view class="page">
|
|
|
|
|
<!-- 欢迎区 -->
|
|
|
|
|
<view class="header">
|
|
|
|
|
<view class="header-top">
|
|
|
|
|
<view class="avatar">👩</view>
|
|
|
|
|
<view class="greeting-wrap">
|
|
|
|
|
<view class="greeting">您好,{{operatorName}}</view>
|
|
|
|
|
<view class="date">{{currentDate}}</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="header-badge">公益红娘</view>
|
|
|
|
|
|
|
|
|
|
<!-- 数据概览 -->
|
|
|
|
|
<view class="stats-container">
|
|
|
|
|
<view class="stat-card" hover-class="stat-hover">
|
|
|
|
|
<view class="stat-icon pending">📋</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="stat-info">
|
|
|
|
|
<view class="stat-value">{{pendingCount}}</view>
|
|
|
|
|
<view class="stat-label">待分配</view>
|
|
|
|
|
</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
<view class="stat-card" hover-class="stat-hover">
|
|
|
|
|
<view class="stat-icon progress">⏳</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="stat-info">
|
|
|
|
|
<view class="stat-value">{{inProgressCount}}</view>
|
|
|
|
|
<view class="stat-label">进行中</view>
|
|
|
|
|
</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
<view class="stat-card" hover-class="stat-hover">
|
|
|
|
|
<view class="stat-icon completed">✅</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="stat-info">
|
|
|
|
|
<view class="stat-value">{{completedCount}}</view>
|
|
|
|
|
<view class="stat-label">已完成</view>
|
|
|
|
|
</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
<view class="stat-card" hover-class="stat-hover">
|
|
|
|
|
<view class="stat-icon today">📅</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="stat-info">
|
|
|
|
|
<view class="stat-value">{{todayCount}}</view>
|
|
|
|
|
<view class="stat-label">今日</view>
|
|
|
|
|
</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
2026-10-09 22:46:32 +08:00
|
|
|
<!-- 我的服务对象分配 -->
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="section section-compact" wx:if="{{!loading}}">
|
2026-09-09 22:05:00 +08:00
|
|
|
<view class="section-header">
|
|
|
|
|
<view class="section-title-wrap">
|
|
|
|
|
<text class="section-dot"></text>
|
2026-10-09 22:46:32 +08:00
|
|
|
<text class="section-title">我的服务对象分配</text>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
2026-10-09 22:46:32 +08:00
|
|
|
<text class="section-count" wx:if="{{assignmentCount > 0}}">共{{assignmentCount}}人</text>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
|
2026-10-09 22:46:32 +08:00
|
|
|
<view class="service-list" wx:if="{{myAssignments.length > 0}}">
|
|
|
|
|
<view
|
|
|
|
|
wx:for="{{myAssignments}}"
|
|
|
|
|
wx:key="id"
|
2026-09-09 22:05:00 +08:00
|
|
|
class="service-card"
|
|
|
|
|
data-id="{{item.serviceId}}"
|
2026-10-15 09:47:31 +08:00
|
|
|
data-index="{{index}}"
|
2026-09-09 22:05:00 +08:00
|
|
|
bindtap="onViewService"
|
|
|
|
|
>
|
|
|
|
|
<view class="service-left">
|
|
|
|
|
<view class="service-header">
|
2026-10-09 22:46:32 +08:00
|
|
|
<view class="service-tag">{{assignmentScopeLabel(item.assignmentScope)}}</view>
|
|
|
|
|
<view class="service-tag">{{assignmentStatusLabel(item.status)}}</view>
|
|
|
|
|
<view class="service-time">{{formatTime(item.assignedAt)}}</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="service-name">{{item.userDisplayName || '未设置姓名'}} <text wx:if="{{item.userDisplayNumber}}">{{item.userDisplayNumber}}</text></view>
|
|
|
|
|
<view class="service-desc">{{item.userAge ? item.userAge + '岁 · ' : ''}}{{item.userRegionName || '地区未设置'}}</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
2026-10-15 09:47:31 +08:00
|
|
|
<button class="detail-btn" size="mini" catchtap="onViewService" data-id="{{item.serviceId}}" data-index="{{index}}">查看详情</button>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="empty-state empty-compact" wx:else>
|
2026-09-09 22:05:00 +08:00
|
|
|
<view class="empty-illustration">📭</view>
|
2026-10-09 22:46:32 +08:00
|
|
|
<view class="empty-text">暂无服务对象分配</view>
|
|
|
|
|
<view class="empty-hint">分配给你的服务对象将在这里展示</view>
|
2026-09-09 22:05:00 +08:00
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
2026-10-15 09:47:31 +08:00
|
|
|
<view class="section section-compact" wx:if="{{!loading}}">
|
|
|
|
|
<view class="section-header">
|
|
|
|
|
<view class="section-title-wrap">
|
|
|
|
|
<text class="section-dot"></text>
|
|
|
|
|
<text class="section-title">转介任务</text>
|
|
|
|
|
</view>
|
|
|
|
|
<text class="section-count">共{{referralTasks.length}}条</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="auth-list" wx:if="{{referralTasks.length}}">
|
|
|
|
|
<view class="auth-card" wx:for="{{referralTasks}}" wx:key="id">
|
|
|
|
|
<view class="auth-row">
|
|
|
|
|
<text class="auth-channel">{{item.typeLabel}}</text>
|
|
|
|
|
<text class="auth-status">{{item.statusLabel}}</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="auth-purpose">{{item.targetLabel}}</view>
|
|
|
|
|
<view class="auth-meta">{{item.timeText}}</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="empty-state empty-compact" wx:else>
|
|
|
|
|
<view class="empty-text">暂无转介记录</view>
|
|
|
|
|
<view class="empty-hint">可从服务对象分配发起公益活动或服务站转介</view>
|
|
|
|
|
</view>
|
|
|
|
|
<button class="submit-btn referral-open-btn" bindtap="openReferral">发起转介</button>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<view wx:if="{{referralDialogVisible}}" class="dialog-mask">
|
|
|
|
|
<view class="dialog-card" catchtap="noop">
|
|
|
|
|
<view class="dialog-title">发起转介</view>
|
|
|
|
|
<picker mode="selector" range="{{referralTargetLabels}}" value="{{referralTargetIndex}}" bindchange="onReferralTargetChange">
|
|
|
|
|
<view class="form-row"><text class="form-label">服务对象</text><text class="form-value">{{referralTargetLabels[referralTargetIndex]}}</text></view>
|
|
|
|
|
</picker>
|
|
|
|
|
<picker mode="selector" range="{{referralTypes}}" value="{{referralTypeIndex}}" bindchange="onReferralTypeChange">
|
|
|
|
|
<view class="form-row"><text class="form-label">转介类型</text><text class="form-value">{{referralTypes[referralTypeIndex]}}</text></view>
|
|
|
|
|
</picker>
|
|
|
|
|
<input class="form-input" value="{{referralTargetId}}" bindinput="onReferralTargetIdInput" placeholder="填写活动或服务站编号" />
|
|
|
|
|
<input wx:if="{{referralTypeIndex === 0}}" class="form-input" value="{{referralNote}}" bindinput="onReferralNoteInput" placeholder="备注(可选)" />
|
|
|
|
|
<view class="dialog-actions">
|
|
|
|
|
<button size="mini" bindtap="closeReferral">取消</button>
|
|
|
|
|
<button size="mini" type="primary" loading="{{submittingReferral}}" bindtap="submitReferral">提交转介</button>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<view class="section" wx:if="{{!loading}}">
|
|
|
|
|
<view class="section-header">
|
|
|
|
|
<view class="section-title-wrap"><text class="section-dot"></text><text class="section-title">推荐进展</text></view>
|
|
|
|
|
<text class="section-count">共{{recommendations.length}}条</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="auth-list" wx:if="{{recommendations.length}}">
|
|
|
|
|
<view class="auth-card" wx:for="{{recommendations}}" wx:key="id">
|
|
|
|
|
<view class="auth-row"><text class="auth-channel">候选建议</text><text class="auth-status">{{item.statusLabel}}</text></view>
|
|
|
|
|
<view class="auth-purpose">推荐对象:{{item.targetUserDisplayNumber || '待生成编号'}}</view>
|
|
|
|
|
<view class="auth-meta">推荐理由:{{item.reason || '未填写'}}</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="empty-state" wx:else><view class="empty-hint">暂无推荐进展,用户将自行决定喜欢或暂不考虑</view></view>
|
|
|
|
|
</view>
|
|
|
|
|
|
2026-10-11 13:08:02 +08:00
|
|
|
<!-- 联系授权(ZC-MM-003 / B1:受控联系,用户单独同意后才可生效) -->
|
|
|
|
|
<view class="section" wx:if="{{!loading}}">
|
|
|
|
|
<view class="section-header">
|
|
|
|
|
<view class="section-title-wrap">
|
|
|
|
|
<text class="section-dot"></text>
|
|
|
|
|
<text class="section-title">联系授权(受控联系)</text>
|
|
|
|
|
</view>
|
|
|
|
|
<text class="section-count" wx:if="{{contactAuthCount > 0}}">共{{contactAuthCount}}条</text>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 申请入口:对本人分配对象发起,purpose 必填 -->
|
|
|
|
|
<view class="contact-form" wx:if="{{contactTargets.length > 0}}">
|
|
|
|
|
<picker mode="selector" range="{{contactTargets}}" range-key="label" value="{{contactTargetIndex}}" bindchange="onContactTargetChange">
|
|
|
|
|
<view class="form-row">
|
|
|
|
|
<text class="form-label">服务对象</text>
|
|
|
|
|
<text class="form-value">{{contactTargets[contactTargetIndex].label}}</text>
|
|
|
|
|
</view>
|
|
|
|
|
</picker>
|
|
|
|
|
<picker mode="selector" range="{{contactChannelLabels}}" value="{{contactChannelIndex}}" bindchange="onContactChannelChange">
|
|
|
|
|
<view class="form-row">
|
|
|
|
|
<text class="form-label">联系渠道</text>
|
|
|
|
|
<text class="form-value">{{contactChannelLabels[contactChannelIndex]}}</text>
|
|
|
|
|
</view>
|
|
|
|
|
</picker>
|
|
|
|
|
<view class="form-row">
|
|
|
|
|
<text class="form-label">授权目的</text>
|
|
|
|
|
<input class="form-input" value="{{contactPurpose}}" bindinput="onContactPurposeInput"
|
|
|
|
|
placeholder="必填:说明为何需要联系该用户" maxlength="200" />
|
|
|
|
|
</view>
|
|
|
|
|
<view class="form-hint">提交后须经平台审批,并由用户单独确认同意后授权方可生效</view>
|
|
|
|
|
<button class="submit-btn" size="mini" bindtap="submitContactRequest" disabled="{{submittingAuth}}">提交申请</button>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="empty-state" wx:else>
|
|
|
|
|
<view class="empty-hint">暂无服务对象分配,无法发起联系授权</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 本人授权列表 -->
|
|
|
|
|
<view class="auth-list" wx:if="{{contactAuths.length > 0}}">
|
|
|
|
|
<view class="auth-card" wx:for="{{contactAuths}}" wx:key="id">
|
|
|
|
|
<view class="auth-row">
|
|
|
|
|
<text class="auth-channel">{{item.channelLabel}}</text>
|
|
|
|
|
<text class="auth-status">{{item.statusLabel}}</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="auth-purpose">{{item.purpose}}</view>
|
|
|
|
|
<view class="auth-meta" wx:if="{{item.expireText}}">有效期至 {{item.expireText}}</view>
|
|
|
|
|
<button class="revoke-btn" size="mini" wx:if="{{item.revocable}}"
|
|
|
|
|
data-id="{{item.id}}" bindtap="revokeContactAuth">撤销</button>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
2026-09-09 22:05:00 +08:00
|
|
|
<!-- 加载中 -->
|
|
|
|
|
<view class="loading-wrap" wx:if="{{loading}}">
|
|
|
|
|
<view class="loading-spinner"></view>
|
|
|
|
|
<text class="loading-text">加载中...</text>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 退出登录 -->
|
|
|
|
|
<view class="footer">
|
|
|
|
|
<button class="logout-btn" bindtap="onLogout">退出登录</button>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|