173 lines
9.3 KiB
Plaintext
173 lines
9.3 KiB
Plaintext
<scroll-view
|
|
class="page safe-bottom"
|
|
scroll-y
|
|
type="list"
|
|
scroll-top="{{scrollTop}}"
|
|
scroll-anchoring="{{true}}"
|
|
refresher-enabled
|
|
refresher-triggered="{{refreshing}}"
|
|
bindscroll="onScroll"
|
|
bindrefresherrefresh="onPullDownRefresh"
|
|
>
|
|
<view class="header">
|
|
<view class="records-header-row">
|
|
<view class="records-header-main">
|
|
<text class="title">{{title}}</text>
|
|
<text class="subtitle">支持按日期和状态筛选,点击记录查看明细</text>
|
|
</view>
|
|
<view class="top-action-group">
|
|
<view class="void-filter-switch">
|
|
<text>过滤作废</text>
|
|
<switch checked="{{filterVoided}}" color="#1463ff" bindchange="onFilterVoidedChange" />
|
|
</view>
|
|
<button class="btn mini secondary detail-toggle" bindtap="toggleDetails">
|
|
{{detailExpandedAll ? '收起明细' : '展开明细'}}
|
|
</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="filter-bar date-filter-bar">
|
|
<view class="date-filter-cell">
|
|
<button class="date-step-btn" bindtap="decreaseStartDate">-</button>
|
|
<picker mode="date" value="{{startDate}}" bindchange="onStartChange">
|
|
<view class="picker">{{startDate || '开始日期'}}</view>
|
|
</picker>
|
|
</view>
|
|
<view class="date-filter-cell end">
|
|
<button class="date-step-btn" bindtap="increaseEndDate">+</button>
|
|
<picker mode="date" value="{{endDate}}" bindchange="onEndChange">
|
|
<view class="picker">{{endDate || '结束日期'}}</view>
|
|
</picker>
|
|
</view>
|
|
</view>
|
|
|
|
<view wx:if="{{showStatusFilter}}" class="status-row">
|
|
<button
|
|
wx:for="{{statusOptions}}"
|
|
wx:key="value"
|
|
class="status-btn {{status === item.value ? 'active' : ''}}"
|
|
data-value="{{item.value}}"
|
|
bindtap="chooseStatus"
|
|
>
|
|
{{item.label}}
|
|
</button>
|
|
</view>
|
|
|
|
<view wx:if="{{!rows.length}}" class="list-empty">暂无记录</view>
|
|
<view
|
|
wx:for="{{rows}}"
|
|
wx:key="id"
|
|
id="record-{{item.id}}"
|
|
class="card record-card {{item.isSystemAutoSubmitted ? 'system-auto' : ''}} {{item.isVoided ? 'voided' : ''}} {{expandedRecordId == item.id || detailExpandedAll ? 'expanded' : ''}}"
|
|
data-id="{{item.id}}"
|
|
bindtap="toggleRecordDetail"
|
|
>
|
|
<text wx:if="{{item.isVoided}}" class="voided-watermark">作废</text>
|
|
<text wx:elif="{{item.isModified}}" class="modified-watermark">更改</text>
|
|
<text wx:if="{{item.isSystemAutoSubmitted}}" class="timeout-watermark">{{item.autoSubmitReason || '超时-系统自动提交'}}</text>
|
|
<text wx:if="{{item.isCleaning}}" class="cleaning-watermark {{item.isSystemAutoSubmitted || item.isVoided || item.isModified ? 'lower-watermark' : ''}}">清洗</text>
|
|
<text wx:if="{{item.hasMisc}}" class="misc-watermark {{item.isSystemAutoSubmitted || item.isVoided || item.isModified ? 'lower-watermark' : ''}}">包含杂活</text>
|
|
<text wx:if="{{item.hasMultiPerson}}" class="multi-person-watermark {{item.isSystemAutoSubmitted || item.isVoided || item.isModified || item.hasMisc || item.isCleaning ? 'lower-watermark' : ''}}">多人协作</text>
|
|
<text wx:if="{{item.hasContinuousDie}}" class="continuous-die-watermark {{item.isSystemAutoSubmitted || item.isVoided || item.isModified || item.hasMisc || item.isCleaning || item.hasMultiPerson ? 'lower-watermark' : ''}} {{item.hasMultiPerson && (item.isSystemAutoSubmitted || item.isVoided || item.isModified || item.hasMisc || item.isCleaning) ? 'third-watermark' : ''}}">连续模</text>
|
|
<view class="row">
|
|
<view class="row-left">
|
|
<text class="value">{{item.employeeName}} · {{item.reportDate}}</text>
|
|
<text class="subtitle">考勤点 {{item.attendancePointName || '-'}}</text>
|
|
<text class="subtitle">{{item.startAtText}} 至 {{item.endAtText}}</text>
|
|
<text class="subtitle">{{item.metrics.shiftDistributionText || ''}}</text>
|
|
<view wx:if="{{item.correctionPairs.length}}" class="correction-list">
|
|
<view wx:for="{{item.correctionPairs}}" wx:key="key" wx:for-item="pair" class="correction-pair">
|
|
<text>{{pair.label}} </text>
|
|
<text class="old-value">{{pair.oldValue}}</text>
|
|
<text> {{pair.newValue}}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<text class="pill {{item.status === 'approved' ? 'success' : item.status === 'pending' ? 'warn' : ''}}">{{item.statusName}}</text>
|
|
</view>
|
|
<view wx:if="{{mode !== 'mine'}}" class="record-action-row">
|
|
<button wx:if="{{mode === 'pending' && !item.isVoided && item.canEdit}}" class="btn secondary record-action-btn" data-id="{{item.id}}" catchtap="openPendingReview">进入审核</button>
|
|
<button wx:if="{{mode === 'audit' && !item.isVoided && item.canEdit}}" class="btn secondary record-action-btn" data-id="{{item.id}}" catchtap="openEditReview">更改</button>
|
|
<button wx:if="{{!item.isVoided && item.canVoid}}" class="btn danger record-action-btn" data-id="{{item.id}}" catchtap="voidReport">作废</button>
|
|
<button wx:if="{{item.isVoided && item.canUnvoid}}" class="btn secondary record-action-btn" data-id="{{item.id}}" catchtap="unvoidReport">撤销作废</button>
|
|
</view>
|
|
<view wx:if="{{(detailExpandedAll || expandedRecordId == item.id) && item.items.length}}" class="record-detail-list">
|
|
<text class="detail-section-title">报工明细</text>
|
|
<view
|
|
wx:for="{{item.items}}"
|
|
wx:key="id"
|
|
wx:for-item="detail"
|
|
class="record-detail-item {{detail.isMultiPerson || detail.isContinuousDie ? 'marked-detail-item' : ''}} {{detail.isMultiPerson && detail.isContinuousDie ? 'stacked-detail-item' : ''}}"
|
|
>
|
|
<text wx:if="{{detail.isMultiPerson}}" class="detail-multi-stamp">多人协作</text>
|
|
<text wx:if="{{detail.isContinuousDie}}" class="detail-continuous-stamp {{detail.isMultiPerson ? 'lower-detail-stamp' : ''}}">连续模</text>
|
|
<view class="row detail-head">
|
|
<view class="row-left">
|
|
<text class="detail-product">{{detail.displayName || detail.productName || '-'}}</text>
|
|
<text class="detail-meta">考勤点 {{detail.attendancePointName || item.attendancePointName || '-'}}</text>
|
|
<text class="detail-meta">项目 {{detail.projectNo || '-'}} · 工序 {{detail.process || '-'}}</text>
|
|
<text class="detail-meta">冲压方式 {{detail.stampingMethod || '-'}}</text>
|
|
<text class="detail-meta">材料库存批次号 {{detail.rawMaterialBatchNo || '-'}}</text>
|
|
</view>
|
|
<text class="pill primary device-pill">{{detail.deviceNo || '-'}}</text>
|
|
</view>
|
|
<view class="detail-qty-grid">
|
|
<view>
|
|
<text class="label">{{detail.isMisc ? '处理杂活' : (detail.isCleaning ? '清洗数量' : '成品数量')}}</text>
|
|
<text class="value">{{detail.isMisc ? '不计产量' : detail.goodQty}}</text>
|
|
</view>
|
|
<view wx:if="{{!detail.isCleaning && !detail.isMisc}}">
|
|
<text class="label">不良数量</text>
|
|
<text class="value">{{detail.defectQty}}</text>
|
|
</view>
|
|
<view>
|
|
<text class="label">工时</text>
|
|
<text class="value">{{detail.workTimeText}}</text>
|
|
</view>
|
|
<view wx:if="{{detail.isMisc}}">
|
|
<text class="label">杂活事项</text>
|
|
<text class="value">{{detail.remark || '待备注'}}</text>
|
|
</view>
|
|
<view wx:if="{{!detail.isCleaning && !detail.isMisc}}">
|
|
<text class="label">实际节拍</text>
|
|
<text class="value {{detail.beatCompareClass}}">
|
|
{{detail.actualBeat}} 秒
|
|
<text wx:if="{{detail.beatReason}}" class="metric-reason">{{detail.beatReason}}</text>
|
|
</text>
|
|
</view>
|
|
<view wx:if="{{!detail.isCleaning && !detail.isMisc}}">
|
|
<text class="label">节拍对比</text>
|
|
<text class="value {{detail.beatCompareClass}}">{{detail.paceText}}</text>
|
|
</view>
|
|
<view wx:if="{{!detail.isCleaning && !detail.isMisc}}">
|
|
<text class="label">工作量对比</text>
|
|
<text class="value {{detail.workloadCompareClass}}">{{detail.workloadText}}</text>
|
|
</view>
|
|
<view wx:if="{{detail.isContinuousDie}}">
|
|
<text class="label">换料次数</text>
|
|
<text class="value">{{detail.changeoverCount || 0}}</text>
|
|
</view>
|
|
</view>
|
|
<view wx:if="{{detail.correctionPairs.length}}" class="correction-list detail-corrections">
|
|
<view wx:for="{{detail.correctionPairs}}" wx:key="key" wx:for-item="pair" class="correction-pair">
|
|
<text>{{pair.label}} </text>
|
|
<text class="old-value">{{pair.oldValue}}</text>
|
|
<text> {{pair.newValue}}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="button-row pager-row" wx:if="{{rows.length}}">
|
|
<button class="btn secondary pager-nav" bindtap="prevPage" disabled="{{page <= 1}}">上一页</button>
|
|
<view class="page-jump-control">
|
|
<input class="page-jump-input" type="number" confirm-type="done" value="{{pageInput}}" bindinput="onPageInput" bindconfirm="jumpToPage" />
|
|
<text class="page-total-label">/ {{totalPages}}</text>
|
|
<text class="page-jump-action" bindtap="jumpToPage">跳</text>
|
|
</view>
|
|
<button class="btn secondary pager-nav" bindtap="nextPage" disabled="{{page >= totalPages}}">下一页</button>
|
|
</view>
|
|
</scroll-view>
|