|
|
|
@ -1,52 +1,30 @@
|
|
|
|
<template>
|
|
|
|
<template>
|
|
|
|
<el-dialog :model-value="modelValue" width="720px" :close-on-click-modal="true" destroy-on-close
|
|
|
|
<el-dialog :model-value="modelValue" class="hospital-order-form-dialog" :close-on-click-modal="true"
|
|
|
|
class="hospital-order-form-dialog" @update:model-value="onDialogUpdate" @closed="onClosed">
|
|
|
|
@update:model-value="(v) => $emit('update:modelValue', v)" @closed="onClosed">
|
|
|
|
<div class="body-wrap">
|
|
|
|
<div class="body-wrap">
|
|
|
|
<div class="body-header">
|
|
|
|
<div class="body-header">
|
|
|
|
<div class="body-title">
|
|
|
|
<div class="body-title">{{ isEdit() ? '编辑工单' : '新建工单' }}</div>
|
|
|
|
{{ isEdit() ? '编辑工单' : $t('modal.submit') }}
|
|
|
|
<img src="@/assets/image/close-btn.svg" alt="" class="close-btn" @click="onCancel" />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<img src="@/assets/image/close-btn.svg" alt="" class="close-btn" @click="onCancel">
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
|
|
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
|
|
|
<el-form-item :label="$t('label.title')" prop="title">
|
|
|
|
<!-- 第一行 2 列:服务类型 + 反馈渠道(医院端没有"所属医院") -->
|
|
|
|
<div class="title-row">
|
|
|
|
<el-row :gutter="20">
|
|
|
|
<el-input v-model="form.title" :placeholder="$t('placeholder.title')" maxlength="100" show-word-limit />
|
|
|
|
<el-col :span="12">
|
|
|
|
<div class="color-tag-picker" ref="colorPickerRef">
|
|
|
|
|
|
|
|
<div class="color-tag-preview" :style="{ background: form.colorTag || '#dcdfe6' }"
|
|
|
|
|
|
|
|
:class="{ 'is-empty': !form.colorTag }" @click.stop="toggleColorPicker"></div>
|
|
|
|
|
|
|
|
<div v-show="colorPickerVisible" class="color-tag-dropdown" @click.stop>
|
|
|
|
|
|
|
|
<div class="color-tag-title">{{ $t('label.colorTag') }}</div>
|
|
|
|
|
|
|
|
<div class="color-tag-options">
|
|
|
|
|
|
|
|
<div v-for="c in colorOptions" :key="c.value" class="color-tag-option"
|
|
|
|
|
|
|
|
:class="{ active: form.colorTag === c.value }" :style="{ background: c.value }" :title="c.label"
|
|
|
|
|
|
|
|
@click="selectColor(c.value)"></div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
<el-form-item :label="$t('label.type')" prop="serviceType">
|
|
|
|
<el-form-item :label="$t('label.type')" prop="serviceType">
|
|
|
|
<el-select v-model="form.serviceType" :placeholder="$t('placeholder.type')" clearable style="width: 240px">
|
|
|
|
<el-select v-model="form.serviceType" :placeholder="$t('placeholder.type')" clearable
|
|
|
|
|
|
|
|
style="width: 100%">
|
|
|
|
<el-option label="故障报修" value="故障报修" />
|
|
|
|
<el-option label="故障报修" value="故障报修" />
|
|
|
|
<el-option label="业务咨询" value="业务咨询" />
|
|
|
|
<el-option label="业务咨询" value="业务咨询" />
|
|
|
|
<el-option label="需求变更" value="需求变更" />
|
|
|
|
<el-option label="需求变更" value="需求变更" />
|
|
|
|
<el-option label="其他" value="其他" />
|
|
|
|
<el-option label="其他" value="其他" />
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item label-width="0">
|
|
|
|
</el-col>
|
|
|
|
<div class="inline-row">
|
|
|
|
<el-col :span="12">
|
|
|
|
<el-form-item :label="$t('label.priority')" prop="priority" class="inline-item">
|
|
|
|
<el-form-item :label="$t('label.feedbackchannel')" prop="feedbackchannel">
|
|
|
|
<el-radio-group v-model="form.priority">
|
|
|
|
|
|
|
|
<el-radio-button label="高">高</el-radio-button>
|
|
|
|
|
|
|
|
<el-radio-button label="中">中</el-radio-button>
|
|
|
|
|
|
|
|
<el-radio-button label="低">低</el-radio-button>
|
|
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
<el-form-item :label="$t('label.feedbackchannel')" prop="feedbackchannel" class="inline-item">
|
|
|
|
|
|
|
|
<el-select v-model="form.feedbackchannel" :placeholder="$t('placeholder.feedbackchannel')" clearable
|
|
|
|
<el-select v-model="form.feedbackchannel" :placeholder="$t('placeholder.feedbackchannel')" clearable
|
|
|
|
style="width: 200px">
|
|
|
|
style="width: 100%">
|
|
|
|
<el-option label="微信群" value="微信群" />
|
|
|
|
<el-option label="微信群" value="微信群" />
|
|
|
|
<el-option label="微信" value="微信" />
|
|
|
|
<el-option label="微信" value="微信" />
|
|
|
|
<el-option label="电话" value="电话" />
|
|
|
|
<el-option label="电话" value="电话" />
|
|
|
|
@ -56,18 +34,69 @@
|
|
|
|
<el-option label="其他" value="其他" />
|
|
|
|
<el-option label="其他" value="其他" />
|
|
|
|
</el-select>
|
|
|
|
</el-select>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</div>
|
|
|
|
</el-col>
|
|
|
|
</el-form-item>
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
<!-- 第二行 3 列:科室 + 提单人 + 提交时间 -->
|
|
|
|
|
|
|
|
<el-row :gutter="20">
|
|
|
|
|
|
|
|
<el-col :span="8">
|
|
|
|
<el-form-item :label="$t('label.dept')" prop="department">
|
|
|
|
<el-form-item :label="$t('label.dept')" prop="department">
|
|
|
|
<el-input v-model="form.department" :placeholder="$t('placeholder.dept')" />
|
|
|
|
<el-input v-model="form.department" :placeholder="$t('placeholder.dept')" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
<el-col :span="8">
|
|
|
|
<el-form-item :label="$t('label.name')" prop="submitter">
|
|
|
|
<el-form-item :label="$t('label.name')" prop="submitter">
|
|
|
|
<el-input v-model="form.submitter" :placeholder="$t('placeholder.name')" />
|
|
|
|
<el-input v-model="form.submitter" :placeholder="$t('placeholder.name')" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
<el-col :span="8">
|
|
|
|
<el-form-item :label="$t('label.createat')" prop="createdat">
|
|
|
|
<el-form-item :label="$t('label.createat')" prop="createdat">
|
|
|
|
<el-date-picker v-model="form.createdat" type="datetime" :placeholder="$t('placeholder.createat')"
|
|
|
|
<el-date-picker v-model="form.createdat" type="datetime" :placeholder="$t('placeholder.createat')"
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
|
|
|
|
value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
</el-row>
|
|
|
|
|
|
|
|
<!-- 标题 + 颜色标签 + 优先级 同一行 -->
|
|
|
|
|
|
|
|
<el-form-item :label="$t('label.title')" prop="title">
|
|
|
|
|
|
|
|
<div class="title-row">
|
|
|
|
|
|
|
|
<el-input v-model="form.title" :placeholder="$t('placeholder.title')" maxlength="300"
|
|
|
|
|
|
|
|
class="title-input">
|
|
|
|
|
|
|
|
<template #suffix>
|
|
|
|
|
|
|
|
<span class="title-counter"><span :style="{ color: form.colorTag || '#dcdfe6' }">{{ form.title.length
|
|
|
|
|
|
|
|
}}</span>/300</span>
|
|
|
|
|
|
|
|
<el-popover v-model:visible="colorPickerVisible" :width="180" placement="bottom-end" trigger="click"
|
|
|
|
|
|
|
|
:show-arrow="false" popper-class="color-tag-popper">
|
|
|
|
|
|
|
|
<template #reference>
|
|
|
|
|
|
|
|
<el-badge :color="form.colorTag || '#dcdfe6'" is-dot class="item">
|
|
|
|
|
|
|
|
<img src="@/assets/image/admin/orders/sepan.svg" alt="" class="title-sepan" />
|
|
|
|
|
|
|
|
</el-badge>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<div class="color-tag-title">{{ $t('label.colorTag') }}</div>
|
|
|
|
|
|
|
|
<div class="color-tag-options">
|
|
|
|
|
|
|
|
<div v-for="c in colorOptions" :key="c.value" class="color-tag-option"
|
|
|
|
|
|
|
|
:class="{ active: form.colorTag === c.value }" :style="{ background: c.value }" :title="c.label"
|
|
|
|
|
|
|
|
@click="selectColor(c.value)"></div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-popover>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-input>
|
|
|
|
|
|
|
|
<div class="priority-wrap">
|
|
|
|
|
|
|
|
<div class="priority-label">{{ $t('label.priority') }}</div>
|
|
|
|
|
|
|
|
<el-select v-model="form.priority" class="priority-select" :teleported="false">
|
|
|
|
|
|
|
|
<template #label="{ label, value }">
|
|
|
|
|
|
|
|
<div class="priority-row high" v-if="value === '高'">{{ value }}</div>
|
|
|
|
|
|
|
|
<div class="priority-row medium" v-if="value === '中'">{{ value }}</div>
|
|
|
|
|
|
|
|
<div class="priority-row low" v-if="value === '低'">{{ value }}</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<el-option v-for="opt in priorityOptions" :key="opt.value" :value="opt.value">
|
|
|
|
|
|
|
|
<span class="priority-option">
|
|
|
|
|
|
|
|
<span class="priority-dot" :class="opt.cls"></span>
|
|
|
|
|
|
|
|
<span class="priority-option-label">{{ opt.label }}</span>
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</el-option>
|
|
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item :label="$t('label.description')" prop="description">
|
|
|
|
<el-form-item :label="$t('label.description')" prop="description">
|
|
|
|
<div class="rich-editor">
|
|
|
|
<div class="rich-editor">
|
|
|
|
<Toolbar :editor="editorRef" :default-config="toolbarConfig" mode="default"
|
|
|
|
<Toolbar :editor="editorRef" :default-config="toolbarConfig" mode="default"
|
|
|
|
@ -79,12 +108,12 @@
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item class="fujian" :label="$t('label.attachment')">
|
|
|
|
<el-form-item class="fujian" :label="$t('label.attachment')">
|
|
|
|
<el-upload class="upload-wrap" v-model:file-list="form.files" :auto-upload="false" :limit="1"
|
|
|
|
<el-upload class="upload-wrap" v-model:file-list="form.files" :auto-upload="false" :limit="1"
|
|
|
|
:on-exceed="handleAttachmentExceed" :on-remove="handleAttachmentRemove" :on-change="handleAttachmentChange">
|
|
|
|
:on-exceed="handleAttachmentExceed" :on-remove="handleAttachmentRemove"
|
|
|
|
|
|
|
|
:on-change="handleAttachmentChange">
|
|
|
|
<div class="upload-btn">
|
|
|
|
<div class="upload-btn">
|
|
|
|
<div class="left">+ 添加文件</div>
|
|
|
|
<div class="left">+ 添加文件</div>
|
|
|
|
<div class="right">{{ $t('label.attachmentTip') }}</div>
|
|
|
|
<div class="right">{{ $t('label.attachmentTip') }}</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<template #file="{ file }">
|
|
|
|
<template #file="{ file }">
|
|
|
|
<div class="file-item">
|
|
|
|
<div class="file-item">
|
|
|
|
<img class="file-icon" src="@/assets/image/admin/orders/file.svg" alt="">
|
|
|
|
<img class="file-icon" src="@/assets/image/admin/orders/file.svg" alt="">
|
|
|
|
@ -97,57 +126,12 @@
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
</el-form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="body-footer">
|
|
|
|
<div class="body-footer">
|
|
|
|
<el-button @click="onCancel">{{ $t('common.cancel') }}</el-button>
|
|
|
|
<el-button @click="onCancel">{{ $t('common.cancel') }}</el-button>
|
|
|
|
<el-button type="primary" :loading="submitting" @click="submit">
|
|
|
|
<el-button type="primary" :loading="submitting" @click="submit">
|
|
|
|
{{ $t('common.submit') }}
|
|
|
|
{{ $t('common.submit') }}
|
|
|
|
</el-button>
|
|
|
|
</el-button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 提交工单后 +1 积分奖励弹窗 -->
|
|
|
|
|
|
|
|
<el-dialog v-model="rewardVisible" width="360px" :show-close="false" :close-on-click-modal="false"
|
|
|
|
|
|
|
|
:close-on-press-escape="false" append-to-body class="reward-dialog">
|
|
|
|
|
|
|
|
<div class="reward-content">
|
|
|
|
|
|
|
|
<div class="reward-badge">✦ 奖励已发放</div>
|
|
|
|
|
|
|
|
<div class="coin-wrapper">
|
|
|
|
|
|
|
|
<span class="reward-coin">🪙</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="points-number">
|
|
|
|
|
|
|
|
+1 <small>积分</small>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="reward-title">🎉 到账通知</div>
|
|
|
|
|
|
|
|
<div class="reward-sub">1 积分已放入您的钱包</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="reward-progress">
|
|
|
|
|
|
|
|
<div class="reward-progress-label">
|
|
|
|
|
|
|
|
<span>🏆 距兑换「康小虎 AI 吉祥物」</span>
|
|
|
|
|
|
|
|
<span class="reward-distance">
|
|
|
|
|
|
|
|
<template v-if="rewardDistance > 0">
|
|
|
|
|
|
|
|
还差 {{ rewardDistance }} 分
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<template v-else>已达标 🎉</template>
|
|
|
|
|
|
|
|
</span>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="reward-bar-bg">
|
|
|
|
|
|
|
|
<div class="reward-bar-fill" :style="{ width: rewardProgress + '%' }"></div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="reward-current">
|
|
|
|
|
|
|
|
当前 {{ rewardTotalPoints }} 分
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="reward-actions">
|
|
|
|
|
|
|
|
<el-button class="reward-btn reward-btn-received" @click="onRewardClose">
|
|
|
|
|
|
|
|
开心收下
|
|
|
|
|
|
|
|
</el-button>
|
|
|
|
|
|
|
|
<el-button class="reward-btn reward-btn-assets" type="warning" @click="goMyAssets">
|
|
|
|
|
|
|
|
查看我的资产 →
|
|
|
|
|
|
|
|
</el-button>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
</el-dialog>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
@ -171,8 +155,8 @@ import {
|
|
|
|
updateHospitalOrder,
|
|
|
|
updateHospitalOrder,
|
|
|
|
getPoints,
|
|
|
|
getPoints,
|
|
|
|
} from "@/service/modular/hospital";
|
|
|
|
} from "@/service/modular/hospital";
|
|
|
|
|
|
|
|
import { useRewardResultStore } from "@/stores/rewardResult";
|
|
|
|
const EXCHANGE_GOAL = 500;
|
|
|
|
import iconSubmit from "@/assets/image/hospital/ponits/icon-submit-large.svg";
|
|
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
const props = defineProps({
|
|
|
|
modelValue: { type: Boolean, default: false },
|
|
|
|
modelValue: { type: Boolean, default: false },
|
|
|
|
@ -189,6 +173,8 @@ const submitting = ref(false);
|
|
|
|
// 已加载的原始附件 filePath 集合(用于判断用户是否需要保留原附件)
|
|
|
|
// 已加载的原始附件 filePath 集合(用于判断用户是否需要保留原附件)
|
|
|
|
const originalAttachments = ref([]);
|
|
|
|
const originalAttachments = ref([]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const rewardResultStore = useRewardResultStore();
|
|
|
|
|
|
|
|
|
|
|
|
const getAttachmentFileName = (path) => {
|
|
|
|
const getAttachmentFileName = (path) => {
|
|
|
|
if (!path) return "";
|
|
|
|
if (!path) return "";
|
|
|
|
return String(path).replace(/\\/g, "/").split("/").pop() || "";
|
|
|
|
return String(path).replace(/\\/g, "/").split("/").pop() || "";
|
|
|
|
@ -200,7 +186,7 @@ const fillFormFromDetail = (detail) => {
|
|
|
|
form.title = detail.title || "";
|
|
|
|
form.title = detail.title || "";
|
|
|
|
form.serviceType = detail.serviceType || "";
|
|
|
|
form.serviceType = detail.serviceType || "";
|
|
|
|
form.priority = detail.priority || "中";
|
|
|
|
form.priority = detail.priority || "中";
|
|
|
|
form.feedbackchannel = detail.feedbackChannel || "";
|
|
|
|
form.feedbackchannel = detail.feedbackChannel || detail.feedbackchannel || "";
|
|
|
|
form.department = detail.department || "";
|
|
|
|
form.department = detail.department || "";
|
|
|
|
form.colorTag = detail.colorTag || "#667eea";
|
|
|
|
form.colorTag = detail.colorTag || "#667eea";
|
|
|
|
form.description = detail.description || "";
|
|
|
|
form.description = detail.description || "";
|
|
|
|
@ -220,6 +206,7 @@ const fillFormFromDetail = (detail) => {
|
|
|
|
uid: `attachment-${props.orderId}-0`,
|
|
|
|
uid: `attachment-${props.orderId}-0`,
|
|
|
|
name: fileName,
|
|
|
|
name: fileName,
|
|
|
|
status: "success",
|
|
|
|
status: "success",
|
|
|
|
|
|
|
|
size: first.fileSize || 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
];
|
|
|
|
];
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
@ -290,21 +277,17 @@ const colorOptions = [
|
|
|
|
{ label: "红", value: "#ff4d4f" },
|
|
|
|
{ label: "红", value: "#ff4d4f" },
|
|
|
|
];
|
|
|
|
];
|
|
|
|
const colorPickerVisible = ref(false);
|
|
|
|
const colorPickerVisible = ref(false);
|
|
|
|
const colorPickerRef = ref();
|
|
|
|
|
|
|
|
const toggleColorPicker = () => {
|
|
|
|
|
|
|
|
colorPickerVisible.value = !colorPickerVisible.value;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
const selectColor = (val) => {
|
|
|
|
const selectColor = (val) => {
|
|
|
|
form.colorTag = val;
|
|
|
|
form.colorTag = val;
|
|
|
|
colorPickerVisible.value = false;
|
|
|
|
colorPickerVisible.value = false;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
const onDocClick = (e) => {
|
|
|
|
|
|
|
|
if (!colorPickerVisible.value) return;
|
|
|
|
// 优先级可选值(带高/中/低配色 cls)
|
|
|
|
const el = colorPickerRef.value;
|
|
|
|
const priorityOptions = [
|
|
|
|
if (el && !el.contains(e.target)) {
|
|
|
|
{ label: "高", value: "高", cls: "high" },
|
|
|
|
colorPickerVisible.value = false;
|
|
|
|
{ label: "中", value: "中", cls: "medium" },
|
|
|
|
}
|
|
|
|
{ label: "低", value: "低", cls: "low" },
|
|
|
|
};
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
const MAX_FILE_SIZE = 50 * 1024 * 1024;
|
|
|
|
const MAX_FILE_SIZE = 50 * 1024 * 1024;
|
|
|
|
const MAX_PASTE_IMAGE_SIZE = 5 * 1024 * 1024;
|
|
|
|
const MAX_PASTE_IMAGE_SIZE = 5 * 1024 * 1024;
|
|
|
|
@ -426,46 +409,15 @@ const handleEditorCreated = (editor) => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// ============== 提交后奖励弹窗 ==============
|
|
|
|
// ============== 取最新积分 ==============
|
|
|
|
const rewardVisible = ref(false);
|
|
|
|
const fetchLatestPoints = async () => {
|
|
|
|
const rewardTotalPoints = ref(0);
|
|
|
|
|
|
|
|
const rewardProgress = ref(0);
|
|
|
|
|
|
|
|
const rewardDistance = ref(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const playCoinAnimation = () => {
|
|
|
|
|
|
|
|
nextTick(() => {
|
|
|
|
|
|
|
|
const coin = document.querySelector(".reward-coin");
|
|
|
|
|
|
|
|
if (!coin) return;
|
|
|
|
|
|
|
|
coin.classList.remove("spin");
|
|
|
|
|
|
|
|
void coin.offsetWidth;
|
|
|
|
|
|
|
|
coin.classList.add("spin");
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const showRewardDialog = async () => {
|
|
|
|
|
|
|
|
let total = 0;
|
|
|
|
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const res = await getPoints();
|
|
|
|
const res = await getPoints();
|
|
|
|
const data = res?.data ?? res ?? {};
|
|
|
|
const data = res?.data ?? res ?? {};
|
|
|
|
total = Number(data.totalPoints) || 0;
|
|
|
|
return Number(data.totalPoints) || 0;
|
|
|
|
} catch (_) {
|
|
|
|
} catch (_) {
|
|
|
|
// 刷新失败不阻塞
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rewardTotalPoints.value = total;
|
|
|
|
|
|
|
|
rewardProgress.value = Math.min(100, Math.round((total / EXCHANGE_GOAL) * 100));
|
|
|
|
|
|
|
|
rewardDistance.value = Math.max(0, EXCHANGE_GOAL - total);
|
|
|
|
|
|
|
|
rewardVisible.value = true;
|
|
|
|
|
|
|
|
playCoinAnimation();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const onRewardClose = () => {
|
|
|
|
|
|
|
|
rewardVisible.value = false;
|
|
|
|
|
|
|
|
emit("success");
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const goMyAssets = () => {
|
|
|
|
|
|
|
|
rewardVisible.value = false;
|
|
|
|
|
|
|
|
emit("success", { gotoAssets: true });
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const submit = async () => {
|
|
|
|
const submit = async () => {
|
|
|
|
@ -493,7 +445,20 @@ const submit = async () => {
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
await createHospitalOrder(formData);
|
|
|
|
await createHospitalOrder(formData);
|
|
|
|
ElMessage.success($t('msg.submitSuccess'));
|
|
|
|
ElMessage.success($t('msg.submitSuccess'));
|
|
|
|
showRewardDialog();
|
|
|
|
// 取最新积分,关闭自己,打开全局奖励结果弹窗
|
|
|
|
|
|
|
|
const totalPoints = await fetchLatestPoints();
|
|
|
|
|
|
|
|
emit("update:modelValue", false);
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
|
|
rewardResultStore.open({
|
|
|
|
|
|
|
|
title: "提交工单",
|
|
|
|
|
|
|
|
icon: iconSubmit,
|
|
|
|
|
|
|
|
points: 1,
|
|
|
|
|
|
|
|
batchGoal: 500,
|
|
|
|
|
|
|
|
batchCurrent: totalPoints,
|
|
|
|
|
|
|
|
rewardName: "康小虎 AI 吉祥物",
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}, 100);
|
|
|
|
|
|
|
|
emit("success", { isCreate: true });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
submitting.value = false;
|
|
|
|
submitting.value = false;
|
|
|
|
@ -505,10 +470,6 @@ const onCancel = () => {
|
|
|
|
emit("update:modelValue", false);
|
|
|
|
emit("update:modelValue", false);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onDialogUpdate = (val) => {
|
|
|
|
|
|
|
|
emit("update:modelValue", val);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const onClosed = () => {
|
|
|
|
const onClosed = () => {
|
|
|
|
// 关闭时重置表单(编辑模式下重新打开会重新加载详情)
|
|
|
|
// 关闭时重置表单(编辑模式下重新打开会重新加载详情)
|
|
|
|
form.title = "";
|
|
|
|
form.title = "";
|
|
|
|
@ -535,8 +496,6 @@ watch(
|
|
|
|
// 新增模式:默认提交时间为当前时间
|
|
|
|
// 新增模式:默认提交时间为当前时间
|
|
|
|
form.createdat = nowDatetime();
|
|
|
|
form.createdat = nowDatetime();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 绑定全局点击关闭颜色面板
|
|
|
|
|
|
|
|
document.addEventListener("click", onDocClick);
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
@ -550,7 +509,6 @@ const removePasteListener = () => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
document.removeEventListener("click", onDocClick);
|
|
|
|
|
|
|
|
removePasteListener();
|
|
|
|
removePasteListener();
|
|
|
|
pasteHandlerRef = null;
|
|
|
|
pasteHandlerRef = null;
|
|
|
|
const editor = editorRef.value;
|
|
|
|
const editor = editorRef.value;
|
|
|
|
@ -561,54 +519,92 @@ onBeforeUnmount(() => {
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
<style lang="scss">
|
|
|
|
.hospital-order-form-dialog {
|
|
|
|
.hospital-order-form-dialog {
|
|
|
|
.body-wrap {
|
|
|
|
|
|
|
|
padding: 24px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.body-header {
|
|
|
|
|
|
|
|
margin-bottom: 18px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.rich-editor {
|
|
|
|
.rich-editor {
|
|
|
|
border: 1px solid #dcdfe6;
|
|
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
width: 100%;
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
background: #fff;
|
|
|
|
background: #fff;
|
|
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
|
|
border: 1px solid #dcdfe6;
|
|
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.rich-editor :deep(.w-e-toolbar) {
|
|
|
|
.rich-editor :deep(.w-e-toolbar) {
|
|
|
|
background: #fafafa;
|
|
|
|
background: #fafafa;
|
|
|
|
|
|
|
|
border-bottom: 1px solid #dcdfe6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 标题 + 颜色标签
|
|
|
|
.rich-editor :deep(.w-e-text-container) {
|
|
|
|
.title-row {
|
|
|
|
background: #fff;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.priority-row {
|
|
|
|
|
|
|
|
&.high {
|
|
|
|
|
|
|
|
--current-color: #ff383c;
|
|
|
|
|
|
|
|
background: #ffebec;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.medium {
|
|
|
|
|
|
|
|
--current-color: #ff8d28;
|
|
|
|
|
|
|
|
background: #ffefe2;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&.low {
|
|
|
|
|
|
|
|
--current-color: #3289fb;
|
|
|
|
|
|
|
|
background: #eaf3ff;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
width: 50px;
|
|
|
|
|
|
|
|
height: 30px;
|
|
|
|
|
|
|
|
border-radius: 8px 8px 8px 8px;
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
align-items: center;
|
|
|
|
gap: 12px;
|
|
|
|
justify-content: center;
|
|
|
|
width: 100%;
|
|
|
|
gap: 4px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
&::before {
|
|
|
|
|
|
|
|
content: "";
|
|
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
|
|
width: 8px;
|
|
|
|
|
|
|
|
height: 8px;
|
|
|
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
|
|
|
background: var(--current-color);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.title-row .el-input {
|
|
|
|
color: var(--current-color);
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 优先级 + 反馈渠道同一行展示
|
|
|
|
// 标题 + 颜色标签 + 优先级 同一行(与 admin 端一致)
|
|
|
|
.inline-row {
|
|
|
|
.title-row {
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
align-items: center;
|
|
|
|
gap: 0 24px;
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.inline-row .inline-item {
|
|
|
|
.title-row .title-input {
|
|
|
|
margin-bottom: 0 !important;
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.el-input__wrapper {
|
|
|
|
|
|
|
|
border-top-right-radius: 0px;
|
|
|
|
|
|
|
|
border-bottom-right-radius: 0px;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.inline-row .inline-item :deep(.el-form-item__content) {
|
|
|
|
.title-row :deep(.el-input__suffix) {
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.title-counter {
|
|
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
|
|
color: #909399;
|
|
|
|
|
|
|
|
margin-right: 10px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.title-sepan {
|
|
|
|
|
|
|
|
width: 16px;
|
|
|
|
|
|
|
|
height: 16px;
|
|
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-picker {
|
|
|
|
.color-tag-picker {
|
|
|
|
@ -616,85 +612,96 @@ onBeforeUnmount(() => {
|
|
|
|
flex-shrink: 0;
|
|
|
|
flex-shrink: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-preview {
|
|
|
|
// 优先级(与 admin 端一致:左 label + 右 select 拼接)
|
|
|
|
width: 28px;
|
|
|
|
.priority-wrap {
|
|
|
|
height: 28px;
|
|
|
|
display: flex;
|
|
|
|
border-radius: 6px;
|
|
|
|
align-items: center;
|
|
|
|
cursor: pointer;
|
|
|
|
flex-shrink: 0;
|
|
|
|
border: 2px solid #fff;
|
|
|
|
border-radius: 8px;
|
|
|
|
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
|
|
|
|
height: 40px;
|
|
|
|
transition:
|
|
|
|
|
|
|
|
transform 0.2s ease,
|
|
|
|
|
|
|
|
box-shadow 0.2s ease;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-preview:hover {
|
|
|
|
|
|
|
|
transform: scale(1.08);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-preview.is-empty {
|
|
|
|
|
|
|
|
background-image: linear-gradient(135deg,
|
|
|
|
|
|
|
|
#f5f5f5 25%,
|
|
|
|
|
|
|
|
transparent 25%,
|
|
|
|
|
|
|
|
transparent 50%,
|
|
|
|
|
|
|
|
#f5f5f5 50%,
|
|
|
|
|
|
|
|
#f5f5f5 75%,
|
|
|
|
|
|
|
|
transparent 75%);
|
|
|
|
|
|
|
|
background-size: 8px 8px;
|
|
|
|
|
|
|
|
box-shadow: 0 0 0 1px #dcdfe6;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-dropdown {
|
|
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
|
|
top: calc(100% + 8px);
|
|
|
|
|
|
|
|
left: 0;
|
|
|
|
|
|
|
|
z-index: 10;
|
|
|
|
|
|
|
|
background: #fff;
|
|
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
|
|
padding: 12px 14px;
|
|
|
|
|
|
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
|
|
|
|
|
|
|
|
min-width: 180px;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-title {
|
|
|
|
.priority-label {
|
|
|
|
font-size: 13px;
|
|
|
|
height: 40px;
|
|
|
|
font-weight: 600;
|
|
|
|
border-top: 1px solid #ebeef5;
|
|
|
|
color: #333;
|
|
|
|
border-bottom: 1px solid #ebeef5;
|
|
|
|
margin-bottom: 10px;
|
|
|
|
background: #F9FAFF;
|
|
|
|
|
|
|
|
color: #BCBCBC;
|
|
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
|
|
padding: 0 14px;
|
|
|
|
|
|
|
|
line-height: 40px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-options {
|
|
|
|
.priority-select {
|
|
|
|
|
|
|
|
width: 110px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.priority-select .el-select__wrapper {
|
|
|
|
|
|
|
|
background: transparent;
|
|
|
|
|
|
|
|
padding: 5px 13px;
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
|
|
border-top-left-radius: 0px;
|
|
|
|
|
|
|
|
border-bottom-left-radius: 0px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.priority-select :deep(.el-select__placeholder) {
|
|
|
|
|
|
|
|
color: #303133;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.priority-option {
|
|
|
|
|
|
|
|
display: inline-flex;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
gap: 8px;
|
|
|
|
gap: 8px;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-option {
|
|
|
|
.priority-dot {
|
|
|
|
width: 24px;
|
|
|
|
display: inline-block;
|
|
|
|
height: 24px;
|
|
|
|
width: 8px;
|
|
|
|
border-radius: 6px;
|
|
|
|
height: 8px;
|
|
|
|
cursor: pointer;
|
|
|
|
border-radius: 50%;
|
|
|
|
border: 2px solid transparent;
|
|
|
|
}
|
|
|
|
transition:
|
|
|
|
|
|
|
|
transform 0.2s ease,
|
|
|
|
.priority-dot.high {
|
|
|
|
border-color 0.2s ease;
|
|
|
|
background: #ff383c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-option:hover {
|
|
|
|
.priority-dot.medium {
|
|
|
|
transform: scale(1.12);
|
|
|
|
background: #ff8d28;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.color-tag-option.active {
|
|
|
|
.priority-dot.low {
|
|
|
|
border-color: #1890ff;
|
|
|
|
background: #3289fb;
|
|
|
|
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.priority-option-label {
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
color: #303133;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 限制上传文件预览盒子宽度溢出
|
|
|
|
|
|
|
|
:deep(.fujian .el-form-item__content > div) {
|
|
|
|
:deep(.fujian .el-form-item__content > div) {
|
|
|
|
width: 100% !important;
|
|
|
|
width: 100% !important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
|
|
|
|
.hospital-order-form-dialog {
|
|
|
|
|
|
|
|
width: 1168px;
|
|
|
|
|
|
|
|
overflow: visible;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.body-footer {
|
|
|
|
|
|
|
|
border-radius: 0 0 24px 24px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--el-component-size: 40px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.el-select__wrapper {
|
|
|
|
|
|
|
|
height: 40px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============== 附件上传(与 admin 端统一) ==============
|
|
|
|
|
|
|
|
.fujian {
|
|
|
|
.fujian {
|
|
|
|
.upload-wrap {
|
|
|
|
.upload-wrap {
|
|
|
|
width: 100%;
|
|
|
|
width: 100%;
|
|
|
|
@ -753,177 +760,13 @@ onBeforeUnmount(() => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============== 提交后奖励弹窗 ==============
|
|
|
|
|
|
|
|
:deep(.reward-dialog) {
|
|
|
|
|
|
|
|
.el-dialog__header {
|
|
|
|
|
|
|
|
display: none;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.el-dialog__body {
|
|
|
|
|
|
|
|
padding: 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-content {
|
|
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
padding: 24px 24px 22px;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.reward-badge {
|
|
|
|
// 颜色标签 popover 内容(默认 teleport 到 body,需放非 scoped 样式块)
|
|
|
|
display: inline-block;
|
|
|
|
.color-tag-popper {
|
|
|
|
background: #fef3e6;
|
|
|
|
padding: 12px 14px !important;
|
|
|
|
color: #c47a2e;
|
|
|
|
border-radius: 10px !important;
|
|
|
|
font-size: 12px;
|
|
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12) !important;
|
|
|
|
font-weight: 600;
|
|
|
|
min-width: 180px;
|
|
|
|
padding: 4px 16px;
|
|
|
|
|
|
|
|
border-radius: 40px;
|
|
|
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.coin-wrapper {
|
|
|
|
|
|
|
|
height: 80px;
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
margin-bottom: 4px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-coin {
|
|
|
|
|
|
|
|
font-size: 64px;
|
|
|
|
|
|
|
|
display: inline-block;
|
|
|
|
|
|
|
|
filter: drop-shadow(0 8px 16px rgba(255, 193, 7, 0.3));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-coin.spin {
|
|
|
|
|
|
|
|
animation: rewardCoinSpin 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@keyframes rewardCoinSpin {
|
|
|
|
|
|
|
|
0% {
|
|
|
|
|
|
|
|
transform: rotateY(0deg) scale(0.2);
|
|
|
|
|
|
|
|
opacity: 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60% {
|
|
|
|
|
|
|
|
transform: rotateY(720deg) scale(1.2);
|
|
|
|
|
|
|
|
opacity: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100% {
|
|
|
|
|
|
|
|
transform: rotateY(720deg) scale(1);
|
|
|
|
|
|
|
|
opacity: 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.points-number {
|
|
|
|
|
|
|
|
font-size: 48px;
|
|
|
|
|
|
|
|
font-weight: 800;
|
|
|
|
|
|
|
|
color: #f5a623;
|
|
|
|
|
|
|
|
line-height: 1.1;
|
|
|
|
|
|
|
|
margin-top: -4px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.points-number small {
|
|
|
|
|
|
|
|
font-size: 20px;
|
|
|
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
|
|
|
color: #b8863a;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-title {
|
|
|
|
|
|
|
|
font-size: 22px;
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
color: #1f140e;
|
|
|
|
|
|
|
|
margin: 4px 0 6px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-sub {
|
|
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
|
|
color: #7a6a5c;
|
|
|
|
|
|
|
|
margin-bottom: 16px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-progress {
|
|
|
|
|
|
|
|
background: #f8f4f0;
|
|
|
|
|
|
|
|
border-radius: 16px;
|
|
|
|
|
|
|
|
padding: 14px 16px;
|
|
|
|
|
|
|
|
margin-bottom: 18px;
|
|
|
|
|
|
|
|
text-align: left;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-progress-label {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
|
|
color: #4d3e32;
|
|
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-distance {
|
|
|
|
|
|
|
|
color: #f5a623;
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-bar-bg {
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
height: 6px;
|
|
|
|
|
|
|
|
background: #e6ddd5;
|
|
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
|
|
margin-top: 8px;
|
|
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-bar-fill {
|
|
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
|
|
background: linear-gradient(90deg, #f9b84a, #f5a623);
|
|
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
|
|
transition: width 0.6s ease;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-current {
|
|
|
|
|
|
|
|
margin-top: 8px;
|
|
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
|
|
color: #8a7a6a;
|
|
|
|
|
|
|
|
text-align: right;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-actions {
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
gap: 10px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-btn {
|
|
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
padding: 12px 0 !important;
|
|
|
|
|
|
|
|
font-size: 14px !important;
|
|
|
|
|
|
|
|
font-weight: 600 !important;
|
|
|
|
|
|
|
|
border-radius: 60px !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-btn-received {
|
|
|
|
|
|
|
|
background: #f0ebe6 !important;
|
|
|
|
|
|
|
|
border-color: #f0ebe6 !important;
|
|
|
|
|
|
|
|
color: #4d3e32 !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-btn-received:hover {
|
|
|
|
|
|
|
|
background: #e6ddd5 !important;
|
|
|
|
|
|
|
|
border-color: #e6ddd5 !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-btn-assets {
|
|
|
|
|
|
|
|
background: #f9b84a !important;
|
|
|
|
|
|
|
|
border-color: #f9b84a !important;
|
|
|
|
|
|
|
|
color: #1f140e !important;
|
|
|
|
|
|
|
|
box-shadow: 0 4px 14px rgba(249, 184, 74, 0.25);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.reward-btn-assets:hover {
|
|
|
|
|
|
|
|
background: #f5ac2e !important;
|
|
|
|
|
|
|
|
border-color: #f5ac2e !important;
|
|
|
|
|
|
|
|
transform: translateY(-1px);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
|