From a266a501b2022a8db19a3621b9c7f30345a9180b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 16 九月 2025 15:41:54 +0800
Subject: [PATCH] 结果验证
---
src/pages/equipmentManagement/verification/index.vue | 1520 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,520 insertions(+), 0 deletions(-)
diff --git a/src/pages/equipmentManagement/verification/index.vue b/src/pages/equipmentManagement/verification/index.vue
new file mode 100644
index 0000000..f44d1b9
--- /dev/null
+++ b/src/pages/equipmentManagement/verification/index.vue
@@ -0,0 +1,1520 @@
+<template>
+ <view class="sales-account">
+ <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
+ <PageHeader title="缁撴灉楠岃瘉" @back="goBack" />
+
+ <!-- 宸ュ崟淇℃伅鍗$墖 -->
+ <view class="work-order-card">
+ <view class="order-header">
+ <view class="order-left">
+ <view class="order-icon">
+ <up-icon name="checkmark-circle" size="20" color="#ffffff"></up-icon>
+ </view>
+ <view class="order-details">
+ <text class="order-title">{{ workOrder.deviceName }}</text>
+ <text class="order-subtitle">宸ュ崟鍙�: {{ workOrder.orderNumber }}</text>
+ </view>
+ </view>
+ <view class="order-status">
+ <u-tag :type="getStatusType(workOrder.status)" size="small">
+ {{ getStatusText(workOrder.status) }}
+ </u-tag>
+ </view>
+ </view>
+
+ <view class="order-meta">
+ <view class="meta-row">
+ <view class="meta-item">
+ <text class="meta-label">缁翠慨浜哄憳:</text>
+ <text class="meta-value">{{ workOrder.technician }}</text>
+ </view>
+ <view class="meta-item">
+ <text class="meta-label">寮�濮嬫椂闂�:</text>
+ <text class="meta-value">{{ formatDate(workOrder.startTime) }}</text>
+ </view>
+ </view>
+ <view class="meta-row">
+ <view class="meta-item">
+ <text class="meta-label">棰勮宸ユ椂:</text>
+ <text class="meta-value">{{ workOrder.estimatedHours }}灏忔椂</text>
+ </view>
+ <view class="meta-item">
+ <text class="meta-label">瀹為檯宸ユ椂:</text>
+ <text class="meta-value">{{ workOrder.actualHours }}灏忔椂</text>
+ </view>
+ </view>
+ </view>
+ </view>
+
+ <!-- 杩涘害鎸囩ず鍣� -->
+ <view class="progress-indicator">
+ <view class="progress-steps">
+ <view
+ v-for="(step, index) in progressSteps"
+ :key="index"
+ class="progress-step"
+ :class="{
+ active: currentStep >= index,
+ completed: currentStep > index,
+ current: currentStep === index
+ }"
+ >
+ <view class="step-circle">
+ <up-icon
+ v-if="currentStep > index"
+ name="checkmark"
+ size="12"
+ color="#ffffff"
+ ></up-icon>
+ <text v-else class="step-number">{{ index + 1 }}</text>
+ </view>
+ <text class="step-label">{{ step.label }}</text>
+ </view>
+ </view>
+ </view>
+
+ <!-- 妫�淇褰曠‘璁� -->
+ <view v-if="currentStep === 0" class="content-section">
+ <view class="section-header">
+ <text class="section-title">妫�淇褰曠‘璁�</text>
+ <view class="record-status">
+ <text class="status-text">璁板綍宸插畬鎴�</text>
+ </view>
+ </view>
+
+ <view class="record-summary">
+ <view class="summary-header">
+ <view class="header-icon">
+ <up-icon name="list-dot" size="20" color="#2979ff"></up-icon>
+ </view>
+ <text class="summary-title">妫�淇褰曟憳瑕�</text>
+ <view class="completion-badge">
+ <up-icon name="checkmark-circle" size="16" color="#4caf50"></up-icon>
+ <text class="badge-text">宸插畬鎴�</text>
+ </view>
+ </view>
+
+ <view class="summary-content">
+ <view class="summary-card">
+ <view class="card-header">
+ <up-icon name="wrench" size="16" color="#ff6b35"></up-icon>
+ <text class="card-title">缁翠慨鍐呭</text>
+ </view>
+ <text class="card-content">鏇存崲涓昏酱杞存壙锛岃皟鏁翠富杞撮棿闅欙紝纭繚璁惧绮惧害杈炬爣</text>
+ </view>
+
+ <view class="summary-card">
+ <view class="card-header">
+ <up-icon name="grid" size="16" color="#9c27b0"></up-icon>
+ <text class="card-title">浣跨敤閰嶄欢</text>
+ </view>
+ <view class="parts-list">
+ <view class="part-chip">NSK杞存壙 脳2</view>
+ <view class="part-chip">娑︽粦鑴� 脳1</view>
+ <view class="part-chip">铻烘爴 脳8</view>
+ </view>
+ </view>
+
+ <view class="summary-card">
+ <view class="card-header">
+ <up-icon name="clock" size="16" color="#2196f3"></up-icon>
+ <text class="card-title">缁翠慨鏃堕棿</text>
+ </view>
+ <view class="time-range">
+ <view class="time-item">
+ <text class="time-label">寮�濮�:</text>
+ <text class="time-value">{{ formatDate(workOrder.startTime) }}</text>
+ </view>
+ <view class="time-divider"></view>
+ <view class="time-item">
+ <text class="time-label">瀹屾垚:</text>
+ <text class="time-value">{{ formatDate(new Date()) }}</text>
+ </view>
+ </view>
+ </view>
+
+ <view class="summary-card result-card">
+ <view class="card-header">
+ <up-icon name="checkmark-circle" size="16" color="#4caf50"></up-icon>
+ <text class="card-title">缁翠慨缁撴灉</text>
+ </view>
+ <text class="result-content">璁惧鍔熻兘鎭㈠姝e父锛岃繍琛屽钩绋筹紝鍚勯」鎸囨爣杈惧埌棰勬湡瑕佹眰</text>
+ <view class="result-status">
+ <u-tag type="success" size="mini">楠屾敹鍚堟牸</u-tag>
+ </view>
+ </view>
+ </view>
+ </view>
+
+ <view class="section-actions">
+ <u-button
+ type="primary"
+ @click="completeRecord"
+ >
+ 纭璁板綍
+ </u-button>
+ </view>
+ </view>
+
+ <!-- 鑷鎻愪氦 -->
+ <view v-if="currentStep === 1" class="content-section">
+ <view class="section-header">
+ <text class="section-title">鑷鎶ュ憡</text>
+ <view class="inspection-status">
+ <text class="status-text">{{ completedInspections }}/{{ inspectionItems.length }} 宸叉鏌�</text>
+ </view>
+ </view>
+
+ <view class="inspection-form">
+ <view class="inspection-items">
+ <view v-for="item in inspectionItems" :key="item.id" class="inspection-item">
+ <view class="item-header">
+ <text class="item-title">{{ item.title }}</text>
+ <view class="item-status">
+ <u-tag
+ :type="item.result === 'pass' ? 'success' : item.result === 'fail' ? 'error' : 'info'"
+ size="mini"
+ >
+ {{ getInspectionResultText(item.result) }}
+ </u-tag>
+ </view>
+ </view>
+
+ <view class="item-content">
+ <text class="item-description">{{ item.description }}</text>
+
+ <view class="item-options">
+ <view class="option-group">
+ <text class="option-label">妫�鏌ョ粨鏋�:</text>
+ <view class="radio-group">
+ <view
+ v-for="option in inspectionOptions"
+ :key="option.value"
+ class="radio-option"
+ :class="{ active: item.result === option.value }"
+ @click="setInspectionResult(item.id, option.value)"
+ >
+ <view class="radio-circle">
+ <view v-if="item.result === option.value" class="radio-dot"></view>
+ </view>
+ <text class="radio-text">{{ option.label }}</text>
+ </view>
+ </view>
+ </view>
+
+ <view v-if="item.result" class="option-group">
+ <text class="option-label">澶囨敞璇存槑:</text>
+ <up-textarea
+ v-model="item.remark"
+ placeholder="璇疯緭鍏ユ鏌ュ娉�..."
+ :maxlength="200"
+ count
+ height="80"
+ ></up-textarea>
+ </view>
+ </view>
+ </view>
+ </view>
+ </view>
+
+ <view class="inspection-summary">
+ <view class="summary-header">
+ <text class="summary-title">妫�鏌ユ�荤粨</text>
+ </view>
+ <up-textarea
+ v-model="inspectionSummary"
+ placeholder="璇疯緭鍏ユ暣浣撴鏌ユ�荤粨..."
+ :maxlength="500"
+ count
+ height="120"
+ ></up-textarea>
+ </view>
+ </view>
+
+ <view class="section-actions">
+ <u-button
+ type="primary"
+ @click="submitInspection"
+ :disabled="!canSubmitInspection"
+ >
+ 鎻愪氦鑷
+ </u-button>
+ </view>
+ </view>
+
+ <!-- 涓荤楠屾敹 -->
+ <view v-if="currentStep === 2" class="content-section">
+ <view class="section-header">
+ <text class="section-title">涓荤楠屾敹</text>
+ <view class="supervisor-info">
+ <text class="supervisor-name">楠屾敹浜�: {{ workOrder.supervisor }}</text>
+ </view>
+ </view>
+
+ <!-- 楠屾敹妫�鏌ラ」 -->
+ <view class="acceptance-checks">
+ <text class="checks-title">馃攳 楠屾敹妫�鏌ラ」</text>
+ <view class="checks-list">
+ <view v-for="check in acceptanceChecks" :key="check.id" class="check-item">
+ <view class="check-header" @click="toggleCheck(check.id)">
+ <view class="check-icon">
+ <up-icon
+ :name="check.checked ? 'checkmark-circle' : 'close-circle'"
+ :color="check.checked ? '#4caf50' : '#ccc'"
+ size="18"
+ ></up-icon>
+ </view>
+ <text class="check-title">{{ check.title }}</text>
+ </view>
+ <text class="check-description">{{ check.description }}</text>
+ </view>
+ </view>
+ </view>
+
+ <!-- 楠屾敹缁撴灉 -->
+ <view class="acceptance-result">
+ <text class="result-title">楠屾敹缁撴灉</text>
+ <view class="result-options">
+ <view
+ v-for="option in acceptanceOptions"
+ :key="option.value"
+ class="result-option"
+ :class="{ active: acceptanceResult === option.value }"
+ @click="setAcceptanceResult(option.value)"
+ >
+ <view class="option-icon">
+ <up-icon
+ :name="option.icon"
+ :color="acceptanceResult === option.value ? '#ffffff' : '#666'"
+ size="16"
+ ></up-icon>
+ </view>
+ <text class="option-text">{{ option.label }}</text>
+ </view>
+ </view>
+ </view>
+
+ <!-- 楠屾敹鎰忚 -->
+ <view class="acceptance-opinion">
+ <text class="opinion-title">楠屾敹鎰忚</text>
+ <up-textarea
+ v-model="acceptanceOpinion"
+ placeholder="璇疯緭鍏ラ獙鏀舵剰瑙�..."
+ :maxlength="300"
+ count
+ height="100"
+ ></up-textarea>
+ </view>
+
+ <view class="section-actions">
+ <u-button
+ type="success"
+ @click="submitAcceptance"
+ :disabled="!canSubmitAcceptance"
+ >
+ 鎻愪氦楠屾敹
+ </u-button>
+ <u-button
+ type="error"
+ plain
+ @click="rejectWork"
+ v-if="acceptanceResult === 'reject'"
+ >
+ 閫�鍥為噸鍋�
+ </u-button>
+ </view>
+ </view>
+
+ <!-- 宸ュ崟鍏抽棴 -->
+ <view v-if="currentStep === 3" class="content-section">
+ <view class="completion-summary">
+ <view class="summary-icon">
+ <up-icon name="checkmark-circle" size="48" color="#4caf50"></up-icon>
+ </view>
+ <text class="summary-title">宸ュ崟瀹屾垚</text>
+ <text class="summary-desc">鎵�鏈夋鏌ラ」宸查�氳繃锛屽伐鍗曞嵆灏嗗叧闂�</text>
+ </view>
+
+ <!-- 瀹屾垚缁熻 -->
+ <view class="completion-stats">
+ <view class="stat-item">
+ <text class="stat-label">瀹為檯宸ユ椂</text>
+ <text class="stat-value">{{ workOrder.actualHours }}灏忔椂</text>
+ </view>
+ <view class="stat-item">
+ <text class="stat-label">浣跨敤閰嶄欢</text>
+ <text class="stat-value">{{ usedParts.length }}椤�</text>
+ </view>
+ <view class="stat-item">
+ <text class="stat-label">妫�鏌ラ」鐩�</text>
+ <text class="stat-value">{{ inspectionItems.length }}椤�</text>
+ </view>
+ <view class="stat-item">
+ <text class="stat-label">楠屾敹缁撴灉</text>
+ <text class="stat-value success">閫氳繃</text>
+ </view>
+ </view>
+
+ <!-- 浣跨敤閰嶄欢娓呭崟 -->
+ <view class="used-parts">
+ <text class="parts-title">浣跨敤閰嶄欢娓呭崟</text>
+ <view class="parts-list">
+ <view v-for="part in usedParts" :key="part.id" class="part-item">
+ <text class="part-name">{{ part.name }}</text>
+ <text class="part-quantity">{{ part.quantity }}{{ part.unit }}</text>
+ </view>
+ </view>
+ </view>
+
+ <view class="section-actions">
+ <u-button
+ type="success"
+ size="large"
+ @click="closeWorkOrder"
+ >
+ 涓�閿叧闂伐鍗�
+ </u-button>
+ </view>
+ </view>
+
+ <!-- 宸插叧闂姸鎬� -->
+ <view v-if="currentStep === 4" class="content-section">
+ <view class="closed-status">
+ <view class="status-icon">
+ <up-icon name="checkmark-circle" size="64" color="#4caf50"></up-icon>
+ </view>
+ <text class="status-title">宸ュ崟宸插叧闂�</text>
+ <text class="status-desc">缁翠慨宸ヤ綔宸插畬鎴愶紝宸ュ崟宸叉垚鍔熷叧闂�</text>
+
+ <view class="close-info">
+ <view class="info-item">
+ <text class="info-label">鍏抽棴鏃堕棿:</text>
+ <text class="info-value">{{ formatDate(workOrder.closeTime) }}</text>
+ </view>
+ <view class="info-item">
+ <text class="info-label">鍏抽棴浜�:</text>
+ <text class="info-value">{{ workOrder.supervisor }}</text>
+ </view>
+ </view>
+ </view>
+
+ <view class="section-actions">
+ <u-button
+ type="primary"
+ plain
+ @click="viewReport"
+ >
+ 鏌ョ湅瀹屾暣鎶ュ憡
+ </u-button>
+ <u-button
+ type="info"
+ plain
+ @click="exportReport"
+ >
+ 瀵煎嚭鎶ュ憡
+ </u-button>
+ </view>
+ </view>
+ </view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue'
+import { onShow } from '@dcloudio/uni-app'
+import PageHeader from '@/components/PageHeader.vue'
+
+const showToast = (message) => {
+ uni.showToast({
+ title: message,
+ icon: 'none'
+ })
+}
+
+// 宸ュ崟淇℃伅
+const workOrder = ref({
+ id: 1,
+ orderNumber: 'WO-2024-001',
+ deviceName: '鏁版帶杞﹀簥CK6140',
+ deviceCode: 'CNC-001',
+ status: 'in_verification',
+ technician: '鏉庡笀鍌�',
+ supervisor: '寮犱富绠�',
+ startTime: '2024-01-15 09:00:00',
+ estimatedHours: 4,
+ actualHours: 3.5,
+ closeTime: null
+})
+
+// 杩涘害姝ラ
+const progressSteps = ref([
+ { label: '纭璁板綍', key: 'confirm' },
+ { label: '鑷鎻愪氦', key: 'inspection' },
+ { label: '涓荤楠屾敹', key: 'acceptance' },
+ { label: '鍏抽棴宸ュ崟', key: 'close' }
+])
+
+const currentStep = ref(0)
+
+
+
+// 鑷椤圭洰
+const inspectionItems = ref([
+ {
+ id: 1,
+ title: '璁惧鍔熻兘娴嬭瘯',
+ description: '妫�鏌ヨ澶囧悇椤瑰姛鑳芥槸鍚︽甯歌繍琛�',
+ result: 'pass',
+ remark: '涓昏酱杩愯浆骞崇ǔ锛岀簿搴︾鍚堣姹�'
+ },
+ {
+ id: 2,
+ title: '瀹夊叏闃叉姢妫�鏌�',
+ description: '纭鎵�鏈夊畨鍏ㄩ槻鎶よ缃甯稿伐浣�',
+ result: 'pass',
+ remark: '闃叉姢缃╁畨瑁呭埌浣嶏紝鎬ュ仠鎸夐挳姝e父'
+ },
+ {
+ id: 3,
+ title: '娑︽粦绯荤粺妫�鏌�',
+ description: '妫�鏌ユ鼎婊戞补浣嶅拰娑︽粦绯荤粺宸ヤ綔鐘舵��',
+ result: 'pass',
+ remark: '娑︽粦娌逛綅姝e父锛岃嚜鍔ㄦ鼎婊戠郴缁熷伐浣滄甯�'
+ },
+ {
+ id: 4,
+ title: '鐢垫皵绯荤粺妫�鏌�',
+ description: '妫�鏌ョ數姘旇繛鎺ュ拰鎺у埗绯荤粺鍔熻兘',
+ result: 'pass',
+ remark: '鐢垫皵杩炴帴鐗㈠浐锛屾帶鍒剁郴缁熷搷搴旀甯�'
+ },
+ {
+ id: 5,
+ title: '娓呮磥鏁寸悊',
+ description: '纭宸ヤ綔鍖哄煙娓呮磥鏁寸悊瀹屾瘯',
+ result: 'pass',
+ remark: '宸ヤ綔鍖哄煙宸叉竻鐞嗗共鍑�锛屽伐鍏峰綊浣�'
+ }
+])
+
+const inspectionSummary = ref('鏈缁翠慨鏇存崲浜嗕富杞磋酱鎵匡紝璋冩暣浜嗕富杞撮棿闅欙紝璁惧杩愯鐘舵�佽壇濂斤紝鍚勯」鍔熻兘娴嬭瘯姝e父锛岃揪鍒伴鏈熺淮淇晥鏋溿��')
+
+// 妫�鏌ラ�夐」
+const inspectionOptions = ref([
+ { label: '閫氳繃', value: 'pass' },
+ { label: '涓嶉�氳繃', value: 'fail' },
+ { label: '寰呮鏌�', value: 'pending' }
+])
+
+// 楠屾敹妫�鏌ラ」
+const acceptanceChecks = ref([
+ {
+ id: 1,
+ title: '缁翠慨璁板綍瀹屾暣鎬�',
+ description: '妫�鏌ョ淮淇褰曟槸鍚﹀畬鏁淬�佸噯纭�',
+ checked: true
+ },
+ {
+ id: 2,
+ title: '璁惧鍔熻兘楠岃瘉',
+ description: '鐜板満楠岃瘉璁惧鍔熻兘鏄惁鎭㈠姝e父',
+ checked: true
+ },
+ {
+ id: 3,
+ title: '瀹夊叏鏍囧噯绗﹀悎鎬�',
+ description: '纭缁翠慨鍚庤澶囩鍚堝畨鍏ㄦ爣鍑�',
+ checked: true
+ },
+ {
+ id: 4,
+ title: '閰嶄欢浣跨敤鍚堣鎬�',
+ description: '妫�鏌ヤ娇鐢ㄩ厤浠舵槸鍚︾鍚堣鑼冭姹�',
+ checked: true
+ },
+ {
+ id: 5,
+ title: '鐜板満娓呯悊鎯呭喌',
+ description: '纭缁翠慨鐜板満娓呯悊骞插噣',
+ checked: true
+ }
+])
+
+// 楠屾敹閫夐」
+const acceptanceOptions = ref([
+ { label: '楠屾敹閫氳繃', value: 'pass', icon: 'checkmark-circle' },
+ { label: '楠屾敹涓嶉�氳繃', value: 'reject', icon: 'close-circle' }
+])
+
+const acceptanceResult = ref('pass')
+const acceptanceOpinion = ref('缁翠慨璐ㄩ噺鑹ソ锛岃澶囧姛鑳芥仮澶嶆甯革紝鐜板満娓呯悊骞插噣锛屽悓鎰忛獙鏀堕�氳繃銆�')
+
+// 浣跨敤閰嶄欢
+const usedParts = ref([
+ { id: 1, name: '涓昏酱杞存壙 NSK 7020C', quantity: 2, unit: '涓�' },
+ { id: 2, name: '娑︽粦鑴� 楂樻俯杞存壙娑︽粦鑴�', quantity: 1, unit: '鏀�' },
+ { id: 3, name: '铻烘爴 M8脳25', quantity: 8, unit: '涓�' }
+])
+
+// 璁$畻灞炴��
+
+const completedInspections = computed(() => {
+ return inspectionItems.value.filter(item => item.result && item.result !== 'pending').length
+})
+
+const canSubmitInspection = computed(() => {
+ return completedInspections.value === inspectionItems.value.length && inspectionSummary.value.trim()
+})
+
+const canSubmitAcceptance = computed(() => {
+ return acceptanceResult.value && acceptanceOpinion.value.trim() &&
+ acceptanceChecks.value.every(check => check.checked)
+})
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+ uni.navigateBack()
+}
+
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (dateStr) => {
+ if (!dateStr) return ''
+ const date = new Date(dateStr)
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ return `${year}-${month}-${day} ${hours}:${minutes}`
+}
+
+// 鑾峰彇鐘舵�佺被鍨�
+const getStatusType = (status) => {
+ const statusMap = {
+ 'pending': 'warning',
+ 'in_progress': 'primary',
+ 'in_verification': 'info',
+ 'completed': 'success',
+ 'closed': 'success'
+ }
+ return statusMap[status] || 'info'
+}
+
+// 鑾峰彇鐘舵�佹枃鏈�
+const getStatusText = (status) => {
+ const statusMap = {
+ 'pending': '寰呭紑濮�',
+ 'in_progress': '杩涜涓�',
+ 'in_verification': '楠岃瘉涓�',
+ 'completed': '宸插畬鎴�',
+ 'closed': '宸插叧闂�'
+ }
+ return statusMap[status] || '鏈煡'
+}
+
+// 纭璁板綍
+const completeRecord = () => {
+ currentStep.value = 1
+ showToast('妫�淇褰曞凡纭')
+}
+
+// 璁剧疆妫�鏌ョ粨鏋�
+const setInspectionResult = (itemId, result) => {
+ const item = inspectionItems.value.find(item => item.id === itemId)
+ if (item) {
+ item.result = result
+ }
+}
+
+// 鑾峰彇妫�鏌ョ粨鏋滄枃鏈�
+const getInspectionResultText = (result) => {
+ const resultMap = {
+ 'pass': '閫氳繃',
+ 'fail': '涓嶉�氳繃',
+ 'pending': '寰呮鏌�'
+ }
+ return resultMap[result] || '鏈鏌�'
+}
+
+// 鎻愪氦鑷
+const submitInspection = () => {
+ const failedItems = inspectionItems.value.filter(item => item.result === 'fail')
+ if (failedItems.length > 0) {
+ uni.showModal({
+ title: '妫�鏌ヤ笉閫氳繃',
+ content: `鏈�${failedItems.length}椤规鏌ヤ笉閫氳繃锛岀‘璁ゆ彁浜わ紵`,
+ success: (res) => {
+ if (res.confirm) {
+ currentStep.value = 2
+ showToast('鑷鎶ュ憡宸叉彁浜�')
+ }
+ }
+ })
+ } else {
+ currentStep.value = 2
+ showToast('鑷鎶ュ憡宸叉彁浜�')
+ }
+}
+
+// 鍒囨崲楠屾敹妫�鏌ラ」
+const toggleCheck = (checkId) => {
+ const check = acceptanceChecks.value.find(c => c.id === checkId)
+ if (check) {
+ check.checked = !check.checked
+ }
+}
+
+// 璁剧疆楠屾敹缁撴灉
+const setAcceptanceResult = (result) => {
+ acceptanceResult.value = result
+}
+
+// 鎻愪氦楠屾敹
+const submitAcceptance = () => {
+ if (acceptanceResult.value === 'pass') {
+ currentStep.value = 3
+ workOrder.value.status = 'completed'
+ showToast('楠屾敹閫氳繃锛岃繘鍏ュ伐鍗曞叧闂祦绋�')
+ } else {
+ showToast('楠屾敹涓嶉�氳繃锛屽伐鍗曞皢閫�鍥為噸鍋�')
+ }
+}
+
+// 閫�鍥為噸鍋�
+const rejectWork = () => {
+ uni.showModal({
+ title: '閫�鍥為噸鍋�',
+ content: '纭閫�鍥炲伐鍗曢噸鏂扮淮淇紵',
+ success: (res) => {
+ if (res.confirm) {
+ workOrder.value.status = 'in_progress'
+ currentStep.value = 0
+ showToast('宸ュ崟宸查��鍥烇紝璇烽噸鏂扮淮淇�')
+ }
+ }
+ })
+}
+
+// 鍏抽棴宸ュ崟
+const closeWorkOrder = () => {
+ uni.showModal({
+ title: '鍏抽棴宸ュ崟',
+ content: '纭鍏抽棴宸ュ崟锛熷叧闂悗灏嗘棤娉曚慨鏀广��',
+ success: (res) => {
+ if (res.confirm) {
+ workOrder.value.status = 'closed'
+ workOrder.value.closeTime = new Date().toISOString()
+ currentStep.value = 4
+ showToast('宸ュ崟宸叉垚鍔熷叧闂�')
+ }
+ }
+ })
+}
+
+// 鏌ョ湅鎶ュ憡
+const viewReport = () => {
+ showToast('鏌ョ湅瀹屾暣缁翠慨鎶ュ憡')
+}
+
+// 瀵煎嚭鎶ュ憡
+const exportReport = () => {
+ showToast('鎶ュ憡瀵煎嚭鍔熻兘寮�鍙戜腑')
+}
+
+onMounted(() => {
+ // 椤甸潰鍔犺浇鏃剁殑鍒濆鍖栭�昏緫
+})
+
+onShow(() => {
+ // 椤甸潰鏄剧ず鏃剁殑閫昏緫
+})
+</script>
+
+<style scoped lang="scss">
+@import '@/styles/sales-common.scss';
+
+// 缁撴灉楠岃瘉鐗规湁鏍峰紡
+.sales-account {
+ padding-bottom: 20px;
+}
+
+// 宸ュ崟淇℃伅鍗$墖
+.work-order-card {
+ margin: 20px;
+ background: #ffffff;
+ border-radius: 12px;
+ padding: 16px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.order-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.order-left {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.order-icon {
+ width: 40px;
+ height: 40px;
+ background: #4caf50;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.order-details {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.order-title {
+ font-size: 16px;
+ font-weight: 500;
+ color: #333;
+}
+
+.order-subtitle {
+ font-size: 12px;
+ color: #666;
+}
+
+.order-meta {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.meta-row {
+ display: flex;
+ gap: 20px;
+}
+
+.meta-item {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ flex: 1;
+}
+
+.meta-label {
+ font-size: 12px;
+ color: #777;
+ min-width: 60px;
+}
+
+.meta-value {
+ font-size: 12px;
+ color: #333;
+}
+
+// 杩涘害鎸囩ず鍣�
+.progress-indicator {
+ margin: 20px;
+ background: #ffffff;
+ border-radius: 12px;
+ padding: 20px 16px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.progress-steps {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 16px;
+ left: 16px;
+ right: 16px;
+ height: 2px;
+ background: #f0f0f0;
+ z-index: 1;
+ }
+}
+
+.progress-step {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ position: relative;
+ z-index: 2;
+
+ &.active {
+ .step-circle {
+ background: #2979ff;
+ border-color: #2979ff;
+ color: #ffffff;
+ }
+
+ .step-label {
+ color: #2979ff;
+ font-weight: 500;
+ }
+ }
+
+ &.completed {
+ .step-circle {
+ background: #4caf50;
+ border-color: #4caf50;
+ }
+ }
+
+ &.current {
+ .step-circle {
+ background: #2979ff;
+ border-color: #2979ff;
+ box-shadow: 0 0 0 4px rgba(41, 121, 255, 0.2);
+ }
+ }
+}
+
+.step-circle {
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ background: #f5f5f5;
+ border: 2px solid #e0e0e0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.3s ease;
+}
+
+.step-number {
+ font-size: 12px;
+ font-weight: 500;
+ color: #666;
+}
+
+.step-label {
+ font-size: 11px;
+ color: #666;
+ text-align: center;
+}
+
+// 鍐呭鍖哄煙
+.content-section {
+ margin: 20px;
+ background: #ffffff;
+ border-radius: 12px;
+ padding: 16px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
+}
+
+.section-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+}
+
+.section-title {
+ font-size: 16px;
+ font-weight: 500;
+ color: #333;
+}
+
+.record-status,
+.inspection-status {
+ display: flex;
+ align-items: center;
+}
+
+.status-text {
+ font-size: 12px;
+ color: #666;
+}
+
+// 璁板綍鎽樿
+.record-summary {
+ margin-bottom: 20px;
+ background: #ffffff;
+ border-radius: 12px;
+ border: 1px solid #e8f4fd;
+ overflow: hidden;
+}
+
+.summary-header {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 16px;
+ background: linear-gradient(135deg, #f8fbff 0%, #e8f4fd 100%);
+ border-bottom: 1px solid #e0e0e0;
+}
+
+.header-icon {
+ width: 36px;
+ height: 36px;
+ background: #ffffff;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 2px 4px rgba(41, 121, 255, 0.1);
+}
+
+.summary-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ flex: 1;
+}
+
+.completion-badge {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ padding: 4px 8px;
+ background: #f0f8f0;
+ border-radius: 12px;
+ border: 1px solid #c8e6c9;
+}
+
+.badge-text {
+ font-size: 11px;
+ color: #2e7d32;
+ font-weight: 500;
+}
+
+.summary-content {
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.summary-card {
+ background: #fafbfc;
+ border-radius: 8px;
+ padding: 12px;
+ border-left: 3px solid #e0e0e0;
+ transition: all 0.3s ease;
+
+ &:hover {
+ background: #f5f7fa;
+ border-left-color: #2979ff;
+ }
+}
+
+.card-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 8px;
+}
+
+.card-title {
+ font-size: 13px;
+ font-weight: 500;
+ color: #333;
+}
+
+.card-content {
+ font-size: 12px;
+ color: #555;
+ line-height: 1.5;
+}
+
+// 閰嶄欢鍒楄〃
+.parts-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.part-chip {
+ padding: 4px 8px;
+ background: #e3f2fd;
+ border-radius: 12px;
+ font-size: 11px;
+ color: #1976d2;
+ font-weight: 500;
+ border: 1px solid #bbdefb;
+}
+
+// 鏃堕棿鑼冨洿
+.time-range {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.time-item {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ flex: 1;
+}
+
+.time-label {
+ font-size: 10px;
+ color: #999;
+ font-weight: 500;
+}
+
+.time-value {
+ font-size: 11px;
+ color: #333;
+ font-weight: 500;
+}
+
+.time-divider {
+ width: 2px;
+ height: 20px;
+ background: #e0e0e0;
+ border-radius: 1px;
+}
+
+// 缁撴灉鍗$墖
+.result-card {
+ border-left-color: #4caf50 !important;
+ background: #f8fff8;
+
+ &:hover {
+ background: #f0f8f0;
+ }
+}
+
+.result-content {
+ font-size: 12px;
+ color: #2e7d32;
+ line-height: 1.5;
+ margin-bottom: 8px;
+}
+
+.result-status {
+ display: flex;
+ justify-content: flex-end;
+}
+
+// 妫�鏌ヨ〃鍗�
+.inspection-form {
+ margin-bottom: 20px;
+}
+
+.inspection-items {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ margin-bottom: 20px;
+}
+
+.inspection-item {
+ padding: 16px;
+ background: #f8f9fa;
+ border-radius: 8px;
+ border: 1px solid #e0e0e0;
+}
+
+.item-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+}
+
+.item-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+}
+
+.item-content {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.item-description {
+ font-size: 12px;
+ color: #666;
+ line-height: 1.4;
+}
+
+.item-options {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.option-group {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.option-label {
+ font-size: 12px;
+ color: #777;
+ font-weight: 500;
+}
+
+.radio-group {
+ display: flex;
+ gap: 16px;
+}
+
+.radio-option {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ cursor: pointer;
+
+ &.active {
+ .radio-text {
+ color: #2979ff;
+ font-weight: 500;
+ }
+ }
+}
+
+.radio-circle {
+ width: 16px;
+ height: 16px;
+ border: 2px solid #e0e0e0;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.3s ease;
+
+ .radio-option.active & {
+ border-color: #2979ff;
+ }
+}
+
+.radio-dot {
+ width: 8px;
+ height: 8px;
+ background: #2979ff;
+ border-radius: 50%;
+}
+
+.radio-text {
+ font-size: 12px;
+ color: #666;
+}
+
+// 妫�鏌ユ�荤粨
+.inspection-summary {
+ padding: 16px;
+ background: #f0f8f0;
+ border-radius: 8px;
+ border-left: 4px solid #4caf50;
+}
+
+.summary-header {
+ margin-bottom: 8px;
+}
+
+.summary-title {
+ font-size: 13px;
+ font-weight: 500;
+ color: #2e7d32;
+}
+
+// 楠屾敹妫�鏌�
+.acceptance-checks {
+ margin-bottom: 20px;
+ padding: 16px;
+ background: #f8f9fa;
+ border-radius: 8px;
+}
+
+.checks-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 12px;
+}
+
+.checks-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.check-item {
+ padding: 12px;
+ background: #ffffff;
+ border-radius: 6px;
+ border: 1px solid #e0e0e0;
+}
+
+.check-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 4px;
+ cursor: pointer;
+}
+
+.check-icon {
+ flex-shrink: 0;
+}
+
+.check-title {
+ font-size: 13px;
+ font-weight: 500;
+ color: #333;
+}
+
+.check-description {
+ font-size: 11px;
+ color: #666;
+ margin-left: 26px;
+}
+
+// 楠屾敹缁撴灉
+.acceptance-result {
+ margin-bottom: 20px;
+}
+
+.result-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 12px;
+}
+
+.result-options {
+ display: flex;
+ gap: 12px;
+}
+
+.result-option {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ padding: 12px;
+ border: 2px solid #e0e0e0;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ &.active {
+ background: #4caf50;
+ border-color: #4caf50;
+
+ .option-text {
+ color: #ffffff;
+ font-weight: 500;
+ }
+ }
+
+ &:first-child.active {
+ background: #4caf50;
+ border-color: #4caf50;
+ }
+
+ &:last-child.active {
+ background: #f44336;
+ border-color: #f44336;
+ }
+}
+
+.option-icon {
+ flex-shrink: 0;
+}
+
+.option-text {
+ font-size: 13px;
+ color: #666;
+}
+
+// 楠屾敹鎰忚
+.acceptance-opinion {
+ margin-bottom: 20px;
+}
+
+.opinion-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 8px;
+}
+
+// 瀹屾垚鎽樿
+.completion-summary {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ margin-bottom: 24px;
+ padding: 24px 16px;
+}
+
+.summary-icon {
+ margin-bottom: 12px;
+}
+
+.summary-title {
+ font-size: 18px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 4px;
+}
+
+.summary-desc {
+ font-size: 13px;
+ color: #666;
+}
+
+// 瀹屾垚缁熻
+.completion-stats {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 12px;
+ margin-bottom: 20px;
+}
+
+.stat-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 16px;
+ background: #f8f9fa;
+ border-radius: 8px;
+}
+
+.stat-label {
+ font-size: 12px;
+ color: #777;
+ margin-bottom: 4px;
+}
+
+.stat-value {
+ font-size: 16px;
+ font-weight: 500;
+ color: #333;
+
+ &.success {
+ color: #4caf50;
+ }
+}
+
+// 浣跨敤閰嶄欢
+.used-parts {
+ margin-bottom: 20px;
+}
+
+.parts-title {
+ font-size: 14px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 12px;
+}
+
+.parts-list {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.part-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 12px;
+ background: #f8f9fa;
+ border-radius: 6px;
+}
+
+.part-name {
+ font-size: 12px;
+ color: #333;
+}
+
+.part-quantity {
+ font-size: 12px;
+ color: #666;
+ font-weight: 500;
+}
+
+// 宸插叧闂姸鎬�
+.closed-status {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ margin-bottom: 24px;
+ padding: 32px 16px;
+}
+
+.status-icon {
+ margin-bottom: 16px;
+}
+
+.status-title {
+ font-size: 20px;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 8px;
+}
+
+.status-desc {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 20px;
+}
+
+.close-info {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ width: 100%;
+ max-width: 200px;
+}
+
+.info-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.info-label {
+ font-size: 12px;
+ color: #777;
+}
+
+.info-value {
+ font-size: 12px;
+ color: #333;
+ font-weight: 500;
+}
+
+// 鎿嶄綔鎸夐挳
+.section-actions {
+ display: flex;
+ gap: 12px;
+ margin-top: 20px;
+}
+
+.section-actions .u-button {
+ flex: 1;
+}
+
+.supervisor-info {
+ display: flex;
+ align-items: center;
+}
+
+.supervisor-name {
+ font-size: 12px;
+ color: #666;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.9.3