From 18eb4308e941a265daba8eda2f2ee91115963a3c Mon Sep 17 00:00:00 2001
From: haoxuan <haoxuan>
Date: 星期四, 18 四月 2024 17:06:04 +0800
Subject: [PATCH] 1
---
src/views/dashboard/components/TaskControlModal.vue | 614 +++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 432 insertions(+), 182 deletions(-)
diff --git a/src/views/dashboard/components/TaskControlModal.vue b/src/views/dashboard/components/TaskControlModal.vue
index 247a850..c4c6db6 100644
--- a/src/views/dashboard/components/TaskControlModal.vue
+++ b/src/views/dashboard/components/TaskControlModal.vue
@@ -1,141 +1,152 @@
<template>
<div class="task-control-modal">
<BaseModal v-model="modelData" :wider="false">
- <template #title>鏂颁换鍔�</template>
+ <template #title>
+ {{ !['涓嬪彂鍙傛暟鎴愬姛', '涓嬪彂鍙傛暟澶辫触'].includes(state.value as string) ? '鏂颁换鍔�' : '鎻愮ず' }}
+ </template>
<div class="modal-content">
- <div v-if="!messageError" class="content-title">
- <div class="content-title-item">褰撳墠浠诲姟锛歿{ task?.Procedure.procedure.procedureName || '' }}</div>
- <div class="content-title-item">
- 鐢熶骇鏁伴噺锛�
- <div class="leaf-shape box">
- {{ task?.Order?.amount || 0 }}
+ <template v-if="['鍒濆鍖�', '璁℃椂涓�', '鍑嗗鐢熶骇', '涓嬪彂鍙傛暟涓�'].includes(state.value as string)">
+ <div class="content-title">
+ <div class="content-title-item">褰撳墠浠诲姟锛歿{ task?.Procedure?.procedure?.procedureName || '' }}</div>
+ <div class="content-title-item">
+ 鐢熶骇鏁伴噺锛�
+ <div class="leaf-shape">
+ {{ task?.Order?.amount || 0 }}
+ </div>
</div>
</div>
- </div>
- <div v-if="!!messageError" class="content-tips">
- <div class="error-t">
- <span v-if="messageError === '涓嬪彂鎴愬姛锛�'" class="el-icon-success color_success"></span>
- <span v-else class="el-icon-error color_error"></span>
- </div>
- <div class="error-m">
- {{ messageError }}
- </div>
- <div class="font_size_20 color_fff" style="text-align: center; width: 100%; margin: 10px 0">
- <span v-if="messageError === '涓嬪彂鎴愬姛锛�'" style="font-size: 30px"></span>
- <span v-else>璇烽噸璇�</span>
- </div>
- </div>
+ <div class="content-scroll">
+ <div class="scroll-container">
+ <el-scrollbar always class="scroller">
+ <template v-if="task">
+ <div class="info">
+ <div class="info-item">璁㈠崟缂栧彿锛歿{ task.Order.orderId || '' }}</div>
+ <div class="info-item">宸ュ崟缂栧彿锛歿{ task.Order.workOrderId || '' }}</div>
+ <div class="info-item">浜у搧鍚嶇О锛歿{ task.Order.productName || '' }}</div>
+ <div class="info-item">鏁伴噺锛歿{ task.Order.amount || 0 }}{{ task.Order.unit }}</div>
+ <div class="info-item">浜よ揣鏃ユ湡锛歿{ task.Order.deliverDate || '' }}</div>
+ <div class="info-item">宸ユ椂锛� {{ task?.Procedure?.procedure?.workHours || '' }}</div>
+ <div class="info-item">
+ 璁″垝鏃堕棿锛� {{ formatDate(task?.Procedure?.startTime) || '' }}
+ -
+ {{ formatDate(task?.Procedure?.endTime) }}
+ </div>
- <div v-else class="content-scroll">
- <div class="scroll-container">
- <el-scrollbar always class="scroller">
- <template v-if="task">
- <div class="info">
- <div class="info-item">璁㈠崟缂栧彿锛歿{ task.Order.orderId || '' }}</div>
- <div class="info-item">宸ュ崟缂栧彿锛歿{ task.Order.workOrderId || '' }}</div>
- <div class="info-item">浜у搧鍚嶇О锛歿{ task.Order.productName || '' }}</div>
- <div class="info-item">鏁伴噺锛歿{ task.Order.amount || 0 }}{{ task.Order.unit }}</div>
- <div class="info-item">浜よ揣鏃ユ湡锛歿{ task.Order.deliverDate || '' }}</div>
- <div class="info-item">宸ユ椂锛� {{ task.Procedure.procedure.workHours || '' }}</div>
- <div class="info-item">
- 璁″垝鏃堕棿锛� {{ formatDate(task.Procedure.startTime) || '' }}
- -
- {{ formatDate(task.Procedure.endTime) }}
- </div>
+ <div class="info-item">瀹㈡埛鍚嶇О锛歿{ task.Order.customer || '' }}</div>
+ <div class="info-item info-item-two">閫氶亾锛� {{ CHANNEL_NAME_MAP[task.Channel] || '' }}</div>
- <div class="info-item">瀹㈡埛鍚嶇О锛歿{ task.Order.customer || '' }}</div>
- <div class="info-item info-item-two">閫氶亾锛� {{ CHANNEL_NAME_MAP[task.Channel] || '' }}</div>
+ <div class="info-item info-item-two">鍙傛暟瑕佹眰锛歿{ task.Order.parameter || '' }}</div>
- <div class="info-item info-item-two">鍙傛暟瑕佹眰锛歿{ task.Order.parameter || '' }}</div>
-
- <div class="info-item-two">
- <div style="color: #4efefa; font-size: 18px; margin-bottom: 10px; margin-top: 20px">宸ヨ壓鍙傛暟</div>
- <div v-for="(item, index) in craftParams" :key="index" class="info-item info-item-two">
- {{ item.Key }}锛歿{ item.Value || '' }}
+ <div class="info-item-two">
+ <div style="color: #4efefa; font-size: 18px; margin-bottom: 10px; margin-top: 20px">宸ヨ壓鍙傛暟</div>
+ <!-- 鏈幏鍙栧埌宸ヨ壓鍙傛暟, 涓斿綋鍓嶈澶囧厑璁稿湪娌℃湁宸ヨ壓鍙傛暟鐨勬儏鍐典笅鐢熶骇, 鍒欐彁绀�-->
+ <div v-if="!craftParams?.length && currentDeviceAllowNoParams" class="info-item info-item-two">
+ 鏈幏鍙栧埌宸ヨ壓鍙傛暟, 璇锋墜鍔ㄨ缃垨鍦ㄤ簯绔伐鑹烘ā鍨嬩腑涓婁紶
+ </div>
+ <div v-for="(item, index) in craftParams" :key="index" class="info-item info-item-two">
+ {{ item.Key }}锛歿{ item.Value || '' }}
+ </div>
</div>
</div>
- </div>
-
- <div class="title-auto-box"></div>
- <div v-if="getCraftParamsErrMsg" class="process-err-tip">
- <div class="tip-icon">
- <span class="el-icon-error color_error"></span>
- </div>
- <div class="tip-content">鎻愮ず: {{ getCraftParamsErrMsg }}</div>
- </div>
-
- <div v-if="countdown30s.countdownStatus.value === 'running'" class="countdown">
- {{ countdown30s.formattedTime.value }}
- </div>
-
- <!-- <div v-if="showBtn === 2 || showBtn === 3" class="process-box">-->
- <!-- <div-->
- <!-- style="-->
- <!-- color: red;-->
- <!-- font-size: 26px;-->
- <!-- width: 100%;-->
- <!-- text-align: center;-->
- <!-- margin-bottom: 15px;-->
- <!-- line-height: 35px;-->
- <!-- "-->
- <!-- :class="showBtn === 3 && isLoading ? 'margin-top-10px' : 'margin-top-40px'"-->
- <!-- >-->
- <!-- <div v-if="showBtn === 2 || (showBtn === 3 && !isLoading)" class="gif-box">-->
- <!-- <template v-if="showBtn === 2">-->
- <!-- <div class="gif">-->
- <!-- <img src="../../public/shan.gif" />-->
- <!-- </div>-->
- <!-- </template>-->
- <!-- <template v-if="showBtn === 3 && !isLoading">-->
- <!-- <div class="gif">-->
- <!-- <span class="yuandian"></span>-->
- <!-- </div>-->
- <!-- </template>-->
- <!-- <div class="gif-right">-->
- <!-- <div>----- 鍓╀綑鏃堕棿 -----</div>-->
- <!-- <div>-->
- <!-- <span>00:{{ countdown30s.formattedTime }}</span>-->
- <!-- </div>-->
- <!-- </div>-->
- <!-- </div>-->
- <!-- {{ message }}-->
- <!-- </div>-->
- <!-- <template v-if="showBtn === 3 && isLoading">-->
- <!-- <div class="progress-item">-->
- <!-- <span>{{ (+num / 30) * 100 }}%</span>-->
- <!-- <el-progress-->
- <!-- style="width: calc(100% - 50px); float: right"-->
- <!-- define-back-color="#CDC6C6"-->
- <!-- color="#00cc66"-->
- <!-- text-color="#fff"-->
- <!-- :text-inside="true"-->
- <!-- :stroke-width="20"-->
- <!-- :percentage="(+num / 30) * 100"-->
- <!-- ></el-progress>-->
- <!-- </div>-->
- <!-- </template>-->
- <!-- </div>-->
- </template>
- </el-scrollbar>
+ </template>
+ </el-scrollbar>
+ </div>
</div>
- </div>
+ </template>
+
+ <!-- 鍙湁鑾峰彇鍒板伐鑹哄弬鏁版墠鍙互杩涜鎿嶄綔-->
+ <template v-if="getCraftParamsTip && !currentDeviceAllowNoParams">
+ <div class="content-tips">
+ <div class="craft-params-error">
+ <div class="error-icon">
+ <el-icon size="90" color="red"><CircleCloseFilled /></el-icon>
+ </div>
+ <div class="error-tip">{{ getCraftParamsTip }}</div>
+ </div>
+ </div>
+ </template>
+
+ <template v-else>
+ <div v-if="['璁℃椂涓�', '鍑嗗鐢熶骇'].includes(state.value as string)" class="content-tips">
+ <div class="prepare">
+ <div class="countdown">
+ <div class="alert-light">
+ <div class="light" :class="{ blink: state.value === '璁℃椂涓�' }"></div>
+ </div>
+ <div class="time">
+ <div class="time-label">----- 鍓╀綑鏃堕棿 -----</div>
+ <div class="time-text">00:{{ countdown30s.formattedTime.value }}</div>
+ </div>
+ </div>
+ <div class="safe-tip">
+ {{ safeProduce }}
+ </div>
+ </div>
+ </div>
+
+ <div v-if="['涓嬪彂鍙傛暟涓�'].includes(state.value as string)" class="content-tips">
+ <div class="delivery">
+ <div class="delivery-tip">宸ヨ壓鍙傛暟涓嬪彂涓�...</div>
+ <div class="delivery-progress">
+ <el-progress :text-inside="true" :stroke-width="30" :percentage="50" status="success" />
+ </div>
+ </div>
+ </div>
+
+ <div v-if="['涓嬪彂鍙傛暟鎴愬姛'].includes(state.value as string)" class="delivery-success-tips">
+ <div class="success-icon">
+ <el-icon size="90" color="green"><SuccessFilled /></el-icon>
+ </div>
+ <div class="success-tip">{{ deliveryTip }}</div>
+ <div class="success-sub-tip">{{ countdown3s.remainingSeconds }}s</div>
+ </div>
+
+ <div v-if="['涓嬪彂鍙傛暟澶辫触'].includes(state.value as string)" class="delivery-error-tips">
+ <div class="error-icon">
+ <el-icon size="90" color="red"><CircleCloseFilled /></el-icon>
+ </div>
+ <div class="error-tip">{{ deliveryTip }}</div>
+ <div class="error-sub-tip">璇烽噸璇�</div>
+ </div>
+ </template>
</div>
<template #footer>
- <div class="btn">
- <BigButton bg-color="#4765c0" @click="closeModal">鏆傜紦鐢熶骇</BigButton>
- <BigButton
- v-if="countdown30s.countdownStatus.value !== 'complete'"
- color="#0d0d0d"
- :disabled="countdown30s.countdownStatus.value === 'running'"
- @click="startCountdown30s"
- >
- 鐢熶骇鍑嗗
- </BigButton>
- <BigButton v-if="countdown30s.countdownStatus.value === 'complete'" bg-color="#4efefa" @click="startProduce">
- 寮�濮嬬敓浜�
- </BigButton>
- </div>
+ <template v-if="getCraftParamsTip && !currentDeviceAllowNoParams">
+ <div class="btn">
+ <BigButton bg-color="#4765c0" @click="closeModal"> 鍏抽棴 </BigButton>
+ </div>
+ </template>
+
+ <template v-else>
+ <div class="btn">
+ <BigButton
+ v-if="!['涓嬪彂鍙傛暟鎴愬姛', '涓嬪彂鍙傛暟澶辫触'].includes(state.value as string)"
+ bg-color="#4765c0"
+ @click="respiteProduce"
+ >
+ 鏆傜紦鐢熶骇
+ </BigButton>
+ <BigButton
+ v-if="['鍒濆鍖�', '璁℃椂涓�'].includes(state.value as string)"
+ color="#0d0d0d"
+ :disabled="state.value === '璁℃椂涓�'"
+ @click="prepareProduce"
+ >
+ 鐢熶骇鍑嗗
+ </BigButton>
+ <BigButton v-if="state.value === '鍑嗗鐢熶骇'" bg-color="#4efefa" @click="startProduce"> 寮�濮嬬敓浜� </BigButton>
+ <BigButton v-if="state.value === '涓嬪彂鍙傛暟涓�'" bg-color="#4efefa">
+ <el-icon class="is-loading" color="#000">
+ <Loading />
+ </el-icon>
+ </BigButton>
+ <BigButton v-if="state.value === '涓嬪彂鍙傛暟澶辫触'" bg-color="#4765c0" @click="deliverParams">
+ 鍐嶆涓嬪彂
+ </BigButton>
+ <BigButton v-if="state.value === '涓嬪彂鍙傛暟鎴愬姛'" bg-color="#4765c0" @click="closeModal"> 鍏抽棴 </BigButton>
+ </div>
+ </template>
</template>
</BaseModal>
</div>
@@ -143,13 +154,17 @@
<script setup lang="ts">
import type { CraftParam, Task } from '@/api/task'
import { useDateFormat, useVModel } from '@vueuse/core'
-import { computed, ref, toRefs, watch } from 'vue'
+import { ref, toRefs, watch } from 'vue'
import BigButton from '@/views/dashboard/components/BigButton.vue'
import { CHANNEL_NAME_MAP } from '@/common/constants'
-import { getCraftParams, sendProcessParams } from '@/api'
+import { procedureUpdate, sendProcessParams } from '@/api'
import { useCountDown } from '@/common/composable'
import { storeToRefs } from 'pinia'
import { useTasksStore } from '@/stores/tasks'
+import { createMachine } from 'xstate'
+import { useMachine } from '@xstate/vue'
+import { CircleCloseFilled, Loading, SuccessFilled } from '@element-plus/icons-vue'
+import { useDevicesStore } from '@/stores/devices'
export interface TaskControlModalProps {
task?: Task
@@ -162,15 +177,13 @@
})
const emit = defineEmits<{
'update:modelValue': [show: boolean]
+ /** 涓嬪彂鎴愬姛鍚庤Е鍙�, 鐢ㄤ簬澶栭儴鑾峰緱鍒锋柊鏁版嵁鐨勬椂鏈� */
+ produceStart: []
}>()
const modelData = useVModel(props, 'modelValue', emit)
-function closeModal() {
- modelData.value = false
-}
-const { task } = toRefs(props)
-const messageError = ref('')
+const { task } = toRefs(props)
/**
* 鏍煎紡鍖栨椂闂存埑
@@ -186,30 +199,17 @@
// 宸ヨ壓鍙傛暟
const craftParams = ref<CraftParam[]>()
-// 鑾峰彇宸ヨ壓鍙傛暟澶辫触淇℃伅
-const getCraftParamsErrMsg = ref('')
-
+// 鑾峰彇宸ヨ壓鍙傛暟缁撴灉淇℃伅
+const getCraftParamsTip = ref('')
+// 褰撳墠璁惧鑻ユ病鏈夊伐鑹哄弬鏁版槸鍚﹀厑璁镐笅鍙�
+const { currentDeviceAllowNoParams } = storeToRefs(useDevicesStore())
/**
* 鑾峰彇褰撳墠灞曠ず鐨勪换鍔$殑宸ヨ壓鍙傛暟
*/
function getTaskProduceParams(taskId?: number) {
if (taskId) {
craftParams.value = []
- getCraftParamsErrMsg.value = ''
- getCraftParams({ id: taskId }).then(
- (res) => {
- craftParams.value = res.data.Params ?? []
- getCraftParamsErrMsg.value = ''
- // TODO: 澶勭悊鍚勪釜鎸夐挳鏄鹃殣
- // this.getInfo()
- console.log('processParams', craftParams.value)
- },
- (err) => {
- console.error(err)
- craftParams.value = []
- getCraftParamsErrMsg.value = '鑾峰彇宸ヨ壓鍙傛暟澶辫触锛�'
- }
- )
+ getCraftParamsTip.value = ''
}
}
@@ -217,59 +217,234 @@
// 寮圭獥鏄剧ず鏃惰幏鍙栧伐鑹哄弬鏁�
if (modelData.value) {
getTaskProduceParams(task?.value?.Procedure?.ID)
+ } else {
+ reset()
}
})
-const countdown30s = useCountDown(3)
+const countdown30s = useCountDown(30, {
+ onEnd: () => {
+ send('缁撴潫璁℃椂')
+ }
+})
-function startCountdown30s() {
- countdown30s.startCountdown()
+// 寮圭獥鏃惰幏鍙栧畨鍏ㄧ敓浜ф彁绀烘枃鏈�
+const { channels } = storeToRefs(useTasksStore())
+const safeProduce = ref('')
+watch(modelData, () => {
+ if (modelData.value) {
+ safeProduce.value = channels?.value?.[task?.value?.Channel ?? 0]?.Prompt?.safeProduce ?? ''
+ }
+})
+
+/**
+ * 閲嶇疆寮圭獥缂撳瓨鐘舵��
+ */
+function reset() {
+ countdown30s.reset()
+ countdown3s.reset()
+ getCraftParamsTip.value = ''
+ deliveryTip.value = ''
}
/**
- * 涓嬪彂宸ヨ壓鍙傛暟
+ * 鎸夐挳鐘舵�佹満
+ * 鍙互鍘� https://stately.ai/registry/new?mode=Design 鏌ョ湅鐘舵�佽浆鎹㈠浘
*/
-function startProduce() {
- if (task.value?.Procedure?.ID) {
- message.value = '宸ヨ壓鍙傛暟涓嬪彂涓�...'
-
- isLoading.value = true
- sendProcessParams({
- procedureId: task.value.Procedure.ID
- })
- .then(
- (res) => {
- console.log(res)
- messageError.value = '涓嬪彂鎴愬姛'
- },
- (err) => {
- console.error(err)
- messageError.value = err.msg ? err.msg : '鎶辨瓑锛屽伐搴忎笅鍙戝け璐ワ紒'
+const toggleMachine = createMachine({
+ id: 'produce',
+ initial: '鍒濆鍖�',
+ predictableActionArguments: true,
+ states: {
+ 鍒濆鍖�: {
+ on: {
+ 寮�濮嬭鏃�: { target: '璁℃椂涓�' },
+ 缁撴潫: { target: '鍒濆鍖�' }
+ }
+ },
+ 璁℃椂涓�: {
+ on: {
+ 缁撴潫璁℃椂: { target: '鍑嗗鐢熶骇' },
+ 鏆傜紦鐢熶骇: { target: '鍒濆鍖�' }
+ }
+ },
+ 鍑嗗鐢熶骇: {
+ on: {
+ 寮�濮嬬敓浜�: { target: '涓嬪彂鍙傛暟涓�' },
+ 鏆傜紦鐢熶骇: { target: '鍒濆鍖�' }
+ }
+ },
+ 涓嬪彂鍙傛暟涓�: {
+ on: {
+ 鎴愬姛: { target: '涓嬪彂鍙傛暟鎴愬姛' },
+ 澶辫触: { target: '涓嬪彂鍙傛暟澶辫触' },
+ 鏆傜紦鐢熶骇: { target: '鍒濆鍖�' }
+ }
+ },
+ 涓嬪彂鍙傛暟鎴愬姛: {
+ on: {
+ 缁撴潫: {
+ target: '鍒濆鍖�'
}
- )
- .finally(() => {
- isLoading.value = false
- })
+ }
+ },
+ 涓嬪彂鍙傛暟澶辫触: {
+ on: {
+ 鍐嶆涓嬪彂: { target: '鍑嗗鐢熶骇' }
+ }
+ }
}
+})
+const { state, send } = useMachine(toggleMachine)
+
+/**
+ * 鏆傜紦鐢熶骇, 鐩存帴鍏抽棴寮圭獥
+ */
+function respiteProduce() {
+ modelData.value = false
+ send('鏆傜紦鐢熶骇')
+ reset()
+}
+/**
+ * 鐢熶骇鍑嗗
+ */
+function prepareProduce() {
+ send('寮�濮嬭鏃�')
+ countdown30s.startCountdown()
}
-const { channels } = storeToRefs(useTasksStore())
-const safeProduce = computed(() => {
- if (task?.value?.Channel) {
- return channels?.value?.[task.value.Channel]?.Prompt?.safeProduce
+// 鍙傛暟涓嬪彂鎴愬姛鎴栧け璐ョ粨鏋�
+const deliveryTip = ref('')
+
+// 鍙傛暟涓嬪彂鎴愬姛鍚庡欢鏃�3绉掑悗鍏抽棴寮圭獥
+const countdown3s = useCountDown(3, {
+ onEnd: () => {
+ closeModal()
}
- return ''
})
-const message = ref(safeProduce.value)
-const isLoading = ref(false)
+
+/**
+ * 寮�濮嬬敓浜� , 涓嬪彂宸ヨ壓鍙傛暟
+ */
+function startProduce() {
+ send('寮�濮嬬敓浜�')
+
+ procedureUpdate({
+ isFinish: false,
+ isProcessing: true,
+ workOrderProcedureID: Number(task!.value!.Procedure.ID)
+ }).then(
+ (res) => {
+ deliveryTip.value = '涓嬪彂鎴愬姛'
+ send('鎴愬姛')
+ countdown3s.startCountdown()
+ },
+ (err) => {
+ console.error(err)
+ deliveryTip.value = err.msg ? err.msg : '鎶辨瓑锛屽伐搴忎笅鍙戝け璐ワ紒'
+ send('澶辫触')
+ }
+ )
+ // sendProcessParams({
+ // procedureId: task!.value!.Procedure.ID
+ // })
+ // .then(
+ // (res) => {
+ // deliveryTip.value = '涓嬪彂鎴愬姛'
+ // send('鎴愬姛')
+ // countdown3s.startCountdown()
+ // },
+ // (err) => {
+ // console.error(err)
+ // deliveryTip.value = err.msg ? err.msg : '鎶辨瓑锛屽伐搴忎笅鍙戝け璐ワ紒'
+ // send('澶辫触')
+ // }
+ // )
+ // .finally(() => {})
+}
+
+/**
+ * 鍐嶆涓嬪彂
+ */
+function deliverParams() {
+ send('鍐嶆涓嬪彂')
+}
+
+/**
+ * 鍏抽棴寮圭獥
+ */
+function closeModal() {
+ modelData.value = false
+ send('缁撴潫')
+ reset()
+ emit('produceStart')
+}
</script>
<style scoped lang="scss">
.modal-content {
height: 550px;
}
.content-scroll {
- height: 400px;
+ height: 350px;
overflow: hidden;
+}
+.content-tips {
+ height: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 40px;
+}
+
+@keyframes blink {
+ from {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 1;
+ }
+ 51% {
+ opacity: 0;
+ }
+ to {
+ opacity: 0;
+ }
+}
+.prepare {
+ width: 100%;
+ .safe-tip {
+ width: 100%;
+ text-align: center;
+ color: red;
+ font-size: 30px;
+ margin-top: 10px;
+ background-color: #142974;
+ }
+}
+.countdown {
+ color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ .alert-light {
+ margin-right: 20px;
+ .light {
+ height: 56px;
+ width: 56px;
+ background-color: red;
+ border-radius: 50%;
+ }
+ .light.blink {
+ animation: blink 800ms infinite;
+ }
+ }
+ .time {
+ .time-text {
+ text-align: center;
+ font-size: 20px;
+ font-weight: 600;
+ }
+ }
}
:deep(.el-dialog__body) {
padding: 0 20px;
@@ -277,7 +452,13 @@
.btn {
display: flex;
align-items: center;
- justify-content: space-around;
+ justify-content: center;
+ & > button {
+ margin-right: 20px;
+ &:last-child {
+ margin-right: 0;
+ }
+ }
}
.content-title {
display: flex;
@@ -306,7 +487,7 @@
margin: 0 auto;
padding: 10px 20px;
width: calc(100% - 40px);
- height: 400px;
+ height: 340px;
}
.info {
display: flex;
@@ -325,4 +506,73 @@
.info-item-two {
width: 100%;
}
+
+.delivery-success-tips {
+ padding-top: 140px;
+ color: #fff;
+
+ height: 100%;
+ width: 100%;
+ .success-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .success-tip {
+ margin-top: 50px;
+ text-align: center;
+ font-size: 30px;
+ }
+ .success-sub-tip {
+ margin-top: 10px;
+ font-size: 30px;
+ text-align: center;
+ }
+}
+.delivery-error-tips {
+ padding-top: 140px;
+ color: #fff;
+
+ height: 100%;
+ width: 100%;
+ .error-icon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .error-tip {
+ margin-top: 50px;
+ text-align: center;
+ font-size: 30px;
+ }
+ .error-sub-tip {
+ margin-top: 10px;
+ font-size: 20px;
+ text-align: center;
+ }
+}
+
+.delivery {
+ height: 100%;
+ width: 100%;
+ padding: 0 90px;
+ .delivery-tip {
+ text-align: center;
+ font-size: 30px;
+ color: red;
+ }
+ .delivery-progress {
+ margin-top: 8px;
+ }
+}
+.craft-params-error {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ .error-tip {
+ font-size: 18px;
+ color: #fff;
+ }
+}
</style>
--
Gitblit v1.8.0