| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="sales-account"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="æ åä½ä¸æå¯¼" @back="goBack" /> |
| | | |
| | | <!-- ä»»å¡ä¿¡æ¯å¡ç --> |
| | | <view class="task-info-card"> |
| | | <view class="task-header"> |
| | | <view class="task-left"> |
| | | <view class="task-icon"> |
| | | <up-icon name="file-text" size="20" color="#ffffff"></up-icon> |
| | | </view> |
| | | <view class="task-details"> |
| | | <text class="task-title">{{ currentTask.deviceName }}</text> |
| | | <text class="task-subtitle">{{ currentTask.taskType }} - {{ currentTask.priority }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="task-status"> |
| | | <u-tag :type="getStatusType(currentTask.status)" size="small"> |
| | | {{ getStatusText(currentTask.status) }} |
| | | </u-tag> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="task-meta"> |
| | | <view class="meta-item"> |
| | | <text class="meta-label">设å¤ç¼å·:</text> |
| | | <text class="meta-value">{{ currentTask.deviceCode }}</text> |
| | | </view> |
| | | <view class="meta-item"> |
| | | <text class="meta-label">æ
éæè¿°:</text> |
| | | <text class="meta-value">{{ currentTask.faultDescription }}</text> |
| | | </view> |
| | | <view class="meta-item"> |
| | | <text class="meta-label">é¢è®¡å·¥æ¶:</text> |
| | | <text class="meta-value">{{ currentTask.estimatedHours }}å°æ¶</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- åè½å¯¼èª --> |
| | | <view class="nav-tabs"> |
| | | <view |
| | | v-for="(tab, index) in tabs" |
| | | :key="index" |
| | | class="nav-tab" |
| | | :class="{ active: activeTab === tab.key }" |
| | | @click="switchTab(tab.key)" |
| | | > |
| | | <up-icon :name="tab.icon" size="18" :color="activeTab === tab.key ? '#2979ff' : '#666'"></up-icon> |
| | | <text class="tab-text" :class="{ active: activeTab === tab.key }">{{ tab.label }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- SOPæ åä½ä¸ç¨åº --> |
| | | <view v-if="activeTab === 'sop'" class="content-section"> |
| | | <view class="section-header"> |
| | | <text class="section-title">æ åä½ä¸ç¨åº</text> |
| | | <view class="progress-info"> |
| | | <text class="progress-text">{{ completedSteps }}/{{ sopSteps.length }}</text> |
| | | <up-icon name="checkmark-circle" size="16" color="#4caf50" v-if="completedSteps === sopSteps.length"></up-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="sop-steps"> |
| | | <view |
| | | v-for="(step, index) in sopSteps" |
| | | :key="step.id" |
| | | class="sop-step" |
| | | :class="{ completed: step.completed, current: currentStepIndex === index }" |
| | | > |
| | | <view class="step-header" @click="toggleStep(index)"> |
| | | <view class="step-number"> |
| | | <text v-if="!step.completed" class="step-num">{{ index + 1 }}</text> |
| | | <up-icon v-else name="checkmark" size="14" color="#ffffff"></up-icon> |
| | | </view> |
| | | <view class="step-content"> |
| | | <text class="step-title">{{ step.title }}</text> |
| | | <text class="step-duration">é¢è®¡{{ step.duration }}åé</text> |
| | | </view> |
| | | <view class="step-toggle"> |
| | | <up-icon |
| | | :name="step.expanded ? 'arrow-up' : 'arrow-down'" |
| | | size="16" |
| | | color="#999" |
| | | ></up-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="step.expanded" class="step-details"> |
| | | <view class="step-description"> |
| | | <text class="desc-text">{{ step.description }}</text> |
| | | </view> |
| | | |
| | | <view v-if="step.warnings.length > 0" class="step-warnings"> |
| | | <text class="warning-title">â ï¸ æ³¨æäºé¡¹</text> |
| | | <view v-for="warning in step.warnings" :key="warning" class="warning-item"> |
| | | <text class="warning-text">⢠{{ warning }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-if="step.tools.length > 0" class="step-tools"> |
| | | <text class="tools-title">ð§ æéå·¥å
·</text> |
| | | <view class="tools-list"> |
| | | <u-tag |
| | | v-for="tool in step.tools" |
| | | :key="tool" |
| | | type="info" |
| | | size="mini" |
| | | class="tool-tag" |
| | | > |
| | | {{ tool }} |
| | | </u-tag> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="step-actions"> |
| | | <u-button |
| | | v-if="!step.completed" |
| | | type="success" |
| | | size="small" |
| | | @click="completeStep(index)" |
| | | > |
| | | å®ææ¤æ¥éª¤ |
| | | </u-button> |
| | | <u-button |
| | | v-else |
| | | type="info" |
| | | size="small" |
| | | plain |
| | | @click="uncompleteStep(index)" |
| | | > |
| | | 忶宿 |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- é
ä»¶æ¸
å --> |
| | | <view v-if="activeTab === 'parts'" class="content-section"> |
| | | <view class="section-header"> |
| | | <text class="section-title">é
ä»¶æ¸
å</text> |
| | | <view class="parts-summary"> |
| | | <text class="summary-text">å
±{{ partsList.length }}项é
ä»¶</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="parts-list"> |
| | | <view v-for="part in partsList" :key="part.id" class="part-item"> |
| | | <view class="part-header"> |
| | | <view class="part-info"> |
| | | <text class="part-name">{{ part.name }}</text> |
| | | <text class="part-spec">{{ part.specification }}</text> |
| | | </view> |
| | | <view class="part-status"> |
| | | <u-tag |
| | | :type="part.available ? 'success' : 'error'" |
| | | size="mini" |
| | | > |
| | | {{ part.available ? 'åºåå
è¶³' : 'åºåä¸è¶³' }} |
| | | </u-tag> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="part-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é
ä»¶ç¼å·:</text> |
| | | <text class="detail-value">{{ part.partNumber }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">éè¦æ°é:</text> |
| | | <text class="detail-value">{{ part.requiredQuantity }}{{ part.unit }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºåæ°é:</text> |
| | | <text class="detail-value" :class="{ danger: !part.available }"> |
| | | {{ part.stockQuantity }}{{ part.unit }} |
| | | </text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åæ¾ä½ç½®:</text> |
| | | <text class="detail-value">{{ part.location }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="part-actions"> |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | plain |
| | | @click="requestPart(part)" |
| | | :disabled="part.available" |
| | | > |
| | | ç³è¯·é
ä»¶ |
| | | </u-button> |
| | | <u-button |
| | | type="info" |
| | | size="small" |
| | | plain |
| | | @click="viewPartDetail(part)" |
| | | > |
| | | æ¥ç详æ
|
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- å®å
¨æç¤º --> |
| | | <view v-if="activeTab === 'safety'" class="content-section"> |
| | | <view class="section-header"> |
| | | <text class="section-title">å®å
¨æç¤º</text> |
| | | <view class="safety-level"> |
| | | <u-tag :type="getSafetyLevelType(safetyInfo.level)" size="small"> |
| | | {{ safetyInfo.level }} |
| | | </u-tag> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- å®å
¨ç级说æ --> |
| | | <view class="safety-overview"> |
| | | <view class="safety-icon"> |
| | | <up-icon name="warning" size="24" color="#ff6b35"></up-icon> |
| | | </view> |
| | | <view class="safety-content"> |
| | | <text class="safety-title">{{ safetyInfo.title }}</text> |
| | | <text class="safety-desc">{{ safetyInfo.description }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- ä¸ªäººé²æ¤è®¾å¤ --> |
| | | <view class="safety-section"> |
| | | <text class="safety-section-title">ð¡ï¸ ä¸ªäººé²æ¤è®¾å¤</text> |
| | | <view class="ppe-list"> |
| | | <view v-for="ppe in safetyInfo.ppe" :key="ppe.name" class="ppe-item"> |
| | | <view class="ppe-icon"> |
| | | <text class="ppe-emoji">{{ ppe.icon }}</text> |
| | | </view> |
| | | <view class="ppe-info"> |
| | | <text class="ppe-name">{{ ppe.name }}</text> |
| | | <text class="ppe-desc">{{ ppe.description }}</text> |
| | | </view> |
| | | <view class="ppe-status"> |
| | | <up-icon |
| | | :name="ppe.checked ? 'checkmark-circle' : 'close-circle'" |
| | | :color="ppe.checked ? '#4caf50' : '#ccc'" |
| | | size="20" |
| | | @click="togglePPE(ppe)" |
| | | ></up-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- å®å
¨æ³¨æäºé¡¹ --> |
| | | <view class="safety-section"> |
| | | <text class="safety-section-title">â ï¸ å®å
¨æ³¨æäºé¡¹</text> |
| | | <view class="safety-warnings"> |
| | | <view v-for="(warning, index) in safetyInfo.warnings" :key="index" class="safety-warning"> |
| | | <view class="warning-icon"> |
| | | <up-icon name="info-circle" size="16" color="#ff6b35"></up-icon> |
| | | </view> |
| | | <text class="warning-content">{{ warning }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- åºæ¥å¤ç --> |
| | | <view class="safety-section"> |
| | | <text class="safety-section-title">ð¨ åºæ¥å¤ç</text> |
| | | <view class="emergency-procedures"> |
| | | <view v-for="(procedure, index) in safetyInfo.emergencyProcedures" :key="index" class="emergency-item"> |
| | | <view class="emergency-header"> |
| | | <text class="emergency-title">{{ procedure.situation }}</text> |
| | | </view> |
| | | <view class="emergency-steps"> |
| | | <view v-for="(step, stepIndex) in procedure.steps" :key="stepIndex" class="emergency-step"> |
| | | <text class="step-number">{{ stepIndex + 1 }}.</text> |
| | | <text class="step-content">{{ step }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- å®å
¨ç¡®è®¤ --> |
| | | <view class="safety-confirmation"> |
| | | <view class="confirmation-header"> |
| | | <up-icon name="checkmark-circle" size="20" color="#4caf50"></up-icon> |
| | | <text class="confirmation-title">å®å
¨ç¡®è®¤</text> |
| | | </view> |
| | | <view class="confirmation-content"> |
| | | <text class="confirmation-text">æå·²ä»ç»é
读并ç解以ä¸å®å
¨æç¤ºï¼å°ä¸¥æ ¼æç
§å®å
¨è§ç¨è¿è¡ä½ä¸</text> |
| | | </view> |
| | | <view class="confirmation-actions"> |
| | | <u-button |
| | | type="success" |
| | | @click="confirmSafety" |
| | | :disabled="safetyConfirmed" |
| | | > |
| | | {{ safetyConfirmed ? '已确认' : '确认并å¼å§ä½ä¸' }} |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- åºé¨æä½æé® --> |
| | | <view class="bottom-actions"> |
| | | <u-button |
| | | type="primary" |
| | | size="large" |
| | | @click="startWork" |
| | | :disabled="!canStartWork" |
| | | > |
| | | å¼å§ä½ä¸ |
| | | </u-button> |
| | | <u-button |
| | | type="info" |
| | | size="large" |
| | | plain |
| | | @click="saveProgress" |
| | | > |
| | | ä¿åè¿åº¦ |
| | | </u-button> |
| | | </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 currentTask = ref({ |
| | | id: 1, |
| | | deviceName: 'æ°æ§è½¦åºCK6140', |
| | | deviceCode: 'CNC-001', |
| | | taskType: '设å¤ç»´ä¿®', |
| | | priority: 'ç´§æ¥', |
| | | status: 'in_progress', |
| | | faultDescription: '主轴å¼åï¼åå精度ä¸é', |
| | | estimatedHours: 4, |
| | | assignedTechnician: 'æå¸å
', |
| | | startTime: '2024-01-15 09:00:00' |
| | | }) |
| | | |
| | | // å¯¼èªæ ç¾ |
| | | const tabs = ref([ |
| | | { key: 'sop', label: 'SOP', icon: 'list' }, |
| | | { key: 'parts', label: 'é
ä»¶', icon: 'grid' }, |
| | | { key: 'safety', label: 'å®å
¨', icon: 'info' } |
| | | ]) |
| | | |
| | | const activeTab = ref('sop') |
| | | |
| | | // SOPæ¥éª¤æ°æ® |
| | | const sopSteps = ref([ |
| | | { |
| | | id: 1, |
| | | title: 'å®å
¨åå¤ä¸è®¾å¤æçµ', |
| | | description: 'ç¡®ä¿è®¾å¤å®å
¨æçµï¼æä¸å®å
¨æ è¯çï¼ç©¿æ´å¥½ä¸ªäººé²æ¤è®¾å¤ï¼æ£æ¥å·¥ä½ç¯å¢å®å
¨ã', |
| | | duration: 10, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'å¿
须确认设å¤å®å
¨æçµåæè½è¿è¡åç»æä½', |
| | | 'æä¸"æ£å¨ç»´ä¿®ï¼ç¦æ¢æä½"çå®å
¨æ è¯ç', |
| | | 'æ£æ¥å¨å´æ¯å¦æå
¶ä»äººåï¼ç¡®ä¿å®å
¨è·ç¦»' |
| | | ], |
| | | tools: ['ä¸ç¨è¡¨', 'å®å
¨æ è¯ç', 'ä¸ªäººé²æ¤è®¾å¤'] |
| | | }, |
| | | { |
| | | id: 2, |
| | | title: 'æå¸ä¸»è½´é²æ¤ç½©', |
| | | description: '使ç¨ä¸ç¨å·¥å
·å°å¿æå¸ä¸»è½´é²æ¤ç½©ï¼æ³¨æä¿æ¤ç½©ç宿´æ§ï¼é¿å
æåå¯å°ä»¶ã', |
| | | duration: 15, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'æå¸æ¶æ³¨æé²æ¤ç½©ééï¼é¿å
æè½ç ¸ä¼¤', |
| | | 'å¯å°ä»¶å®¹æèåï¼æå¸æ¶è¦æ ¼å¤å°å¿', |
| | | 'è®°å½æå¸é¡ºåºï¼ä¾¿äºåç»å®è£
' |
| | | ], |
| | | tools: ['å
å
è§æ³æ', 'æ©¡è¶é¤', 'å¯å°è¶'] |
| | | }, |
| | | { |
| | | id: 3, |
| | | title: 'æ£æ¥ä¸»è½´è½´æ¿ç¶æ', |
| | | description: 'ä»ç»æ£æ¥ä¸»è½´è½´æ¿ç磨ææ
åµï¼æµéè½´æ¿é´éï¼æ£æ¥æ¶¦æ»æ²¹ç¶æåè½´æ¿åº§çé
åæ
åµã', |
| | | duration: 25, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'è½´æ¿æ£æ¥æ¶é¿å
ç¨åè¿å¤§ï¼é²æ¢è¿ä¸æ¥æå', |
| | | '注æè§å¯è½´æ¿è¡¨é¢æ¯å¦æè£çº¹æå¼å¸¸ç£¨æ', |
| | | 'æµéæ°æ®è¦å确记å½ï¼ä½ä¸ºæ´æ¢ä¾æ®' |
| | | ], |
| | | tools: ['游æ å¡å°º', 'ååå°º', 'å
窥é', 'æ¶¦æ»æ²¹æ£æµä»ª'] |
| | | }, |
| | | { |
| | | id: 4, |
| | | title: 'æ´æ¢æåè½´æ¿', |
| | | description: '使ç¨ä¸ç¨ææå¨æå¸æåè½´æ¿ï¼æ¸
æ´è½´æ¿åº§ï¼å®è£
æ°è½´æ¿æ¶ç¡®ä¿é
å精度ã', |
| | | duration: 45, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'è½´æ¿æå¸æ¶å¿
须使ç¨ä¸ç¨å·¥å
·ï¼é¿å
æåè½´é¢', |
| | | 'æ°è½´æ¿å®è£
åè¦æ£æ¥åå·è§æ ¼æ¯å¦æ£ç¡®', |
| | | 'å®è£
æ¶è¦ååç¨åï¼ç¡®ä¿è½´æ¿å®å
¨å°±ä½' |
| | | ], |
| | | tools: ['è½´æ¿ææå¨', 'è½´æ¿å çå¨', 'ä¸ç¨å®è£
å·¥å
·', '润æ»è'] |
| | | }, |
| | | { |
| | | id: 5, |
| | | title: 'è°æ´ä¸»è½´é´é', |
| | | description: 'æ ¹æ®ææ¯è¦æ±è°æ´ä¸»è½´è½´ååå¾åé´éï¼ç¡®ä¿ä¸»è½´è¿è½¬å¹³ç¨³ï¼ç²¾åº¦ç¬¦åæ åã', |
| | | duration: 30, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'é´éè°æ´è¦ä¸¥æ ¼æç
§ææ¯æ åæ§è¡', |
| | | 'è°æ´è¿ç¨ä¸è¦å¤æ¬¡æµé确认', |
| | | 'è°æ´å®æåè¦è¿è¡è¯è¿è½¬æ£éª' |
| | | ], |
| | | tools: ['ç¾å表', 'å¡å°º', 'æåæ³æ'] |
| | | }, |
| | | { |
| | | id: 6, |
| | | title: 'å®è£
鲿¤ç½©å¹¶æµè¯', |
| | | description: 'æç
§æå¸çéåºå®è£
鲿¤ç½©ï¼å æ³¨æ¶¦æ»æ²¹ï¼è¿è¡ä½éè¯è¿è½¬ï¼æ£æ¥è¿è½¬ç¶æã', |
| | | duration: 20, |
| | | completed: false, |
| | | expanded: false, |
| | | warnings: [ |
| | | 'å®è£
æ¶è¦ç¡®ä¿ææå¯å°ä»¶æ£ç¡®å°±ä½', |
| | | 'æ¶¦æ»æ²¹å 注éè¦ç¬¦åè§å®è¦æ±', |
| | | 'è¯è¿è½¬æ¶è¦å¯åè§å¯è®¾å¤ç¶æ' |
| | | ], |
| | | tools: ['æ¶¦æ»æ²¹', 'å¯å°è¶', 'æ¸
æ´å¸'] |
| | | } |
| | | ]) |
| | | |
| | | const currentStepIndex = ref(0) |
| | | |
| | | // é
ä»¶æ¸
åæ°æ® |
| | | const partsList = ref([ |
| | | { |
| | | id: 1, |
| | | name: '主轴轴æ¿', |
| | | specification: 'NSK 7020C', |
| | | partNumber: 'BRG-7020C-001', |
| | | requiredQuantity: 2, |
| | | stockQuantity: 5, |
| | | unit: '个', |
| | | available: true, |
| | | location: 'ä»åºAåº-03è´§æ¶', |
| | | supplier: 'æ¥æ¬NSKå
¬å¸', |
| | | price: 1250.00 |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: 'å¯å°å', |
| | | specification: 'Oåå Ï45Ã3', |
| | | partNumber: 'SEAL-045-003', |
| | | requiredQuantity: 4, |
| | | stockQuantity: 2, |
| | | unit: '个', |
| | | available: false, |
| | | location: 'ä»åºBåº-12è´§æ¶', |
| | | supplier: 'å¾·å½è´¹æ¯æ', |
| | | price: 25.50 |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: '润æ»è', |
| | | specification: '髿¸©è½´æ¿æ¶¦æ»è 2#', |
| | | partNumber: 'LUB-HT-002', |
| | | requiredQuantity: 1, |
| | | stockQuantity: 8, |
| | | unit: 'æ¯', |
| | | available: true, |
| | | location: 'ä»åºCåº-05è´§æ¶', |
| | | supplier: 'ç¾åç³æ²¹', |
| | | price: 180.00 |
| | | }, |
| | | { |
| | | id: 4, |
| | | name: 'èºæ ', |
| | | specification: 'M8Ã25 å
å
è§èºæ ', |
| | | partNumber: 'BOLT-M8-025', |
| | | requiredQuantity: 8, |
| | | stockQuantity: 50, |
| | | unit: '个', |
| | | available: true, |
| | | location: 'ä»åºAåº-01è´§æ¶', |
| | | supplier: 'æ åä»¶å', |
| | | price: 2.50 |
| | | }, |
| | | { |
| | | id: 5, |
| | | name: 'å«ç', |
| | | specification: 'è°æ´å«ç Ï40Ã0.1', |
| | | partNumber: 'SHIM-040-01', |
| | | requiredQuantity: 6, |
| | | stockQuantity: 0, |
| | | unit: 'ç', |
| | | available: false, |
| | | location: 'ä»åºAåº-08è´§æ¶', |
| | | supplier: 'ç²¾å¯å å·¥å', |
| | | price: 15.00 |
| | | } |
| | | ]) |
| | | |
| | | // å®å
¨ä¿¡æ¯æ°æ® |
| | | const safetyInfo = ref({ |
| | | level: 'é«é£é©', |
| | | title: 'æºæ¢°è®¾å¤ç»´ä¿®å®å
¨è§ç¨', |
| | | description: 'æ¬æ¬¡ç»´ä¿®æ¶åéåæºæ¢°è®¾å¤ï¼å卿ºæ¢°ä¼¤å®³ãçµå»çé£é©ï¼è¯·ä¸¥æ ¼éµå®å®å
¨æä½è§ç¨ã', |
| | | ppe: [ |
| | | { |
| | | name: 'å®å
¨å¸½', |
| | | icon: 'âï¸', |
| | | description: '鲿¢å¤´é¨åå°æå»ä¼¤å®³', |
| | | checked: false |
| | | }, |
| | | { |
| | | name: 'å®å
¨ç¼é', |
| | | icon: 'ð¥½', |
| | | description: '鲿¢éå±å±é£æº
伤ç¼', |
| | | checked: false |
| | | }, |
| | | { |
| | | name: '鲿¤æå¥', |
| | | icon: 'ð§¤', |
| | | description: '鲿¢æé¨å²ä¼¤åç«ä¼¤', |
| | | checked: false |
| | | }, |
| | | { |
| | | name: 'å®å
¨é', |
| | | icon: 'ð¢', |
| | | description: '鲿¢è¶³é¨è¢«éç©ç ¸ä¼¤', |
| | | checked: false |
| | | }, |
| | | { |
| | | name: '工使', |
| | | icon: 'ð¦º', |
| | | description: '鲿¢è¡£ç©è¢«æºæ¢°å·å
¥', |
| | | checked: false |
| | | } |
| | | ], |
| | | warnings: [ |
| | | 'ç»´ä¿®åå¿
须确认设å¤å®å
¨æçµï¼å¹¶æä¸å®å
¨æ è¯ç', |
| | | '使ç¨å·¥å
·åè¦æ£æ¥å·¥å
·ç¶æï¼ç¡®ä¿å®å¥½æ æ', |
| | | 'æå¸éåé¨ä»¶æ¶è¦ä½¿ç¨èµ·é设å¤ï¼ä¸å¾å¾ææä½', |
| | | 'å·¥ä½åºåè¦ä¿ææ´æ´ï¼åæ¶æ¸
çæ²¹æ±¡åæç©', |
| | | 'åç°å¼å¸¸æ
åµè¦ç«å³åæ¢ä½ä¸ï¼æ¥åç°åºè´è´£äºº', |
| | | '严ç¦å¨ç²å³ç¶æä¸è¿è¡ç²¾å¯æä½', |
| | | 'å¤äººå使¶è¦æç¡®åå·¥ï¼å 强æ²éåè°' |
| | | ], |
| | | emergencyProcedures: [ |
| | | { |
| | | situation: '人åå伤', |
| | | steps: [ |
| | | 'ç«å³åæ¢ææä½ä¸æ´»å¨', |
| | | 'è¯ä¼°ä¼¤æ
严éç¨åº¦', |
| | | '轻伤è¿è¡ç°åºæ¥æå¤ç', |
| | | 'é伤ç«å³æ¨æ120æ¥æçµè¯', |
| | | 'éç¥å®å
¨ç®¡ç人åå项ç®è´è´£äºº', |
| | | 'ä¿æ¤ç°åºï¼é
åäºæ
è°æ¥' |
| | | ] |
| | | }, |
| | | { |
| | | situation: 'è®¾å¤æ
é', |
| | | steps: [ |
| | | 'ç«å³æä¸æ¥åæé®', |
| | | 'åæè®¾å¤çµæº', |
| | | 'çæ£å¨å´äººåå°å®å
¨åºå', |
| | | 'éç¥è®¾å¤ç®¡ç人å', |
| | | 'è®°å½æ
éç°è±¡åæ¶é´', |
| | | 'çå¾
ä¸ä¸äººåå¤ç' |
| | | ] |
| | | }, |
| | | { |
| | | situation: 'ç«ç¾äºæ
', |
| | | steps: [ |
| | | 'ç«å³åæçµæº', |
| | | '使ç¨éå½ççç«å¨æ', |
| | | 'çæ£ç°åºäººå', |
| | | 'æ¨æ119ç«è¦çµè¯', |
| | | 'éç¥æ¶é²å®å
¨ç®¡ç人å', |
| | | 'é
åæ¶é²é¨é¨ææ´' |
| | | ] |
| | | } |
| | | ] |
| | | }) |
| | | |
| | | const safetyConfirmed = ref(false) |
| | | |
| | | // 计ç®å±æ§ |
| | | const completedSteps = computed(() => { |
| | | return sopSteps.value.filter(step => step.completed).length |
| | | }) |
| | | |
| | | const canStartWork = computed(() => { |
| | | return safetyConfirmed.value && completedSteps.value > 0 |
| | | }) |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack() |
| | | } |
| | | |
| | | // è·åä»»å¡ç¶æç±»å |
| | | const getStatusType = (status) => { |
| | | const statusMap = { |
| | | 'pending': 'warning', |
| | | 'in_progress': 'primary', |
| | | 'completed': 'success', |
| | | 'paused': 'info' |
| | | } |
| | | return statusMap[status] || 'info' |
| | | } |
| | | |
| | | // è·åä»»å¡ç¶æææ¬ |
| | | const getStatusText = (status) => { |
| | | const statusMap = { |
| | | 'pending': 'å¾
å¼å§', |
| | | 'in_progress': 'è¿è¡ä¸', |
| | | 'completed': '已宿', |
| | | 'paused': 'å·²æå' |
| | | } |
| | | return statusMap[status] || 'æªç¥' |
| | | } |
| | | |
| | | // 忢æ ç¾ |
| | | const switchTab = (tabKey) => { |
| | | activeTab.value = tabKey |
| | | } |
| | | |
| | | // 忢æ¥éª¤å±å¼ç¶æ |
| | | const toggleStep = (index) => { |
| | | sopSteps.value[index].expanded = !sopSteps.value[index].expanded |
| | | } |
| | | |
| | | // 宿æ¥éª¤ |
| | | const completeStep = (index) => { |
| | | sopSteps.value[index].completed = true |
| | | showToast('æ¥éª¤å·²å®æ') |
| | | |
| | | // èªå¨å±å¼ä¸ä¸æ¥ |
| | | if (index < sopSteps.value.length - 1) { |
| | | currentStepIndex.value = index + 1 |
| | | sopSteps.value[index + 1].expanded = true |
| | | } |
| | | } |
| | | |
| | | // 忶宿æ¥éª¤ |
| | | const uncompleteStep = (index) => { |
| | | sopSteps.value[index].completed = false |
| | | showToast('å·²åæ¶å®æç¶æ') |
| | | } |
| | | |
| | | // ç³è¯·é
ä»¶ |
| | | const requestPart = (part) => { |
| | | uni.showModal({ |
| | | title: 'ç³è¯·é
ä»¶', |
| | | content: `确认ç³è¯·é
ä»¶"${part.name}"ï¼`, |
| | | confirmText: '确认', |
| | | cancelText: 'åæ¶', |
| | | success: (res) => { |
| | | if (res.confirm) { |
| | | showToast('é
ä»¶ç³è¯·å·²æäº¤') |
| | | // è¿éå¯ä»¥è°ç¨APIæäº¤ç³è¯· |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // æ¥çé
件详æ
|
| | | const viewPartDetail = (part) => { |
| | | uni.showModal({ |
| | | title: part.name, |
| | | content: `é
ä»¶ç¼å·: ${part.partNumber}\nè§æ ¼: ${part.specification}\nä¾åºå: ${part.supplier}\nåä»·: Â¥${part.price}`, |
| | | showCancel: false, |
| | | confirmText: 'ç¥éäº' |
| | | }) |
| | | } |
| | | |
| | | // è·åå®å
¨ç级类å |
| | | const getSafetyLevelType = (level) => { |
| | | const levelMap = { |
| | | 'ä½é£é©': 'success', |
| | | 'ä¸é£é©': 'warning', |
| | | 'é«é£é©': 'error' |
| | | } |
| | | return levelMap[level] || 'info' |
| | | } |
| | | |
| | | // 忢PPEç¶æ |
| | | const togglePPE = (ppe) => { |
| | | ppe.checked = !ppe.checked |
| | | if (ppe.checked) { |
| | | showToast(`已确认佩æ´${ppe.name}`) |
| | | } |
| | | } |
| | | |
| | | // 确认å®å
¨ |
| | | const confirmSafety = () => { |
| | | const uncheckedPPE = safetyInfo.value.ppe.filter(ppe => !ppe.checked) |
| | | if (uncheckedPPE.length > 0) { |
| | | showToast('è¯·ç¡®è®¤å·²ä½©æ´ææä¸ªäººé²æ¤è®¾å¤') |
| | | return |
| | | } |
| | | |
| | | safetyConfirmed.value = true |
| | | showToast('å®å
¨ç¡®è®¤å®æï¼å¯ä»¥å¼å§ä½ä¸') |
| | | } |
| | | |
| | | // å¼å§ä½ä¸ |
| | | const startWork = () => { |
| | | if (!safetyConfirmed.value) { |
| | | showToast('请å
宿å®å
¨ç¡®è®¤') |
| | | return |
| | | } |
| | | |
| | | if (completedSteps.value === 0) { |
| | | showToast('请è³å°å®æä¸ä¸ªSOPæ¥éª¤') |
| | | return |
| | | } |
| | | |
| | | uni.showModal({ |
| | | title: 'å¼å§ä½ä¸', |
| | | content: '确认å¼å§æ£å¼ä½ä¸ï¼', |
| | | confirmText: 'å¼å§', |
| | | cancelText: 'åæ¶', |
| | | success: (res) => { |
| | | if (res.confirm) { |
| | | currentTask.value.status = 'in_progress' |
| | | showToast('ä½ä¸å·²å¼å§ï¼è¯·æç
§SOPæ§è¡') |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // ä¿åè¿åº¦ |
| | | const saveProgress = () => { |
| | | const progress = { |
| | | taskId: currentTask.value.id, |
| | | completedSteps: completedSteps.value, |
| | | safetyConfirmed: safetyConfirmed.value, |
| | | timestamp: new Date().toISOString() |
| | | } |
| | | |
| | | // è¿éå¯ä»¥è°ç¨APIä¿åè¿åº¦ |
| | | showToast('è¿åº¦å·²ä¿å') |
| | | console.log('ä¿åçè¿åº¦:', progress) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | // 页é¢å è½½æ¶çåå§åé»è¾ |
| | | // å¯ä»¥æ ¹æ®ä»»å¡IDå 载对åºçSOPãé
ä»¶æ¸
ååå®å
¨æç¤º |
| | | }) |
| | | |
| | | onShow(() => { |
| | | // 页颿¾ç¤ºæ¶çé»è¾ |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import '@/styles/sales-common.scss'; |
| | | |
| | | // æ åä½ä¸æå¯¼ç¹ææ ·å¼ |
| | | .sales-account { |
| | | padding-bottom: 100px; |
| | | } |
| | | |
| | | // ä»»å¡ä¿¡æ¯å¡ç |
| | | .task-info-card { |
| | | margin: 20px; |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .task-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .task-left { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .task-icon { |
| | | width: 40px; |
| | | height: 40px; |
| | | background: #2979ff; |
| | | border-radius: 8px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .task-details { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | } |
| | | |
| | | .task-title { |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | } |
| | | |
| | | .task-subtitle { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | .task-meta { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .meta-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .meta-label { |
| | | font-size: 12px; |
| | | color: #777; |
| | | min-width: 70px; |
| | | } |
| | | |
| | | .meta-value { |
| | | font-size: 12px; |
| | | color: #333; |
| | | flex: 1; |
| | | text-align: right; |
| | | } |
| | | |
| | | // å¯¼èªæ ç¾ |
| | | .nav-tabs { |
| | | display: flex; |
| | | background: #ffffff; |
| | | margin: 0 20px; |
| | | border-radius: 12px; |
| | | padding: 4px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .nav-tab { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | gap: 4px; |
| | | padding: 12px 8px; |
| | | border-radius: 8px; |
| | | transition: all 0.3s ease; |
| | | |
| | | &.active { |
| | | background: #f3f7ff; |
| | | } |
| | | } |
| | | |
| | | .tab-text { |
| | | font-size: 12px; |
| | | color: #666; |
| | | |
| | | &.active { |
| | | color: #2979ff; |
| | | font-weight: 500; |
| | | } |
| | | } |
| | | |
| | | // å
容åºå |
| | | .content-section { |
| | | margin: 20px; |
| | | } |
| | | |
| | | .section-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | } |
| | | |
| | | .progress-info { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 4px; |
| | | } |
| | | |
| | | .progress-text { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | // SOPæ¥éª¤æ ·å¼ |
| | | .sop-steps { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .sop-step { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | border: 1px solid #f0f0f0; |
| | | overflow: hidden; |
| | | transition: all 0.3s ease; |
| | | |
| | | &.completed { |
| | | border-color: #4caf50; |
| | | background: #f8fff8; |
| | | } |
| | | |
| | | &.current { |
| | | border-color: #2979ff; |
| | | box-shadow: 0 2px 8px rgba(41, 121, 255, 0.1); |
| | | } |
| | | } |
| | | |
| | | .step-header { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 16px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .step-number { |
| | | width: 28px; |
| | | height: 28px; |
| | | border-radius: 50%; |
| | | background: #f5f5f5; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-right: 12px; |
| | | |
| | | .sop-step.completed & { |
| | | background: #4caf50; |
| | | } |
| | | } |
| | | |
| | | .step-num { |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | color: #666; |
| | | |
| | | .sop-step.completed & { |
| | | color: #ffffff; |
| | | } |
| | | } |
| | | |
| | | .step-content { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | } |
| | | |
| | | .step-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | } |
| | | |
| | | .step-duration { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | .step-details { |
| | | padding: 0 16px 16px 16px; |
| | | border-top: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .step-description { |
| | | margin: 16px 0; |
| | | } |
| | | |
| | | .desc-text { |
| | | font-size: 13px; |
| | | color: #555; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .step-warnings { |
| | | margin: 16px 0; |
| | | padding: 12px; |
| | | background: #fff3e0; |
| | | border-radius: 8px; |
| | | border-left: 4px solid #ff9800; |
| | | } |
| | | |
| | | .warning-title { |
| | | font-size: 13px; |
| | | font-weight: 500; |
| | | color: #e65100; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .warning-item { |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .warning-text { |
| | | font-size: 12px; |
| | | color: #bf360c; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | .step-tools { |
| | | margin: 16px 0; |
| | | } |
| | | |
| | | .tools-title { |
| | | font-size: 13px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .tools-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 6px; |
| | | } |
| | | |
| | | .tool-tag { |
| | | margin: 0; |
| | | } |
| | | |
| | | .step-actions { |
| | | margin-top: 16px; |
| | | display: flex; |
| | | gap: 8px; |
| | | } |
| | | |
| | | // é
ä»¶æ¸
åæ ·å¼ |
| | | .parts-summary { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .summary-text { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | .parts-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .part-item { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | border: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .part-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-start; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .part-info { |
| | | flex: 1; |
| | | } |
| | | |
| | | .part-name { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | display: block; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .part-spec { |
| | | font-size: 12px; |
| | | color: #666; |
| | | } |
| | | |
| | | .part-details { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 6px; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | .detail-row { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-label { |
| | | font-size: 12px; |
| | | color: #777; |
| | | min-width: 70px; |
| | | } |
| | | |
| | | .detail-value { |
| | | font-size: 12px; |
| | | color: #333; |
| | | |
| | | &.danger { |
| | | color: #f44336; |
| | | font-weight: 500; |
| | | } |
| | | } |
| | | |
| | | .part-actions { |
| | | display: flex; |
| | | gap: 8px; |
| | | } |
| | | |
| | | // å®å
¨æç¤ºæ ·å¼ |
| | | .safety-level { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .safety-overview { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 12px; |
| | | padding: 16px; |
| | | background: #fff3e0; |
| | | border-radius: 12px; |
| | | margin-bottom: 20px; |
| | | border-left: 4px solid #ff6b35; |
| | | } |
| | | |
| | | .safety-icon { |
| | | margin-top: 2px; |
| | | } |
| | | |
| | | .safety-content { |
| | | flex: 1; |
| | | } |
| | | |
| | | .safety-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #e65100; |
| | | display: block; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .safety-desc { |
| | | font-size: 12px; |
| | | color: #bf360c; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | .safety-section { |
| | | margin-bottom: 20px; |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | border: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .safety-section-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | margin-bottom: 12px; |
| | | } |
| | | |
| | | // PPEå表 |
| | | .ppe-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .ppe-item { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | padding: 12px; |
| | | background: #f8f9fa; |
| | | border-radius: 8px; |
| | | } |
| | | |
| | | .ppe-icon { |
| | | width: 32px; |
| | | height: 32px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .ppe-emoji { |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .ppe-info { |
| | | flex: 1; |
| | | } |
| | | |
| | | .ppe-name { |
| | | font-size: 13px; |
| | | font-weight: 500; |
| | | color: #333; |
| | | display: block; |
| | | margin-bottom: 2px; |
| | | } |
| | | |
| | | .ppe-desc { |
| | | font-size: 11px; |
| | | color: #666; |
| | | } |
| | | |
| | | // å®å
¨è¦å |
| | | .safety-warnings { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .safety-warning { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 8px; |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | .warning-icon { |
| | | margin-top: 2px; |
| | | } |
| | | |
| | | .warning-content { |
| | | flex: 1; |
| | | font-size: 12px; |
| | | color: #555; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | // åºæ¥å¤ç |
| | | .emergency-procedures { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .emergency-item { |
| | | border: 1px solid #ffcdd2; |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .emergency-header { |
| | | background: #ffebee; |
| | | padding: 12px 16px; |
| | | border-bottom: 1px solid #ffcdd2; |
| | | } |
| | | |
| | | .emergency-title { |
| | | font-size: 13px; |
| | | font-weight: 500; |
| | | color: #c62828; |
| | | } |
| | | |
| | | .emergency-steps { |
| | | padding: 12px 16px; |
| | | } |
| | | |
| | | .emergency-step { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 8px; |
| | | margin-bottom: 8px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .step-number { |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | color: #d32f2f; |
| | | min-width: 16px; |
| | | } |
| | | |
| | | .step-content { |
| | | font-size: 12px; |
| | | color: #555; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | // å®å
¨ç¡®è®¤ |
| | | .safety-confirmation { |
| | | background: #e8f5e8; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | border: 1px solid #c8e6c9; |
| | | } |
| | | |
| | | .confirmation-header { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .confirmation-title { |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | color: #2e7d32; |
| | | } |
| | | |
| | | .confirmation-content { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .confirmation-text { |
| | | font-size: 12px; |
| | | color: #388e3c; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | .confirmation-actions { |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | // åºé¨æä½æé® |
| | | .bottom-actions { |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | background: #ffffff; |
| | | padding: 16px 20px; |
| | | border-top: 1px solid #f0f0f0; |
| | | display: flex; |
| | | gap: 12px; |
| | | z-index: 100; |
| | | } |
| | | |
| | | .bottom-actions .u-button { |
| | | flex: 1; |
| | | } |
| | | </style> |