| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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">设å¤åè½æ¢å¤æ£å¸¸ï¼è¿è¡å¹³ç¨³ï¼åé¡¹ææ è¾¾å°é¢æè¦æ±</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: '鲿¤ç½©å®è£
å°ä½ï¼æ¥åæé®æ£å¸¸' |
| | | }, |
| | | { |
| | | id: 3, |
| | | title: '润æ»ç³»ç»æ£æ¥', |
| | | description: 'æ£æ¥æ¶¦æ»æ²¹ä½å润æ»ç³»ç»å·¥ä½ç¶æ', |
| | | result: 'pass', |
| | | remark: 'æ¶¦æ»æ²¹ä½æ£å¸¸ï¼èªå¨æ¶¦æ»ç³»ç»å·¥ä½æ£å¸¸' |
| | | }, |
| | | { |
| | | id: 4, |
| | | title: 'çµæ°ç³»ç»æ£æ¥', |
| | | description: 'æ£æ¥çµæ°è¿æ¥åæ§å¶ç³»ç»åè½', |
| | | result: 'pass', |
| | | remark: 'çµæ°è¿æ¥ç¢åºï¼æ§å¶ç³»ç»ååºæ£å¸¸' |
| | | }, |
| | | { |
| | | id: 5, |
| | | title: 'æ¸
æ´æ´ç', |
| | | description: '确认工ä½åºåæ¸
æ´æ´ç宿¯', |
| | | result: 'pass', |
| | | remark: 'å·¥ä½åºåå·²æ¸
çå¹²åï¼å·¥å
·å½ä½' |
| | | } |
| | | ]) |
| | | |
| | | const inspectionSummary = ref('æ¬æ¬¡ç»´ä¿®æ´æ¢äºä¸»è½´è½´æ¿ï¼è°æ´äºä¸»è½´é´éï¼è®¾å¤è¿è¡ç¶æè¯å¥½ï¼å项åè½æµè¯æ£å¸¸ï¼è¾¾å°é¢æç»´ä¿®ææã') |
| | | |
| | | // æ£æ¥é项 |
| | | 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: 'ç°åºéªè¯è®¾å¤åè½æ¯å¦æ¢å¤æ£å¸¸', |
| | | 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> |