<!-- 工单详情 - 包含待审核、待处理、处理中、已完成 -->
|
<template>
|
<div class="workDetailContainer">
|
<div class="detailTop">
|
<div class="image-container">
|
<van-image class="detailImage" :src="currentDetail.photo_url" fit="cover" width="100%" height="200px" />
|
<div class="detailTitle">
|
<div class="titleText">
|
<div class="itemStatus">
|
<span v-if="currentDetail.status === 0" style="background-color: #ff7411"></span>
|
<span v-else-if="currentDetail.status === 2" style="background-color: #ff472f"></span>
|
<span v-else-if="currentDetail.status === 3" style="background-color: #ffc300"></span>
|
<span v-else-if="currentDetail.status === 4" style="background-color: #06d957"></span>
|
<div>{{ currentDetail.event_name }}</div>
|
</div>
|
<div class="timeNavigation">
|
<p>{{ formatDate(currentDetail.create_time) }}</p>
|
<img src="/src/appDataSource/appwork/navigation.svg" alt="" />
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<!-- 步骤条 -->
|
<div class="stepContainer">
|
<van-steps direction="vertical" :active="currentStep">
|
<van-step v-for="(step, index) in displayedSteps" :key="step.status">
|
<div class="horizontal-step">
|
<span class="step-title" :class="getStatusClass(index)">{{ step.title }}</span>
|
|
<div class="step-desc" v-if="stepResponse[index]">
|
<span>{{ stepResponse[index].name || '' }}</span>
|
<span>{{ stepResponse[index].create_time || '' }}</span>
|
</div>
|
</div>
|
</van-step>
|
</van-steps>
|
</div>
|
<!-- 工单内容 -->
|
<div class="workOrderContent">
|
<div class="workOrderTitle">工单内容</div>
|
<div class="workOrderContainer">
|
<div class="orderRow">
|
<span class="required-mark" v-if="isEditable">*</span>
|
<div class="rowTitle">工单名称</div>
|
|
<div v-if="!isEditable">{{ currentDetail.event_name }}</div>
|
|
<van-field
|
v-else
|
v-model="currentDetail.event_name"
|
name="event_name"
|
required
|
placeholder="请输入工单名称"
|
/>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">工单类型</div>
|
<div>{{ workOrderTypeName }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">关联任务</div>
|
<div>{{ currentDetail.job_name }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">工单创建人</div>
|
<div>{{ currentDetail.event_num?.slice(0, 2) === 'AI' ? 'AI 小飞' : currentDetail.create_user }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">事件地址</div>
|
<div class="rowAddress">{{ currentDetail.address }}</div>
|
>
|
</div>
|
|
<div class="orderRow">
|
<div class="guanlian">
|
<span class="required-mark" v-if="isEditable">*</span>
|
<div class="rowTitle">关联算法</div>
|
</div>
|
<div v-if="!isEditable">{{ currentDetail.ai_types }}</div>
|
<div v-else>
|
<span @click="openselect" class="selectTrigger">{{ currentDetail.ai_types }} ></span>
|
|
<van-popup v-model:show="showPicker" destroy-on-close position="bottom" :close-on-click-overlay="true">
|
<van-picker
|
v-model="selectedValues"
|
title="选择关联算法"
|
:columns="columns"
|
@confirm="onConfirm"
|
@cancel="onCancel"
|
/>
|
</van-popup>
|
</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">发起部门</div>
|
<div>{{ currentDetail.dept_name }}</div>
|
</div>
|
<div class="orderRow">
|
<div class="rowTitle">发起任务时间</div>
|
<div>{{ currentDetail.create_time }}</div>
|
</div>
|
<div class="orderRow">
|
<span class="required-mark" v-if="isEditable">*</span>
|
<div class="rowTitle">工单内容</div>
|
<div v-if="!isEditable">{{ currentDetail.content }}</div>
|
<van-field v-else v-model="currentDetail.content" name="remark" required placeholder="请输入工单内容" />
|
</div>
|
<div class="orderRow" v-if="isEditableProcess">
|
<div class="guanlian">
|
<span class="required-mark">*</span>
|
<div class="rowTitle">
|
上传图片
|
<span>(只能上传jpg、jpeg、png照片,且不超过5M)</span>
|
</div>
|
</div>
|
<div>
|
<span class="upload-link" @click="triggerUpload">上传图片</span>
|
|
<!-- 隐藏的文件选择器 -->
|
<input
|
ref="fileInput"
|
type="file"
|
accept="image/png, image/jpeg, image/jpg"
|
@change="handleFileChange"
|
style="display: none"
|
/>
|
</div>
|
</div>
|
<div class="orderRow" v-if="isEditableProcess">
|
<span class="required-mark">*</span>
|
<div class="rowTitle">事件处理详情</div>
|
<van-field v-model="currentDetail.processingDetail" name="event_name" required />
|
</div>
|
</div>
|
</div>
|
<!-- 操作按钮 -->
|
<div class="actionButton">
|
<div class="leftBtn" @click="leftClick"><img src="/src/appDataSource/appwork/leftBtn.svg" alt="" /></div>
|
<div class="btngroups" v-if="currentDetail.status === 2">
|
<van-button type="danger" round text="不通过" @click="rejectTicket"></van-button>
|
<van-button type="primary" round text="通过" @click="approveTicket"></van-button>
|
</div>
|
<div class="btngroups" v-else-if="currentDetail.status === 0">
|
<van-button type="danger" round text="不受理" @click="rejectTicket"></van-button>
|
<van-button type="primary" round text="受理" @click="approveAndDispatch"></van-button>
|
</div>
|
<div class="btngroups" v-else-if="currentDetail.status === 3">
|
<van-button type="danger" round text="取消" @click="cancellation"></van-button>
|
<van-button type="primary" round text="完成工单" @click="completeTicket"></van-button>
|
</div>
|
<div class="btngroups" v-else>
|
<van-button type="danger" round text="取消" @click="cancellation"></van-button>
|
</div>
|
<div class="leftBtn" @click="rightClick"><img src="/src/appDataSource/appwork/rightBtn.svg" alt="" /></div>
|
</div>
|
|
<!--派发工单对话框-->
|
<van-dialog
|
v-model:show="isshowDispatch"
|
title="派发工单"
|
show-cancel-button
|
@confirm="submitDispatch"
|
@cancel="dispatchCancel"
|
>
|
<van-field
|
v-model="dispatchForm.departmentName"
|
is-link
|
readonly
|
label="选择部门"
|
placeholder="请选择部门"
|
@click="openPicker('department')"
|
/>
|
<van-field
|
v-model="dispatchForm.handlerName"
|
is-link
|
readonly
|
label="选择处理人"
|
placeholder="请选择处理人"
|
@click="openPicker('processor')"
|
:disabled="!dispatchForm.department"
|
/>
|
</van-dialog>
|
|
<teleport to="body">
|
<van-popup v-model:show="showGlobalPicker" position="bottom">
|
<!-- 部门选择器 -->
|
<van-picker
|
v-if="currentPickerType === 'department'"
|
v-model="selectedDepartment"
|
title="选择部门"
|
:columns="departments"
|
@confirm="onDepartmentConfirm"
|
@cancel="onPickerCancel"
|
/>
|
|
<!-- 处理人选择器 -->
|
<van-picker
|
v-if="currentPickerType === 'processor'"
|
v-model="selectedProcessor"
|
title="选择处理人"
|
:columns="availableDispatchHandlers"
|
@confirm="onProcessorConfirm"
|
@cancel="onPickerCancel"
|
/>
|
</van-popup>
|
</teleport>
|
</div>
|
</template>
|
|
<script setup>
|
import { useRoute } from 'vue-router'
|
import { getStepInfo, getList, flowEvent, getTicketInfo } from '/src/api/work/index.js'
|
import { showToast, showNotify } from 'vant'
|
import dayjs from 'dayjs'
|
const showPicker = ref(false)
|
const selectedValues = ref([])
|
const columns = ref([])
|
const allAlgorithms = ref([])
|
const algorithms = ref([])
|
const types = ref([]) //工单类型
|
const eventNum = ref('')
|
const currentStatus = ref('')
|
const stepResponse = ref([])
|
const currentStep = ref(0)
|
const route = useRoute()
|
const currentDetail = ref({})
|
const currentIndex = ref(null) //当前显示数据索引
|
const departments = ref([]) //部门
|
const departmentUsers = ref({})
|
// 处理人选择相关
|
const processorColumns = ref([])
|
// 可编辑状态
|
const isEditable = computed(() => currentDetail.value.status === 0)
|
const isEditableProcess = computed(() => currentDetail.value.status === 3)
|
// 工单内容
|
const workDetailData = ref({})
|
const formatDate = dateString => {
|
return dayjs(dateString).format('MM/DD HH:mm')
|
}
|
const allStepConfigs = ref([
|
{ title: '待审核', status: '2' },
|
{ title: '待处理', status: '0' },
|
{ title: '处理中', status: '3' },
|
{ title: '已完成', status: '4' },
|
])
|
|
const getStatusClass = index => {
|
if (index <= currentStep.value) {
|
const status = stepResponse.value[index]?.status
|
const statusClasses = {
|
'2': 'status-pending', // 待审核
|
'0': 'status-waiting', // 待处理
|
'3': 'status-processing', // 处理中
|
'4': 'status-completed', // 已完成
|
}
|
return statusClasses[String(status)] || ''
|
}
|
|
return 'status-default'
|
}
|
// 关联算法
|
const getTicketInfoData = async () => {
|
const response = await getTicketInfo()
|
const { dept_data, event_type, ai_type, info } = response.data.data
|
allAlgorithms.value = info
|
|
types.value = Object.entries(event_type).map(([key, value]) => ({
|
label: value,
|
value: key,
|
}))
|
departments.value = dept_data.map(item => ({
|
text: item.dept_name,
|
value: item.id,
|
}))
|
departmentUsers.value = dept_data.reduce((acc, dept) => {
|
acc[dept.id] = dept.user_data || []
|
return acc
|
}, {})
|
}
|
// 处理人
|
const availableDispatchHandlers = computed(() => {
|
if (!dispatchForm.value.department) return []
|
const users = departmentUsers.value[dispatchForm.value.department]
|
if (!users) return []
|
return users.map(user => ({
|
text: user.name,
|
value: user.id,
|
}))
|
})
|
|
// 关联算法选择
|
const handleTypeChange = typeValue => {
|
const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
|
if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
|
// 无匹配的算法时清空
|
algorithms.value = []
|
return
|
}
|
algorithms.value = matchedCategory.algorithms.map(algo => ({
|
label: algo.dict_value,
|
value: algo.dict_key,
|
dict_key: algo.dict_key,
|
dict_value: algo.dict_value,
|
}))
|
columns.value = algorithms.value.map(item => ({
|
text: item.label,
|
value: item.value,
|
}))
|
}
|
const getDataList = async val => {
|
const params = {
|
current: 1,
|
size: 9999,
|
source: 1,
|
event_name: val,
|
}
|
const res = await getList(params)
|
const response = res.data.data.records
|
currentDetail.value = {
|
...response[0],
|
processingDetail: response[0].content,
|
processing_details: response[0].processing_details,
|
update_photo_url: response[0].update_photo_url,
|
photos: [],
|
aiType: response[0].ai_type_key_list?.join(',') || '',
|
}
|
currentStatus.value = currentDetail.value.status
|
handleTypeChange(currentDetail.value.work_order_type_dict_key)
|
}
|
|
// 计算要显示的步骤
|
const displayedSteps = computed(() => {
|
return allStepConfigs.value.filter(stepConfig => {
|
return stepResponse.value.some(stepData => String(stepData?.status) === stepConfig.status)
|
})
|
})
|
// 计算工单类型显示名称
|
const workOrderTypeName = computed(() => {
|
const type = types.value.find(item => item.value === currentDetail.value.work_order_type_dict_key)
|
return type ? type.label : currentDetail.value.work_order_type_dict_key
|
})
|
// 步骤条
|
const calculateCurrentStep = status => {
|
const stepIndex = displayedSteps.value.findIndex(step => step.status === String(status))
|
return stepIndex !== -1 ? stepIndex : 0
|
}
|
|
const getStepInfoData = async val => {
|
const res = await getStepInfo(val)
|
stepResponse.value = res.data.data
|
|
currentStep.value = calculateCurrentStep(currentStatus.value)
|
}
|
|
// 通过
|
const approveTicket = async () => {
|
const data = {
|
id: currentDetail.value.id,
|
status: currentDetail.value.status,
|
isPass: 0, // 0 表示通过
|
eventNum: currentDetail.value.event_num,
|
}
|
const file = currentDetail.value.file || null
|
const response = await flowEvent(data, file)
|
if (response.data.code === 0) {
|
showNotify({ type: 'primary', message: '工单已通过' })
|
}
|
|
// const transmitData = { data: { type: 'workback', fun: 'add' } }
|
// wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
|
// wx.miniProgram.postMessage(transmitData)
|
// uni.postMessage(transmitData)
|
getDataList()
|
}
|
// 不通过/不受理
|
const rejectTicket = async () => {
|
const data = {
|
id: currentDetail.value.id,
|
status: currentDetail.value.status,
|
isPass: 1,
|
}
|
const response = await flowEvent(data)
|
if (response.data.code === 0) {
|
showNotify({ type: 'danger', message: '工单未通过' })
|
}
|
const transmitData = { data: { type: 'workback', fun: 'add' } }
|
wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
|
wx.miniProgram.postMessage(transmitData)
|
uni.postMessage(transmitData)
|
getDataList()
|
}
|
const isshowDispatch = ref(false)
|
// 受理
|
const approveAndDispatch = () => {
|
// 添加必填项检查
|
if (!currentDetail.value.event_name) {
|
showNotify({ type: 'danger', message: '请填写工单名称' })
|
return
|
}
|
if (!currentDetail.value.ai_types) {
|
showNotify({ type: 'danger', message: '请选择关联算法' })
|
return
|
}
|
if (!currentDetail.value.content) {
|
showNotify({ type: 'danger', message: '请填写工单内容' })
|
return
|
}
|
isshowDispatch.value = true
|
}
|
const dispatchCancel = () => {
|
// 重置表单
|
dispatchForm.value = {
|
department: '',
|
departmentName: '',
|
handler: '',
|
handlerName: '',
|
}
|
isshowDispatch.value = false
|
}
|
const dispatchForm = ref({
|
department: '', // 存储部门ID (value)
|
departmentName: '', // 显示部门名称 (text)
|
handler: '', // 存储处理人ID (value)
|
handlerName: '', // 显示处理人名称 (text)
|
})
|
|
const selectedDepartment = ref([])
|
const selectedProcessor = ref([])
|
const showGlobalPicker = ref(false)
|
const currentPickerType = ref('')
|
|
const openPicker = type => {
|
currentPickerType.value = type
|
showGlobalPicker.value = true
|
}
|
// 部门选择确认
|
const onDepartmentConfirm = value => {
|
dispatchForm.value.department = value.selectedValues[0]
|
dispatchForm.value.departmentName = value.selectedOptions[0].text
|
showGlobalPicker.value = false
|
}
|
// 处理人选择确认
|
const onProcessorConfirm = value => {
|
// 确保已选择部门
|
if (!dispatchForm.value.department) {
|
showNotify({ type: 'warning', message: '请先选择部门' })
|
return
|
}
|
dispatchForm.value.handler = value.selectedValues[0]
|
dispatchForm.value.handlerName = value.selectedOptions[0].text
|
showGlobalPicker.value = false
|
}
|
|
// 取消选择
|
const onPickerCancel = () => {
|
showGlobalPicker.value = false
|
}
|
// 派发工单
|
const submitDispatch = async () => {
|
// 验证必填项
|
if (!dispatchForm.value.department) {
|
showNotify({ type: 'danger', message: '请选择部门' })
|
return
|
}
|
|
if (!dispatchForm.value.handler) {
|
showNotify({ type: 'danger', message: '请选择处理人' })
|
return
|
}
|
|
try {
|
const data = {
|
id: currentDetail.value.id,
|
status: currentDetail.value.status,
|
isPass: 0,
|
eventName: currentDetail.value.event_name,
|
eventNum: currentDetail.value.event_num,
|
workOrderTypeDictKey: currentDetail.value.work_order_type_dict_key,
|
content: currentDetail.value.content,
|
createDept: dispatchForm.value.department,
|
updateUser: dispatchForm.value.handler,
|
aiType: currentDetail.value.aiType,
|
}
|
const file = currentDetail.value.file || null
|
const response = await flowEvent(data, file)
|
if (response.data.code === 0) {
|
showNotify({ type: 'success', message: '工单派发成功' })
|
isshowDispatch.value = false
|
getDataList()
|
}
|
} catch (error) {
|
showNotify({ type: 'danger', message: '工单派发失败' })
|
}
|
}
|
|
// 完成工单
|
const completeTicket = async () => {
|
if (!currentDetail.value.processingDetail) {
|
showNotify({ type: 'danger', message: '请先填写事件处理详情' })
|
return
|
}
|
if (!currentDetail.value.photos || currentDetail.value.photos.length === 0) {
|
showNotify({ type: 'danger', message: '请选择上传图片' })
|
return
|
}
|
const data = {
|
id: currentDetail.value.id,
|
status: currentDetail.value.status,
|
processingDetails: currentDetail.value.processingDetail,
|
eventNum: currentDetail.value.event_num,
|
}
|
const file = currentDetail.value.photos?.[0]?.raw || null
|
const response = await flowEvent(data, file)
|
if (response.data.code === 0) {
|
showNotify({ type: 'primary', message: '工单已完成' })
|
}
|
getDataList()
|
}
|
// 取消
|
const cancellation = () => {
|
const transmitData = { data: { type: 'workback', fun: 'add' } }
|
wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
|
wx.miniProgram.postMessage(transmitData)
|
uni.postMessage(transmitData)
|
}
|
// 上一页
|
const leftClick = () => {}
|
// 下一页
|
const rightClick = () => {}
|
|
// 下拉选择
|
|
const openselect = () => {
|
showPicker.value = true
|
}
|
// 选择器确认方法
|
const onConfirm = val => {
|
currentDetail.value.ai_types = val.selectedOptions.map(option => option.text).join(',')
|
currentDetail.value.aiType = val.selectedValues.join(',')
|
showPicker.value = false
|
}
|
// 选择器取消方法
|
const onCancel = () => {
|
showPicker.value = false
|
}
|
|
// 上传图片
|
const fileInput = ref(null)
|
// 触发文件选择对话框
|
const triggerUpload = () => {
|
fileInput.value?.click() // 调用原生input的click事件
|
}
|
// 处理文件选择后的逻辑
|
const handleFileChange = e => {
|
const file = e.target.files[0]
|
if (!file) return
|
|
// 验证文件格式
|
const allowedTypes = ['image/png', 'image/jpeg', 'image/jpg']
|
if (!allowedTypes.includes(file.type)) {
|
showToast('只能上传png、jpeg、jpg格式的图片')
|
resetFileInput() // 重置input
|
return
|
}
|
|
// 验证文件大小(3MB = 3 * 1024 * 1024 bytes)
|
if (file.size > 3 * 1024 * 1024) {
|
showToast('图片大小不能超过3MB')
|
resetFileInput() // 重置input
|
return
|
}
|
|
// 创建文件预览(可选)
|
const reader = new FileReader()
|
reader.onload = event => {
|
// 将文件对象和预览URL都保存到 currentDetail
|
currentDetail.value.photos = [
|
{
|
raw: file, // 原始文件对象(用于上传)
|
preview: event.target.result, // 预览URL(用于显示)
|
name: file.name, // 文件名
|
},
|
]
|
}
|
reader.readAsDataURL(file) // 读取文件为DataURL
|
}
|
|
// 重置文件输入
|
const resetFileInput = () => {
|
if (fileInput.value) {
|
fileInput.value.value = ''
|
}
|
}
|
|
onMounted(async () => {
|
eventNum.value = route.query.eventNum || ''
|
await getTicketInfoData()
|
await getDataList(eventNum.value)
|
await getStepInfoData(eventNum.value)
|
})
|
</script>
|
|
<style lang="scss" scoped>
|
.workDetailContainer {
|
padding: 0 10px;
|
.required-mark {
|
color: #ff4d4f; // 红色
|
margin-left: 4px;
|
}
|
.detailTop {
|
.image-container {
|
position: relative;
|
width: 100%;
|
height: 205px;
|
|
.detailImage {
|
width: 100%;
|
height: 100%;
|
display: block;
|
object-fit: cover;
|
}
|
|
.detailTitle {
|
position: absolute;
|
left: 0;
|
top: 0;
|
width: 100%;
|
padding: 5px;
|
height: 30px;
|
background: rgba(7, 7, 7, 0.4);
|
}
|
|
.titleText {
|
display: flex;
|
width: 100%;
|
justify-content: space-between;
|
align-items: center;
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 13px;
|
color: #ffffff;
|
.itemStatus {
|
display: flex;
|
align-items: center;
|
|
span {
|
display: inline-block;
|
width: 10px;
|
height: 10px;
|
border-radius: 50%;
|
margin-right: 7px;
|
}
|
}
|
}
|
.timeNavigation {
|
display: flex;
|
align-items: center;
|
img {
|
width: 11px;
|
height: 13px;
|
margin-left: 13px;
|
}
|
}
|
}
|
}
|
|
.stepContainer {
|
margin-top: 10px;
|
display: flex;
|
|
border-radius: 5px;
|
padding: 10px;
|
|
.horizontal-step {
|
display: flex;
|
align-items: center;
|
gap: 12px;
|
|
.step-title {
|
min-width: 60px;
|
background: #e8e8e8;
|
padding: 5px;
|
border-radius: 5px;
|
text-align: center;
|
|
&.status-pending {
|
background-color: #ffebeb; // 待审核
|
color: #ff1414;
|
}
|
|
&.status-waiting {
|
background-color: #fff1e6; // 待处理
|
color: #ff7411;
|
}
|
|
&.status-processing {
|
background-color: #fff6d8; // 处理中
|
color: #ffbb00;
|
}
|
|
&.status-completed {
|
background-color: #e5fcff; // 已完成
|
color: #0291a1;
|
}
|
|
&.status-default {
|
background-color: #e8e8e8; // 默认背景色
|
color: #191919;
|
}
|
}
|
|
.step-desc {
|
display: flex;
|
justify-content: space-between;
|
gap: 28px;
|
color: #222324;
|
font-size: 14px;
|
}
|
.step-desc span:first-child {
|
min-width: 40px;
|
white-space: nowrap;
|
}
|
}
|
}
|
|
:deep(.van-step__circle) {
|
width: 8px;
|
height: 8px;
|
}
|
|
.actionButton {
|
display: flex;
|
justify-content: space-between;
|
margin-bottom: 10px;
|
padding-bottom: 10px;
|
|
.btngroups {
|
display: flex;
|
justify-content: space-between;
|
|
.van-button {
|
padding: 9px 20px;
|
height: 32px;
|
|
&:last-child {
|
margin-left: 12px;
|
margin-right: 12px;
|
}
|
}
|
}
|
|
.leftBtn {
|
width: 27px;
|
height: 27px;
|
cursor: pointer;
|
img {
|
width: 27px;
|
height: 27px;
|
}
|
}
|
|
.disableds {
|
background: #999 !important;
|
cursor: not-allowed !important;
|
pointer-events: none;
|
opacity: 0.3 !important;
|
}
|
}
|
|
.workOrderContent {
|
margin-top: 15px;
|
|
.workOrderTitle {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: bold;
|
font-size: 16px;
|
color: #222324;
|
margin-bottom: 16px;
|
}
|
|
.workOrderContainer {
|
.orderRow {
|
margin-bottom: 10px;
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
height: 48px;
|
border-bottom: 1px solid #f5f5f5;
|
color: #7b7b7b;
|
.guanlian {
|
display: flex;
|
}
|
.rowTitle {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 15px;
|
color: #222324;
|
white-space: nowrap;
|
|
span {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 10px;
|
color: #3a3a3a;
|
}
|
}
|
.rowAddress {
|
font-size: 14px;
|
color: #1d6fe9;
|
white-space: nowrap; /* 禁止换行 */
|
overflow: hidden;
|
text-overflow: ellipsis;
|
max-width: 75%;
|
}
|
.selectTrigger {
|
font-family: Source Han Sans CN, Source Han Sans CN;
|
font-weight: 400;
|
font-size: 14px;
|
color: #222324;
|
}
|
}
|
|
.titketName {
|
display: flex;
|
align-items: center;
|
}
|
}
|
}
|
|
.upload-link {
|
color: #1989fa; /* 右侧链接:Vant主题蓝色(与组件库统一) */
|
cursor: pointer;
|
text-decoration: underline; /* 下划线突出可点击性 */
|
}
|
}
|
</style>
|