feat: Batch 2 - inspection & maintenance pages (12 pages)

Agent Loop: 3 agents, all passed
- Inspection: index/detail, records index/detail
- InspectionProblem: index/detail/management
- Maintenance: index/detail, records index/detail, check index
This commit is contained in:
Ubuntu
2026-06-15 21:11:12 +08:00
parent d1612fe376
commit 7cd91082d6
14 changed files with 1925 additions and 0 deletions

View File

@@ -0,0 +1,221 @@
<script setup lang="ts">
/**
* 问题工单管理页
*
* 支持工单表单编辑和流程分派。
*/
import { ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { showToast } from 'vant'
const router = useRouter()
const route = useRoute()
const orderId = (route.params.detail || route.query.id) as string
/** 表单数据 */
const formData = ref({
title: '',
facility: '',
severity: 'medium',
address: '',
description: '',
assignee: '',
})
/** 设施选项 */
const facilityOptions = [
{ text: '供水管网', value: '供水管网' },
{ text: '阀门井', value: '阀门井' },
{ text: '水表', value: '水表' },
{ text: '消防栓', value: '消防栓' },
{ text: '泵站', value: '泵站' },
]
/** 严重程度选项 */
const severityOptions = [
{ 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 = [
{ text: '李工', value: '李工' },
{ text: '王工', value: '王工' },
{ text: '赵工', value: '赵工' },
{ text: '孙工', value: '孙工' },
]
/** 确认设施选择 */
function onConfirmFacility({ selectedOptions }: any) {
formData.value.facility = selectedOptions[0]?.text || ''
showFacilityPicker.value = false
}
/** 确认严重程度 */
function onConfirmSeverity({ selectedOptions }: any) {
formData.value.severity = selectedOptions[0]?.value || 'medium'
showSeverityPicker.value = false
}
/** 确认责任人 */
function onConfirmAssignee({ selectedOptions }: any) {
formData.value.assignee = selectedOptions[0]?.text || ''
showAssigneePicker.value = false
}
/** 提交表单 */
function onSubmit() {
if (!formData.value.title) {
showToast('请输入工单标题')
return
}
if (!formData.value.address) {
showToast('请输入问题地址')
return
}
showToast('工单提交成功')
router.back()
}
</script>
<template>
<div class="management-page">
<van-nav-bar title="工单管理" left-text="返回" left-arrow fixed placeholder @click-left="router.back()" />
<van-form @submit="onSubmit" class="form-wrapper">
<van-cell-group title="工单信息" class="form-group">
<!-- 工单标题 -->
<van-field
v-model="formData.title"
name="title"
label="工单标题"
placeholder="请输入工单标题"
:rules="[{ required: true, message: '请输入工单标题' }]"
/>
<!-- 设施类型 -->
<van-field
v-model="formData.facility"
is-link
readonly
name="facility"
label="设施类型"
placeholder="请选择设施类型"
@click="showFacilityPicker = true"
/>
<van-popup v-model:show="showFacilityPicker" round position="bottom">
<van-picker
:columns="facilityOptions"
@confirm="onConfirmFacility"
@cancel="showFacilityPicker = false"
/>
</van-popup>
<!-- 严重程度 -->
<van-field
:model-value="severityOptions.find(o => o.value === formData.severity)?.text || '请选择'"
is-link
readonly
name="severity"
label="严重程度"
@click="showSeverityPicker = true"
/>
<van-popup v-model:show="showSeverityPicker" round position="bottom">
<van-picker
:columns="severityOptions"
@confirm="onConfirmSeverity"
@cancel="showSeverityPicker = false"
/>
</van-popup>
<!-- 问题地址 -->
<van-field
v-model="formData.address"
name="address"
label="问题地址"
placeholder="请输入问题地址"
:rules="[{ required: true, message: '请输入问题地址' }]"
/>
<!-- 问题描述 -->
<van-field
v-model="formData.description"
name="description"
label="问题描述"
type="textarea"
rows="3"
autosize
placeholder="请输入问题描述"
maxlength="500"
show-word-limit
/>
</van-cell-group>
<van-cell-group title="流程分派" class="form-group">
<!-- 责任人 -->
<van-field
v-model="formData.assignee"
is-link
readonly
name="assignee"
label="责任人"
placeholder="请选择责任人"
@click="showAssigneePicker = true"
/>
<van-popup v-model:show="showAssigneePicker" round position="bottom">
<van-picker
:columns="assigneeOptions"
@confirm="onConfirmAssignee"
@cancel="showAssigneePicker = false"
/>
</van-popup>
</van-cell-group>
<!-- 提交按钮 -->
<div class="submit-area">
<van-button round block type="primary" native-type="submit">
提交工单
</van-button>
</div>
</van-form>
</div>
</template>
<style lang="scss" scoped>
.management-page {
min-height: 100vh;
background: var(--color-bg-page);
padding-bottom: 24px;
: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;
}
}
.form-wrapper {
margin-top: 0;
}
.form-group {
margin-top: 8px;
}
.submit-area {
padding: 24px 16px;
}
</style>