feat(web): 差旅领导意见事件结构化与申请审批信息增强

- applicationApproval 新增按日期/时间/审批角色拆分格式化,buildLeaderApprovalEvents 补充 dateLabel/timeLabel/roleLabel 字段
- TravelRequestDetailView 领导意见事件改为日期+时间+审批人结构化展示,travel-request-detail-view.css 重构对应样式
- travelReimbursementAttachmentModel 微调附件标识,同步更新 application-approval-info、travel-request-detail-leader-approval、attachment-association-confirmation 测试
- 更新公司通信费报销规则表
This commit is contained in:
caoxiaozhu
2026-06-21 23:24:09 +08:00
parent 88e91a5900
commit 669d22e71f
8 changed files with 329 additions and 186 deletions

View File

@@ -129,11 +129,20 @@ test('approval-mode detail collects leader opinion inside confirm dialog before
assert.match(detailTemplate, /v-for="event in leaderApprovalEvents"/)
assert.match(detailTemplate, /class="application-leader-opinion-event"/)
assert.match(detailTemplate, /event\.type === 'returned'/)
assert.match(detailTemplate, /class="application-leader-opinion-event-time"/)
assert.match(detailTemplate, /event\.dateLabel/)
assert.match(detailTemplate, /event\.timeLabel/)
assert.match(detailTemplate, /class="application-leader-opinion-event-rail"/)
assert.match(detailTemplate, /class="application-leader-opinion-event-status"/)
assert.match(detailTemplate, /class="application-leader-opinion-event-body"/)
assert.match(detailTemplate, /审批意见/)
assert.match(detailTemplate, /:title="event\.title"/)
assert.match(detailTemplate, /class="application-leader-opinion-record"/)
assert.match(detailTemplate, /class="application-leader-opinion-record-head"/)
assert.match(detailTemplate, /class="application-leader-opinion-record-title"/)
assert.match(detailTemplate, /class="application-leader-opinion-record-meta"/)
assert.match(detailTemplate, /event\.operator/)
assert.match(detailTemplate, /event\.role/)
assert.match(detailTemplate, /event\.opinion/)
assert.match(detailTemplate, /class="application-leader-opinion-event-foot"/)
assert.match(detailTemplate, /class="application-leader-opinion-operator"/)
assert.doesNotMatch(detailTemplate, /leaderApprovalReadonlyText/)
assert.doesNotMatch(detailTemplate, /\u5f85\u76f4\u5c5e\u9886\u5bfc\u586b\u5199\u5ba1\u6279\u610f\u89c1/)
assert.match(detailTemplate, /领导意见/)
@@ -200,22 +209,33 @@ test('approval-mode detail collects leader opinion inside confirm dialog before
assert.match(confirmDialog, /\.shared-confirm-card--approval \.shared-confirm-body \{[\s\S]*max-height: min\(270px, calc\(100dvh - 238px\)\);/)
assert.match(confirmDialog, /\.shared-confirm-card--approval \.shared-confirm-btn \{[\s\S]*min-width: 118px;[\s\S]*min-height: 38px;/)
const leaderOpinionPanelRule = detailStyles.match(/^\.application-leader-opinion \{[\s\S]*?\n\}/m)?.[0] ?? ''
const leaderOpinionTimelineRule = detailStyles.match(/^\.application-leader-opinion-timeline \{[\s\S]*?\n\}/m)?.[0] ?? ''
const leaderOpinionEventRule = detailStyles.match(/^\.application-leader-opinion-event \{[\s\S]*?\n\}/m)?.[0] ?? ''
assert.match(detailStyles, /\.detail-card-title-with-icon \{[\s\S]*display: inline-flex;[\s\S]*align-items: center;[\s\S]*gap: 8px;/)
assert.match(detailStyles, /\.detail-card-title-with-icon i \{[\s\S]*font-size: 18px;[\s\S]*line-height: 1;/)
assert.match(detailStyles, /\.application-leader-opinion-head span \{[\s\S]*display: inline-flex;[\s\S]*align-items: center;[\s\S]*gap: 8px;/)
assert.match(leaderOpinionPanelRule, /border-top: 1px solid #e5edf5;/)
assert.match(leaderOpinionPanelRule, /background: #ffffff;/)
assert.doesNotMatch(leaderOpinionPanelRule, /linear-gradient|box-shadow/)
assert.doesNotMatch(detailStyles, /\.leader-approval-card/)
assert.doesNotMatch(detailStyles, /\.inline-leader-opinion/)
assert.match(detailStyles, /\.application-leader-opinion-timeline \{/)
assert.match(detailStyles, /\.application-leader-opinion-timeline\.is-single \{[\s\S]*padding-left: 0;/)
assert.match(detailStyles, /\.application-leader-opinion-timeline\.is-single::before,[\s\S]*\.application-leader-opinion-timeline\.is-single \.application-leader-opinion-event::before \{[\s\S]*display: none;/)
assert.match(leaderOpinionTimelineRule, /gap: 0;/)
assert.match(leaderOpinionTimelineRule, /padding: 2px 0 0;/)
assert.match(detailStyles, /\.application-leader-opinion-event \{/)
assert.match(detailStyles, /\.application-leader-opinion-event \{[\s\S]*border-left: 4px solid var\(--leader-opinion-tone/)
assert.match(detailStyles, /\.application-leader-opinion-event-status \{[\s\S]*border-radius: 999px;/)
assert.match(detailStyles, /\.application-leader-opinion-event-body \{[\s\S]*background: var\(--leader-opinion-soft-bg/)
assert.match(detailStyles, /\.application-leader-opinion-event-body p \{[\s\S]*font-size: 15px;/)
assert.match(detailStyles, /\.application-leader-opinion-event-foot span \{[\s\S]*border-radius: 999px;/)
assert.match(detailStyles, /\.application-leader-opinion-event\.danger::before \{/)
assert.match(detailStyles, /\.application-leader-opinion-event\.success::before \{/)
assert.match(leaderOpinionEventRule, /grid-template-columns: 104px 28px minmax\(0, 1fr\);/)
assert.match(leaderOpinionEventRule, /padding: 0 0 16px;/)
assert.doesNotMatch(leaderOpinionEventRule, /linear-gradient|box-shadow/)
assert.match(detailStyles, /\.application-leader-opinion-event-time \{[\s\S]*justify-items: end;[\s\S]*font-variant-numeric: tabular-nums;/)
assert.match(detailStyles, /\.application-leader-opinion-event-rail \{[\s\S]*justify-content: center;/)
assert.match(detailStyles, /\.application-leader-opinion-event-rail::after \{[\s\S]*width: 2px;[\s\S]*background: #e2e8f0;/)
assert.match(detailStyles, /\.application-leader-opinion-event-status \{[\s\S]*width: 22px;[\s\S]*height: 22px;[\s\S]*border-radius: 999px;/)
assert.match(detailStyles, /\.application-leader-opinion-record \{[\s\S]*border-bottom: 1px solid #edf2f7;[\s\S]*background: #ffffff;/)
assert.match(detailStyles, /\.application-leader-opinion-record-meta \{[\s\S]*display: flex;[\s\S]*gap: 6px 16px;/)
assert.match(detailStyles, /\.application-leader-opinion-record p \{[\s\S]*background: #f8fafc;[\s\S]*font-size: 14px;/)
assert.match(detailStyles, /\.application-leader-opinion-event\.danger \{[\s\S]*--leader-opinion-tone: #dc2626;/)
assert.match(detailStyles, /\.application-leader-opinion-event\.success \{[\s\S]*--leader-opinion-tone: #16a34a;/)
assert.match(reimbursementService, /export function approveExpenseClaim\(claimId, payload = \{\}\)/)
assert.match(reimbursementService, /\/approve/)