diff --git a/src/main.ts b/src/main.ts index 2b6acf1..bb1a319 100644 --- a/src/main.ts +++ b/src/main.ts @@ -37,6 +37,9 @@ import { Card, Image, Tag, + Picker, + DatePicker, + ActionSheet, } from 'vant' // ── Vant 样式(组件样式按需引入) ── @@ -118,6 +121,9 @@ const vantComponents = [ Card, Image, Tag, + Picker, + DatePicker, + ActionSheet, ] for (const component of vantComponents) { diff --git a/src/views/inspection/detail.vue b/src/views/inspection/detail.vue index 627a8b3..6d6d399 100644 --- a/src/views/inspection/detail.vue +++ b/src/views/inspection/detail.vue @@ -3,7 +3,7 @@ * 巡检任务详情页 * * 展示任务详细信息,包含基本信息和操作按钮。 - * 可通过路由 query.id 获取任务 id。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -28,16 +28,9 @@ const task = ref({ updateTime: '2025-06-14 17:30:00', }) -const statusMap: Record = { - pending: '待巡检', - in_progress: '巡检中', - completed: '已完成', -} - -const statusColorMap: Record = { - pending: 'warning', - in_progress: 'primary', - completed: 'success', +const statusMap: Record = { pending: '待巡检', in_progress: '巡检中', completed: '已完成' } +const statusColorMap: Record = { + pending: 'warning', in_progress: 'primary', completed: 'success', } /** 开始巡检 */ @@ -53,41 +46,90 @@ function viewRecords() { @@ -95,38 +137,65 @@ function viewRecords() { diff --git a/src/views/inspectionProblem/detail.vue b/src/views/inspectionProblem/detail.vue index 95b45da..1c5a067 100644 --- a/src/views/inspectionProblem/detail.vue +++ b/src/views/inspectionProblem/detail.vue @@ -3,10 +3,11 @@ * 问题工单详情页 * * 展示工单详细信息,支持接单/转派/解决操作。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, subtle shadows. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' -import { showToast } from 'vant' +import { showToast, showConfirmDialog } from 'vant' const router = useRouter() const route = useRoute() @@ -55,9 +56,18 @@ const severityColorMap: Record = { critical: '#ee0a24', } +const severityTagMap: Record = { + low: 'success', + medium: 'warning', + high: 'danger', + critical: 'danger', +} + /** 接单 */ function acceptOrder() { - showToast('已接单') + showConfirmDialog({ title: '确认接单', message: '确认接单处理该工单吗?' }) + .then(() => showToast('已接单')) + .catch(() => {}) } /** 转派 */ @@ -67,53 +77,108 @@ function transferOrder() { /** 解决 */ function resolveOrder() { - showToast('已标记为已解决') + showConfirmDialog({ title: '确认解决', message: '确认标记该工单为已解决吗?' }) + .then(() => showToast('已标记为已解决')) + .catch(() => {}) } @@ -121,46 +186,114 @@ function resolveOrder() { diff --git a/src/views/inspectionProblem/management.vue b/src/views/inspectionProblem/management.vue index 4561894..9ecdb88 100644 --- a/src/views/inspectionProblem/management.vue +++ b/src/views/inspectionProblem/management.vue @@ -3,6 +3,7 @@ * 问题工单管理页 * * 支持工单表单编辑和流程分派。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, picker popups. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -24,7 +25,7 @@ const formData = ref({ }) /** 设施选项 */ -const facilityOptions = [ +const facilityColumns = [ { text: '供水管网', value: '供水管网' }, { text: '阀门井', value: '阀门井' }, { text: '水表', value: '水表' }, @@ -33,55 +34,71 @@ const facilityOptions = [ ] /** 严重程度选项 */ -const severityOptions = [ +const severityColumns = [ { text: '低', value: 'low' }, { text: '中', value: 'medium' }, { text: '高', value: 'high' }, { text: '紧急', value: 'critical' }, ] -/** 设施选择器状态 */ -const showFacilityPicker = ref(false) - -/** 严重程度选择器状态 */ -const showSeverityPicker = ref(false) - -/** 责任人选择器状态 */ -const showAssigneePicker = ref(false) - /** 可选责任人 */ -const assigneeOptions = [ +const assigneeColumns = [ { text: '李工', value: '李工' }, { text: '王工', value: '王工' }, { text: '赵工', value: '赵工' }, { text: '孙工', value: '孙工' }, ] -/** 确认设施选择 */ +// Picker states +const showFacilityPicker = ref(false) +const showSeverityPicker = ref(false) +const showAssigneePicker = ref(false) + +/** Confirm facility picker */ function onConfirmFacility({ selectedOptions }: any) { formData.value.facility = selectedOptions[0]?.text || '' showFacilityPicker.value = false } -/** 确认严重程度 */ +/** Confirm severity picker */ function onConfirmSeverity({ selectedOptions }: any) { formData.value.severity = selectedOptions[0]?.value || 'medium' showSeverityPicker.value = false } -/** 确认责任人 */ +/** Confirm assignee picker */ function onConfirmAssignee({ selectedOptions }: any) { formData.value.assignee = selectedOptions[0]?.text || '' showAssigneePicker.value = false } +/** Get severity text for display */ +function severityText(): string { + return severityColumns.find(o => o.value === formData.value.severity)?.text || '请选择' +} + +/** Get severity tag type */ +function severityTagType(): 'success' | 'warning' | 'danger' { + const map: Record = { + low: 'success', + medium: 'warning', + high: 'danger', + critical: 'danger', + } + return map[formData.value.severity] || 'warning' +} + /** 提交表单 */ function onSubmit() { - if (!formData.value.title) { + if (!formData.value.title.trim()) { showToast('请输入工单标题') return } - if (!formData.value.address) { + if (!formData.value.facility) { + showToast('请选择设施类型') + return + } + if (!formData.value.address.trim()) { showToast('请输入问题地址') return } @@ -92,130 +109,221 @@ function onSubmit() { diff --git a/src/views/inspectionRecords/detail.vue b/src/views/inspectionRecords/detail.vue index c65a772..7335e1d 100644 --- a/src/views/inspectionRecords/detail.vue +++ b/src/views/inspectionRecords/detail.vue @@ -27,8 +27,8 @@ const record = ref({ /** 模拟问题列表 */ const problemList = ref([ - { id: 1, description: 'DN200闸阀密封圈老化漏水', level: '严重', location: '高新区创新路12号阀井', photos: [] }, - { id: 2, description: 'DN150蝶阀操作手柄锈蚀', level: '一般', location: '高新区创新路28号', photos: [] }, + { id: 1, description: 'DN200闸阀密封圈老化漏水', level: '严重', location: '高新区创新路12号阀井', photos: ['p1', 'p2'] }, + { id: 2, description: 'DN150蝶阀操作手柄锈蚀', level: '一般', location: '高新区创新路28号', photos: ['p3'] }, { id: 3, description: 'DN100排气阀堵塞', level: '轻微', location: '高新区创新路45号', photos: [] }, ]) @@ -40,89 +40,253 @@ const levelColorMap: Record = { diff --git a/src/views/inspectionRecords/index.vue b/src/views/inspectionRecords/index.vue index b2241c2..4a0aa0d 100644 --- a/src/views/inspectionRecords/index.vue +++ b/src/views/inspectionRecords/index.vue @@ -3,7 +3,7 @@ * 巡检记录列表页 * * 支持搜索、日期筛选(全部/今天/本周/本月), - * 点击记录卡片跳转到记录详情。 + * 卡片带照片缩略图,点击跳转记录详情。 */ import { ref, computed } from 'vue' import { useRouter } from 'vue-router' @@ -16,13 +16,13 @@ const searchText = ref('') /** 当前激活的 Tab(日期筛选) */ const activeTab = ref(0) -/** 模拟记录数据 */ +/** 模拟记录数据(含照片缩略图占位) */ const mockRecords = [ - { id: 1, taskName: '管网巡检-城北片区', inspector: '张工', startTime: '2025-06-15 09:00', endTime: '2025-06-15 11:30', result: 'normal', problemCount: 0 }, - { id: 2, taskName: '阀门巡检-高新区', inspector: '李工', startTime: '2025-06-15 14:00', endTime: '2025-06-15 16:00', result: 'abnormal', problemCount: 3 }, - { id: 3, taskName: '水表巡检-老城区', inspector: '王工', startTime: '2025-06-14 08:30', endTime: '2025-06-14 10:00', result: 'normal', problemCount: 0 }, - { id: 4, taskName: '消防栓巡检-商业区', inspector: '孙工', startTime: '2025-06-13 15:00', endTime: '2025-06-13 17:00', result: 'abnormal', problemCount: 1 }, - { id: 5, taskName: '泵站巡检-东区', inspector: '赵工', startTime: '2025-06-10 09:00', endTime: '2025-06-10 11:00', result: 'normal', problemCount: 0 }, + { id: 1, taskName: '管网巡检-城北片区', inspector: '张工', startTime: '2025-06-15 09:00', endTime: '2025-06-15 11:30', result: 'normal', problemCount: 0, photos: 5 }, + { id: 2, taskName: '阀门巡检-高新区', inspector: '李工', startTime: '2025-06-15 14:00', endTime: '2025-06-15 16:00', result: 'abnormal', problemCount: 3, photos: 8 }, + { id: 3, taskName: '水表巡检-老城区', inspector: '王工', startTime: '2025-06-14 08:30', endTime: '2025-06-14 10:00', result: 'normal', problemCount: 0, photos: 3 }, + { id: 4, taskName: '消防栓巡检-商业区', inspector: '孙工', startTime: '2025-06-13 15:00', endTime: '2025-06-13 17:00', result: 'abnormal', problemCount: 1, photos: 6 }, + { id: 5, taskName: '泵站巡检-东区', inspector: '赵工', startTime: '2025-06-10 09:00', endTime: '2025-06-10 11:00', result: 'normal', problemCount: 0, photos: 4 }, ] /** 结果映射 */ @@ -62,7 +62,6 @@ function isThisMonth(dateStr: string) { /** 筛选后的记录列表 */ const filteredRecords = computed(() => { let list = mockRecords - // 搜索筛选 if (searchText.value) { const kw = searchText.value.toLowerCase() list = list.filter(r => @@ -70,14 +69,9 @@ const filteredRecords = computed(() => { r.inspector.toLowerCase().includes(kw) ) } - // 日期筛选 - if (activeTab.value === 1) { - list = list.filter(r => r.startTime.startsWith(today)) - } else if (activeTab.value === 2) { - list = list.filter(r => isThisWeek(r.startTime)) - } else if (activeTab.value === 3) { - list = list.filter(r => isThisMonth(r.startTime)) - } + if (activeTab.value === 1) list = list.filter(r => r.startTime.startsWith(today)) + else if (activeTab.value === 2) list = list.filter(r => isThisWeek(r.startTime)) + else if (activeTab.value === 3) list = list.filter(r => isThisMonth(r.startTime)) return list }) @@ -89,41 +83,105 @@ function goDetail(id: number) { @@ -133,33 +191,134 @@ function goDetail(id: number) { min-height: 100vh; background: var(--color-bg-page); + // NavBar — brand blue bg, white text :deep(.van-nav-bar) { - background: var(--color-primary); - --van-nav-bar-title-text-color: #fff; - --van-nav-bar-text-color: #fff; - --van-nav-bar-icon-color: #fff; + background: #1E74FF; + } + :deep(.van-nav-bar__title) { + color: #fff; + font-size: 18px; + font-weight: 600; + } + :deep(.van-nav-bar__text), + :deep(.van-nav-bar__arrow) { + color: #fff; + } + :deep(.van-nav-bar .van-icon) { + color: #fff; } } -.record-list { - padding: 0 8px; +// Search — rounded, white bg +.search-wrapper { + padding: 8px 12px 0; + background: #F4F7F8; - :deep(.van-card) { - margin: 8px; + :deep(.van-search__content) { border-radius: 10px; - background: var(--color-bg-card); - } - - :deep(.van-tag) { - margin-right: 4px; + background: #fff; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } } -.record-meta { +// Tabs +:deep(.van-tabs) { + background: #fff; +} + +:deep(.van-tabs__wrap) { + padding: 0 8px; +} + +:deep(.van-tab) { + font-size: 14px; +} + +// Record List +.record-list { + padding: 8px 12px 16px; +} + +.record-card { + background: #fff; + border-radius: 10px; + padding: 14px 16px; + margin-bottom: 10px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + transition: box-shadow 0.15s ease; + + &:active { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + } +} + +.record-card__header { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 10px; +} + +.record-card__title { + font-size: 16px; + font-weight: 600; + color: var(--color-text-primary); + flex: 1; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.record-card__badges { + display: flex; + gap: 6px; + flex-shrink: 0; +} + +.record-card__body { display: flex; flex-direction: column; - gap: 2px; - font-size: 12px; - color: var(--color-text-secondary); + gap: 4px; + margin-bottom: 8px; +} + +.record-info { + display: flex; + gap: 16px; + font-size: 13px; + color: var(--color-text-regular); +} + +.info-item { + display: flex; + align-items: center; + gap: 4px; +} + +// Photo Thumbnails +.record-card__photos { + display: flex; + gap: 6px; + padding-top: 8px; + border-top: 1px solid var(--color-border-light); +} + +.photo-thumb { + width: 52px; + height: 52px; + border-radius: 6px; + background: #F2F3F5; + display: flex; + align-items: center; + justify-content: center; + + &--more { + background: #E3F2FD; + color: #1E74FF; + font-size: 13px; + font-weight: 600; + } } diff --git a/src/views/maintenance/detail.vue b/src/views/maintenance/detail.vue index fa0f925..e08c4d2 100644 --- a/src/views/maintenance/detail.vue +++ b/src/views/maintenance/detail.vue @@ -3,11 +3,11 @@ * 养护任务详情页 * * 展示养护任务详细信息,包含基本信息、任务描述和操作按钮。 - * 可通过路由 params.detail 获取任务 id。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' -import { showToast } from 'vant' +import { showToast, showConfirmDialog } from 'vant' const router = useRouter() const route = useRoute() @@ -35,7 +35,7 @@ const statusMap: Record = { completed: '已完成', } -const statusColorMap: Record = { +const statusColorMap: Record = { pending: 'warning', in_progress: 'primary', completed: 'success', @@ -43,7 +43,9 @@ const statusColorMap: Record showToast('已开始养护')) + .catch(() => {}) } /** 查看养护记录 */ @@ -54,42 +56,96 @@ function viewRecords() { @@ -97,38 +153,117 @@ function viewRecords() { diff --git a/src/views/maintenanceCheck/index.vue b/src/views/maintenanceCheck/index.vue index bc32c2d..546d6b7 100644 --- a/src/views/maintenanceCheck/index.vue +++ b/src/views/maintenanceCheck/index.vue @@ -4,6 +4,7 @@ * * 支持搜索、状态筛选(全部/待检查/已检查), * 点击卡片查看检查详情并评分。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, styled tabs. */ import { ref, computed } from 'vue' import { useRouter } from 'vue-router' @@ -26,20 +27,12 @@ const mockChecks = [ ] /** 状态映射 */ -const statusMap: Record = { - pending: '待检查', - checked: '已检查', -} - -const statusColorMap: Record = { - pending: 'warning', - checked: 'success', -} +const statusMap: Record = { pending: '待检查', checked: '已检查' } +const statusColorMap: Record = { pending: 'warning', checked: 'success' } /** 筛选后的检查列表 */ const filteredChecks = computed(() => { let list = mockChecks - // 搜索筛选 if (searchText.value) { const kw = searchText.value.toLowerCase() list = list.filter(c => @@ -49,61 +42,115 @@ const filteredChecks = computed(() => { c.address.toLowerCase().includes(kw) ) } - // 状态筛选 - if (activeTab.value === 1) { - list = list.filter(c => c.status === 'pending') - } else if (activeTab.value === 2) { - list = list.filter(c => c.status === 'checked') - } + if (activeTab.value === 1) list = list.filter(c => c.status === 'pending') + else if (activeTab.value === 2) list = list.filter(c => c.status === 'checked') return list }) -/** 跳转到检查详情 */ +/** 跳转到检查详情 → maintenanceDetail (养护详情/检查详情共用) */ function goDetail(id: number) { - router.push(`/maintenance/detail?id=${id}`) + router.push(`/maintenance/${id}`) } @@ -111,41 +158,112 @@ function goDetail(id: number) { diff --git a/src/views/maintenanceCheckRecords/detail.vue b/src/views/maintenanceCheckRecords/detail.vue index 8408c12..364e36f 100644 --- a/src/views/maintenanceCheckRecords/detail.vue +++ b/src/views/maintenanceCheckRecords/detail.vue @@ -3,6 +3,7 @@ * 养护检查记录详情页 * * 展示检查记录的详细信息,包含基本信息、评分详情、检查内容、照片和结论。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -42,29 +43,22 @@ const record = ref({ ], }) -const resultMap: Record = { - qualified: '合格', - unqualified: '不合格', +const resultMap: Record = { qualified: '合格', unqualified: '不合格' } +const resultColorMap: Record = { qualified: 'success', unqualified: 'danger' } + +/** 评分颜色 class */ +function scoreClass(score: number): string { + if (score >= 90) return 'score-green' + if (score >= 70) return 'score-orange' + return 'score-red' } -const resultColorMap: Record = { - qualified: 'success', - unqualified: 'danger', -} - -/** 评分颜色 */ -function scoreColor(score: number): string { - if (score >= 90) return '#4CAF50' - if (score >= 70) return '#FF9800' - return '#F44336' -} - -/** 单项评分颜色 */ -function itemScoreColor(score: number, maxScore: number): string { +/** 单项评分颜色 class */ +function itemScoreClass(score: number, maxScore: number): string { const ratio = score / maxScore - if (ratio >= 0.9) return '#4CAF50' - if (ratio >= 0.7) return '#FF9800' - return '#F44336' + if (ratio >= 0.9) return 'score-green' + if (ratio >= 0.7) return 'score-orange' + return 'score-red' } /** 预览照片 */ @@ -78,48 +72,98 @@ function previewPhoto(index: number) { diff --git a/src/views/maintenanceCheckRecords/index.vue b/src/views/maintenanceCheckRecords/index.vue index d1d981f..e7f6373 100644 --- a/src/views/maintenanceCheckRecords/index.vue +++ b/src/views/maintenanceCheckRecords/index.vue @@ -4,6 +4,7 @@ * * 展示养护检查记录,支持搜索和结果筛选(全部/合格/不合格), * 卡片中显示评分,点击跳转检查记录详情。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, styled tabs. */ import { ref, computed } from 'vue' import { useRouter } from 'vue-router' @@ -26,21 +27,14 @@ const mockCheckRecords = [ ] /** 结果映射 */ -const resultMap: Record = { - qualified: '合格', - unqualified: '不合格', -} - -const resultColorMap: Record = { - qualified: 'success', - unqualified: 'danger', -} +const resultMap: Record = { qualified: '合格', unqualified: '不合格' } +const resultColorMap: Record = { qualified: 'success', unqualified: 'danger' } /** 评分颜色 */ -function scoreColor(score: number): string { - if (score >= 90) return '#4CAF50' - if (score >= 70) return '#FF9800' - return '#F44336' +function scoreClass(score: number): string { + if (score >= 90) return 'score-green' + if (score >= 70) return 'score-orange' + return 'score-red' } /** 筛选后的记录列表 */ @@ -67,40 +61,83 @@ function goDetail(id: number) { @@ -108,35 +145,111 @@ function goDetail(id: number) { diff --git a/src/views/maintenanceRecords/detail.vue b/src/views/maintenanceRecords/detail.vue index 4a22c95..0da3722 100644 --- a/src/views/maintenanceRecords/detail.vue +++ b/src/views/maintenanceRecords/detail.vue @@ -3,7 +3,7 @@ * 养护记录详情页 * * 展示养护记录的基本信息、养护前后对比照片及评分详情。 - * 可通过路由 query.id 获取记录 id。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -34,149 +34,236 @@ const checkItems = ref([ { name: '螺栓紧固', score: 5, maxScore: 5 }, { name: '润滑保养', score: 2, maxScore: 5 }, ]) + +/** 结果映射 */ +const resultMap: Record = { normal: '正常', abnormal: '异常' } +const resultColorMap: Record = { normal: 'success', abnormal: 'danger' } diff --git a/src/views/maintenanceRecords/index.vue b/src/views/maintenanceRecords/index.vue index 88bd665..690c083 100644 --- a/src/views/maintenanceRecords/index.vue +++ b/src/views/maintenanceRecords/index.vue @@ -4,11 +4,13 @@ * * 支持搜索、日期筛选(全部/今天/本周/本月), * 点击记录卡片跳转到记录详情。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, styled tabs. */ import { ref, computed } from 'vue' -import { useRouter } from 'vue-router' +import { useRouter, useRoute } from 'vue-router' const router = useRouter() +const route = useRoute() /** 搜索关键词 */ const searchText = ref('') @@ -18,11 +20,11 @@ const activeTab = ref(0) /** 模拟养护记录数据 */ const mockRecords = [ - { id: 1, taskName: '管网养护-城北片区', maintainer: '刘工', startTime: '2025-06-15 09:00', endTime: '2025-06-15 11:30', result: 'normal', score: 95 }, - { id: 2, taskName: '阀门养护-高新区', maintainer: '陈工', startTime: '2025-06-15 14:00', endTime: '2025-06-15 16:00', result: 'abnormal', score: 72 }, - { id: 3, taskName: '水表养护-老城区', maintainer: '杨工', startTime: '2025-06-14 08:30', endTime: '2025-06-14 10:00', result: 'normal', score: 88 }, - { id: 4, taskName: '消防栓养护-商业区', maintainer: '周工', startTime: '2025-06-13 15:00', endTime: '2025-06-13 17:00', result: 'abnormal', score: 65 }, - { id: 5, taskName: '泵站养护-东区', maintainer: '吴工', startTime: '2025-06-10 09:00', endTime: '2025-06-10 11:00', result: 'normal', score: 91 }, + { id: 1, taskName: '管网养护-城北片区', maintainer: '刘工', startTime: '2025-06-15 09:00', endTime: '2025-06-15 11:30', result: 'normal', score: 95, address: '城北工业大道1-50号' }, + { id: 2, taskName: '阀门养护-高新区', maintainer: '陈工', startTime: '2025-06-15 14:00', endTime: '2025-06-15 16:00', result: 'abnormal', score: 72, address: '高新区创新路55号' }, + { id: 3, taskName: '水表养护-老城区', maintainer: '杨工', startTime: '2025-06-14 08:30', endTime: '2025-06-14 10:00', result: 'normal', score: 88, address: '老城区中山路88号' }, + { id: 4, taskName: '消防栓养护-商业区', maintainer: '周工', startTime: '2025-06-13 15:00', endTime: '2025-06-13 17:00', result: 'abnormal', score: 65, address: '商业区解放路101号' }, + { id: 5, taskName: '泵站养护-东区', maintainer: '吴工', startTime: '2025-06-10 09:00', endTime: '2025-06-10 11:00', result: 'normal', score: 91, address: '东区滨河路88号' }, ] /** 结果映射 */ @@ -37,14 +39,14 @@ const resultColorMap: Record = { } /** 日期筛选工具函数 */ -function getToday() { +function getToday(): string { const d = new Date() return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}` } const today = getToday() -function isThisWeek(dateStr: string) { +function isThisWeek(dateStr: string): boolean { const d = new Date(dateStr) const now = new Date() const startOfWeek = new Date(now) @@ -53,7 +55,7 @@ function isThisWeek(dateStr: string) { return d >= startOfWeek } -function isThisMonth(dateStr: string) { +function isThisMonth(dateStr: string): boolean { const d = new Date(dateStr) const now = new Date() return d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth() @@ -62,14 +64,17 @@ function isThisMonth(dateStr: string) { /** 筛选后的记录列表 */ const filteredRecords = computed(() => { let list = mockRecords + // 搜索筛选 if (searchText.value) { const kw = searchText.value.toLowerCase() list = list.filter(r => r.taskName.toLowerCase().includes(kw) || - r.maintainer.toLowerCase().includes(kw) + r.maintainer.toLowerCase().includes(kw) || + r.address.toLowerCase().includes(kw) ) } + // 日期筛选 if (activeTab.value === 1) { list = list.filter(r => r.startTime.startsWith(today)) @@ -78,6 +83,7 @@ const filteredRecords = computed(() => { } else if (activeTab.value === 3) { list = list.filter(r => isThisMonth(r.startTime)) } + return list }) @@ -85,45 +91,100 @@ const filteredRecords = computed(() => { function goDetail(id: number) { router.push(`/maintenanceRecords/detail?id=${id}`) } + +/** 格式化时间,只显示时间部分 */ +function formatTime(dateStr: string): string { + // Returns HH:MM from "YYYY-MM-DD HH:MM" + return dateStr.split(' ')[1] || dateStr +} @@ -131,35 +192,132 @@ function goDetail(id: number) { diff --git a/src/views/menuEdit/addGroup.vue b/src/views/menuEdit/addGroup.vue index 71bc3e3..954b99a 100644 --- a/src/views/menuEdit/addGroup.vue +++ b/src/views/menuEdit/addGroup.vue @@ -4,10 +4,11 @@ * * 使用 van-form + van-field 收集分组名称, * 支持添加和编辑两种模式。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px. */ import { ref, computed } from 'vue' import { useRoute, useRouter } from 'vue-router' -import { showToast } from 'vant' +import { showToast, showConfirmDialog } from 'vant' const route = useRoute() const router = useRouter() @@ -56,60 +57,87 @@ function onSubmit() { * 删除分组(仅编辑模式) */ function onDelete() { - // showConfirmDialog would be used here with real API - showToast('删除功能待接入') + showConfirmDialog({ + title: '确认删除', + message: `确定要删除分组「${menuTitle.value}」吗?删除后不可恢复。`, + }) + .then(() => { + showToast('删除成功') + router.back() + }) + .catch(() => { + // cancelled + }) } diff --git a/src/views/problemReport/reportEquipmentRepair.vue b/src/views/problemReport/reportEquipmentRepair.vue index f6a911f..2caa211 100644 --- a/src/views/problemReport/reportEquipmentRepair.vue +++ b/src/views/problemReport/reportEquipmentRepair.vue @@ -7,18 +7,19 @@ */ import { ref } from 'vue' import { useRouter } from 'vue-router' -import { showSuccessToast } from 'vant' +import { showToast } from 'vant' const router = useRouter() /** 表单数据 */ const equipment = ref('') const faultType = ref('') -const description = ref('') const urgency = ref('') +const description = ref('') const photos = ref>([]) -/** 设备选项 */ +/** 设备选择 */ +const showEquipmentPicker = ref(false) const equipmentOptions = [ { text: '水泵', value: 'pump' }, { text: '阀门', value: 'valve' }, @@ -26,8 +27,13 @@ const equipmentOptions = [ { text: '仪表', value: 'meter' }, { text: '管道', value: 'pipe' }, ] +function onEquipmentConfirm({ selectedOptions }: any) { + equipment.value = selectedOptions[0]?.text || '' + showEquipmentPicker.value = false +} -/** 故障类型 */ +/** 故障类型选择 */ +const showFaultPicker = ref(false) const faultTypeOptions = [ { text: '无法启动', value: 'noStart' }, { text: '异常噪音', value: 'noise' }, @@ -35,33 +41,42 @@ const faultTypeOptions = [ { text: '运行不稳定', value: 'unstable' }, { text: '其他故障', value: 'other' }, ] +function onFaultConfirm({ selectedOptions }: any) { + faultType.value = selectedOptions[0]?.text || '' + showFaultPicker.value = false +} -/** 紧急程度 */ -const urgencyColumns = [ - { text: '紧急', value: 'urgent' }, - { text: '一般', value: 'normal' }, - { text: '低', value: 'low' }, +/** 紧急程度选择 */ +const showUrgencyPicker = ref(false) +const urgencyOptions = [ + { text: '紧急(立即处理)', value: 'urgent' }, + { text: '一般(24小时内)', value: 'normal' }, + { text: '低(计划处理)', value: 'low' }, ] +function onUrgencyConfirm({ selectedOptions }: any) { + urgency.value = selectedOptions[0]?.text || '' + showUrgencyPicker.value = false +} /** 提交上报 */ function onSubmit() { if (!equipment.value) { - showSuccessToast('请选择设备') + showToast('请选择设备') return } if (!faultType.value) { - showSuccessToast('请选择故障类型') - return - } - if (!description.value) { - showSuccessToast('请填写描述') + showToast('请选择故障类型') return } if (!urgency.value) { - showSuccessToast('请选择紧急程度') + showToast('请选择紧急程度') return } - showSuccessToast('上报成功') + if (!description.value) { + showToast('请填写故障描述') + return + } + showToast('上报成功') router.back() } @@ -77,15 +92,22 @@ function onSubmit() { /> - + +
+
+ + 设备信息 +
- - -
-
现场照片
-
+ +
+
+ + 现场照片 +
+
+ +
+
+ +
- - 提交上报 + + 提交报修
+ + + + + + + + + + + + + + + + + +
diff --git a/src/views/problemReport/reportFloodedPoints.vue b/src/views/problemReport/reportFloodedPoints.vue index 3e955ea..d822b64 100644 --- a/src/views/problemReport/reportFloodedPoints.vue +++ b/src/views/problemReport/reportFloodedPoints.vue @@ -7,7 +7,7 @@ */ import { ref } from 'vue' import { useRouter } from 'vue-router' -import { showSuccessToast } from 'vant' +import { showToast } from 'vant' const router = useRouter() @@ -16,18 +16,52 @@ const location = ref('') const waterLevel = ref('') const description = ref('') const photos = ref>([]) +const reportTime = ref('') + +/** 位置选择 */ +const showLocationPicker = ref(false) +const locationOptions = [ + { text: '当前定位', value: 'gps' }, + { text: '路口A - 中山路', value: 'loc_a' }, + { text: '路口B - 解放路', value: 'loc_b' }, + { text: '路段C - 建设路', value: 'loc_c' }, +] +function onLocationConfirm({ selectedOptions }: any) { + location.value = selectedOptions[0]?.text || '' + showLocationPicker.value = false +} + +/** 水位选择 */ +const showWaterLevelPicker = ref(false) +const waterLevelColumns = Array.from({ length: 31 }, (_, i) => ({ + text: `${i * 5} cm`, + value: i * 5, +})) +function onWaterLevelConfirm({ selectedOptions }: any) { + waterLevel.value = selectedOptions[0]?.text || '' + showWaterLevelPicker.value = false +} + +/** 时间选择 */ +const showTimePicker = ref(false) +const currentDate = ref(['2024', '01', '01', '12', '00']) +function onTimeConfirm({ selectedValues }: any) { + const [y, m, d, h, min] = selectedValues + reportTime.value = `${y}-${String(Number(m) + 1).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(h).padStart(2, '0')}:${String(min).padStart(2, '0')}` + showTimePicker.value = false +} /** 提交上报 */ function onSubmit() { if (!location.value) { - showSuccessToast('请选择位置') + showToast('请选择位置') return } if (!description.value) { - showSuccessToast('请填写描述') + showToast('请填写描述') return } - showSuccessToast('上报成功') + showToast('上报成功') router.back() } @@ -43,94 +77,220 @@ function onSubmit() { /> - + +
+
+ + 基本信息 +
+ - - -
-
现场照片
-
+ +
+
+ + 现场照片 +
+
+ +
+
+ +
- + 提交上报
+ + + + + + + + + + + + + + + + + +
diff --git a/src/views/problemReport/reportInspection.vue b/src/views/problemReport/reportInspection.vue index aae4648..723fe9f 100644 --- a/src/views/problemReport/reportInspection.vue +++ b/src/views/problemReport/reportInspection.vue @@ -7,7 +7,7 @@ */ import { ref } from 'vue' import { useRouter } from 'vue-router' -import { showSuccessToast } from 'vant' +import { showToast } from 'vant' const router = useRouter() @@ -17,7 +17,8 @@ const problemType = ref('') const description = ref('') const photos = ref>([]) -/** 设施选项 */ +/** 设施选择 */ +const showFacilityPicker = ref(false) const facilityOptions = [ { text: '供水管网', value: 'pipe' }, { text: '阀门井', value: 'valve' }, @@ -25,8 +26,13 @@ const facilityOptions = [ { text: '水表', value: 'meter' }, { text: '泵站', value: 'pump' }, ] +function onFacilityConfirm({ selectedOptions }: any) { + facility.value = selectedOptions[0]?.text || '' + showFacilityPicker.value = false +} -/** 问题类型选项 */ +/** 问题类型选择 */ +const showProblemTypePicker = ref(false) const problemTypeOptions = [ { text: '管道渗漏', value: 'leak' }, { text: '阀门故障', value: 'valveFault' }, @@ -34,22 +40,26 @@ const problemTypeOptions = [ { text: '设施损坏', value: 'damage' }, { text: '其他问题', value: 'other' }, ] +function onProblemTypeConfirm({ selectedOptions }: any) { + problemType.value = selectedOptions[0]?.text || '' + showProblemTypePicker.value = false +} /** 提交上报 */ function onSubmit() { if (!facility.value) { - showSuccessToast('请选择设施') + showToast('请选择设施') return } if (!problemType.value) { - showSuccessToast('请选择问题类型') + showToast('请选择问题类型') return } if (!description.value) { - showSuccessToast('请填写描述') + showToast('请填写描述') return } - showSuccessToast('上报成功') + showToast('上报成功') router.back() } @@ -65,15 +75,22 @@ function onSubmit() { /> - + +
+
+ + 问题信息 +
- - -
-
现场照片
-
+ +
+
+ + 现场照片 +
+
+ +
+
+ +
- + 提交上报
+ + + + + + + + + + + +
diff --git a/src/views/problemReport/reportProject.vue b/src/views/problemReport/reportProject.vue index bd6c925..ba2039d 100644 --- a/src/views/problemReport/reportProject.vue +++ b/src/views/problemReport/reportProject.vue @@ -7,7 +7,7 @@ */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' -import { showSuccessToast } from 'vant' +import { showToast } from 'vant' const router = useRouter() const route = useRoute() @@ -21,7 +21,22 @@ const issueType = ref('') const description = ref('') const photos = ref>([]) -/** 问题类型选项 */ +/** 项目选择 */ +const showProjectPicker = ref(false) +const projectOptions = [ + { text: '供水管网改造项目', value: 'proj_1' }, + { text: '污水处理项目', value: 'proj_2' }, + { text: '雨水排放项目', value: 'proj_3' }, + { text: '河湖治理工程', value: 'proj_4' }, + { text: '智慧水务平台', value: 'proj_5' }, +] +function onProjectConfirm({ selectedOptions }: any) { + project.value = selectedOptions[0]?.text || '' + showProjectPicker.value = false +} + +/** 问题类型选择 */ +const showIssueTypePicker = ref(false) const issueTypeOptions = [ { text: '进度延迟', value: 'delay' }, { text: '质量问题', value: 'quality' }, @@ -29,22 +44,26 @@ const issueTypeOptions = [ { text: '材料问题', value: 'material' }, { text: '其他', value: 'other' }, ] +function onIssueTypeConfirm({ selectedOptions }: any) { + issueType.value = selectedOptions[0]?.text || '' + showIssueTypePicker.value = false +} /** 提交上报 */ function onSubmit() { if (!project.value) { - showSuccessToast('请选择项目') + showToast('请选择项目') return } if (!issueType.value) { - showSuccessToast('请选择问题类型') + showToast('请选择问题类型') return } if (!description.value) { - showSuccessToast('请填写描述') + showToast('请填写描述') return } - showSuccessToast('上报成功') + showToast('上报成功') router.back() } @@ -60,15 +79,22 @@ function onSubmit() { /> - + +
+
+ + 项目信息 +
- - -
-
现场照片
-
+ +
+
+ + 现场照片 +
+
+ +
+
+ +
- + 提交上报
+ + + + + + + + + + + +
diff --git a/src/views/problemReport/reportSupervise.vue b/src/views/problemReport/reportSupervise.vue index 0623339..850c63e 100644 --- a/src/views/problemReport/reportSupervise.vue +++ b/src/views/problemReport/reportSupervise.vue @@ -3,11 +3,11 @@ * 督办问题上报表单 * * 用于上报督办项目中发现的问题, - * 支持可选的 detail 路由参数。 + * 支持可选的 detail 路由参数预填充项目信息。 */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' -import { showSuccessToast } from 'vant' +import { showToast } from 'vant' const router = useRouter() const route = useRoute() @@ -21,21 +21,35 @@ const problem = ref('') const description = ref('') const photos = ref>([]) +/** 项目选择 */ +const showProjectPicker = ref(false) +const projectOptions = [ + { text: '排水管网改造工程', value: 'proj_1' }, + { text: '污水处理厂升级', value: 'proj_2' }, + { text: '雨水泵站建设', value: 'proj_3' }, + { text: '供水管道更新', value: 'proj_4' }, + { text: '河湖治理项目', value: 'proj_5' }, +] +function onProjectConfirm({ selectedOptions }: any) { + project.value = selectedOptions[0]?.text || '' + showProjectPicker.value = false +} + /** 提交上报 */ function onSubmit() { if (!project.value) { - showSuccessToast('请选择督办项目') + showToast('请选择督办项目') return } if (!problem.value) { - showSuccessToast('请选择问题') + showToast('请填写问题标题') return } if (!description.value) { - showSuccessToast('请填写描述') + showToast('请填写描述') return } - showSuccessToast('上报成功') + showToast('上报成功') router.back() } @@ -51,7 +65,12 @@ function onSubmit() { /> - + +
+
+ + 督办信息 +
- - -
-
现场照片
-
+ +
+
+ + 现场照片 +
+
+ +
+
+ +
- + 提交上报
+ + + + + +
diff --git a/src/views/superviseRecord/detail.vue b/src/views/superviseRecord/detail.vue index 45647f1..a3451e4 100644 --- a/src/views/superviseRecord/detail.vue +++ b/src/views/superviseRecord/detail.vue @@ -3,10 +3,11 @@ * 监督记录详情页 * * 展示监督记录的详细信息,包含基本信息、监督内容、现场照片和结论。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' -import { showToast, showImagePreview } from 'vant' +import { showImagePreview } from 'vant' const router = useRouter() const route = useRoute() @@ -61,35 +62,77 @@ function previewPhoto(index: number) { diff --git a/src/views/supervisor/detail.vue b/src/views/supervisor/detail.vue index 017d3c3..bb6f5d3 100644 --- a/src/views/supervisor/detail.vue +++ b/src/views/supervisor/detail.vue @@ -2,7 +2,8 @@ /** * 监督人员详情页 * - * 展示第三方监督人员详细信息,包含基本信息、在岗状态和履职记录。 + * 展示第三方监督人员详细信息,包含基本信息、资质信息和履职统计。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -45,64 +46,242 @@ const statusColorMap: Record = { diff --git a/src/views/supervisor/index.vue b/src/views/supervisor/index.vue index cc60057..1c47966 100644 --- a/src/views/supervisor/index.vue +++ b/src/views/supervisor/index.vue @@ -4,6 +4,7 @@ * * 展示监督人员列表,支持搜索和状态筛选(全部/在岗/离岗), * 点击卡片跳转人员详情。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px. */ import { ref, computed } from 'vue' import { useRouter } from 'vue-router' @@ -60,40 +61,82 @@ function goDetail(id: number) { @@ -101,35 +144,109 @@ function goDetail(id: number) { diff --git a/src/views/yxkjzyRecords/detail.vue b/src/views/yxkjzyRecords/detail.vue index 3bc7f8e..9887ce3 100644 --- a/src/views/yxkjzyRecords/detail.vue +++ b/src/views/yxkjzyRecords/detail.vue @@ -4,6 +4,7 @@ * * 展示有限空间作业的详细信息,包含基本信息、 * 安全条件确认清单、作业审批和参与人员。 + * Design: #1E74FF NavBar, #F4F7F8 bg, white cards border-radius 10px, panel accent bars. */ import { ref, computed } from 'vue' import { useRouter, useRoute } from 'vue-router' @@ -49,16 +50,9 @@ const record = ref({ ], }) -const statusMap: Record = { - pending: '待开始', - in_progress: '进行中', - completed: '已完成', -} - -const statusColorMap: Record = { - pending: 'warning', - in_progress: 'primary', - completed: 'success', +const statusMap: Record = { pending: '待开始', in_progress: '进行中', completed: '已完成' } +const statusColorMap: Record = { + pending: 'warning', in_progress: 'primary', completed: 'success', } /** 安全清单统计 */ @@ -73,70 +67,153 @@ const checklistStats = computed(() => {