| | |
| | | <!-- 传感器清洁 --> |
| | | <div class="manual-item"> |
| | | <div class="check-label"> |
| | | 传感器清洁: |
| | | 外观和轮胎 : |
| | | </div> |
| | | <div class="image-list"> |
| | | <template v-if="detailData.sensorCleanImages && detailData.sensorCleanImages.length"> |
| | |
| | | <!-- 紧急求助按钮/应答机 --> |
| | | <div class="manual-item"> |
| | | <div class="check-label"> |
| | | 紧急求助按钮/应答机: |
| | | 车内大屏: |
| | | </div> |
| | | <div class="image-list"> |
| | | <template v-if="detailData.helpButtonImages && detailData.helpButtonImages.length"> |
| | |
| | | <!-- 订单系统检查 --> |
| | | <div class="manual-item"> |
| | | <div class="check-label"> |
| | | 订单系统检查: |
| | | 舱内外清洁: |
| | | </div> |
| | | <div class="image-list"> |
| | | <template v-if="detailData.orderSystemCheckImages && detailData.orderSystemCheckImages.length"> |
| | |
| | | <!-- 车内交互屏检查 --> |
| | | <div class="manual-item"> |
| | | <div class="check-label"> |
| | | 车内交互屏检查: |
| | | 随车安全设备: |
| | | </div> |
| | | <div class="image-list"> |
| | | <template v-if="detailData.interactiveScreenImages && detailData.interactiveScreenImages.length"> |
| | |
| | | restEndTime: null, |
| | | }) |
| | | |
| | | function toMinutes(time: string) { |
| | | const [hours, minutes] = time.split(':').map(Number) |
| | | return hours * 60 + minutes |
| | | } |
| | | |
| | | function isLatestLaterThanEarliest(earliest: string | null, latest: string | null) { |
| | | if (!earliest || !latest) { |
| | | return true |
| | | } |
| | | return toMinutes(latest) > toMinutes(earliest) |
| | | } |
| | | |
| | | const rules: FormRules = { |
| | | shiftName: [ |
| | | { required: true, message: '请输入班次名称', trigger: ['change', 'blur'] }, |
| | | ], |
| | | startTime: [ |
| | | { required: true, message: '请选择开始时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择开始时间', trigger: ['change'] }, |
| | | ], |
| | | maxStartTime: [ |
| | | { required: true, message: '请选择上班最早打卡时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择上班最早打卡时间', trigger: ['change'] }, |
| | | { |
| | | validator: () => { |
| | | if (!isLatestLaterThanEarliest(formModel.value.maxStartTime, formModel.value.minStartTime)) { |
| | | return new Error('上班最晚打卡时间必须晚于最早打卡时间') |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | minStartTime: [ |
| | | { required: true, message: '请选择上班最晚打卡时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择上班最晚打卡时间', trigger: ['change'] }, |
| | | { |
| | | validator: () => { |
| | | if (!isLatestLaterThanEarliest(formModel.value.maxStartTime, formModel.value.minStartTime)) { |
| | | return new Error('上班最晚打卡时间必须晚于最早打卡时间') |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | endTime: [ |
| | | { required: true, message: '请选择结束时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择结束时间', trigger: ['change'] }, |
| | | // 这里因为可能有跨天逻辑,原有的简单结束必须大于开始时间的校验可能不适用,暂时移除强制结束>开始 |
| | | ], |
| | | maxEndTime: [ |
| | | { required: true, message: '请选择下班最早打卡时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择下班最早打卡时间', trigger: ['change'] }, |
| | | { |
| | | validator: () => { |
| | | if (formModel.value.crossDay) { |
| | | return true |
| | | } |
| | | if (!isLatestLaterThanEarliest(formModel.value.maxEndTime, formModel.value.minEndTime)) { |
| | | return new Error('下班最晚打卡时间必须晚于最早打卡时间') |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | minEndTime: [ |
| | | { required: true, message: '请选择下班最晚打卡时间', trigger: ['change', 'blur'] }, |
| | | { required: true, message: '请选择下班最晚打卡时间', trigger: ['change'] }, |
| | | { |
| | | validator: () => { |
| | | if (formModel.value.crossDay) { |
| | | return true |
| | | } |
| | | if (!isLatestLaterThanEarliest(formModel.value.maxEndTime, formModel.value.minEndTime)) { |
| | | return new Error('下班最晚打卡时间必须晚于最早打卡时间') |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | restStartTime: [ |
| | | { |
| | |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change', 'blur'], |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | restEndTime: [ |
| | |
| | | } |
| | | return true |
| | | }, |
| | | trigger: ['change', 'blur'], |
| | | trigger: ['change'], |
| | | }, |
| | | ], |
| | | } |
| | |
| | | { immediate: true }, |
| | | ) |
| | | |
| | | watch( |
| | | () => formModel.value.crossDay, |
| | | async crossDay => { |
| | | if (!show.value || !crossDay) { |
| | | return |
| | | } |
| | | |
| | | // 切换为跨天后清空当前表单校验态,避免下班时间窗残留旧报错 |
| | | await nextTick() |
| | | formRef.value?.restoreValidation() |
| | | }, |
| | | ) |
| | | |
| | | function openEdit(data: any) { |
| | | formModel.value = { |
| | | ...formModel.value, |
| | |
| | | <div class="section-title">人工检测</div> |
| | | <div class="grid-gap-3"> |
| | | <div class="block"> |
| | | <div class="block-label">传感器清洁:</div> |
| | | <div class="block-label">外观和轮胎:</div> |
| | | <n-image-group> |
| | | <div class="thumb-list"> |
| | | <n-image |
| | |
| | | </n-image-group> |
| | | </div> |
| | | <div class="block"> |
| | | <div class="block-label">紧急求组按钮/应答机:</div> |
| | | <div class="block-label">车内大屏:</div> |
| | | <n-image-group> |
| | | <div class="thumb-list"> |
| | | <n-image |
| | |
| | | </n-image-group> |
| | | </div> |
| | | <div class="block"> |
| | | <div class="block-label">订单系统检查:</div> |
| | | <div class="block-label">舱内外清洁:</div> |
| | | <n-image-group> |
| | | <div class="thumb-list"> |
| | | <n-image |
| | |
| | | </div> |
| | | <div class="grid-gap-3"> |
| | | <div class="block"> |
| | | <div class="block-label">车内交互屏检查:</div> |
| | | <div class="block-label">随车安全设备:</div> |
| | | <n-image-group> |
| | | <div class="thumb-list"> |
| | | <n-image |
| | |
| | | endPointName: '', |
| | | vehicleModel: '', |
| | | orderMoney: '', |
| | | plateNumber: null, |
| | | plateNumber: [], |
| | | fleetId: null, |
| | | orderSource: null, |
| | | cityCode: null, |
| | |
| | | const modalRef = ref() |
| | | const modalRef1 = ref() |
| | | const closeOrderModalRef = ref() |
| | | |
| | | function buildPlateNumberParam(value: unknown) { |
| | | if (Array.isArray(value)) { |
| | | const filteredValues = value |
| | | .map(item => String(item || '').trim()) |
| | | .filter(item => item !== '') |
| | | return filteredValues.length ? filteredValues.join(',') : null |
| | | } |
| | | const singleValue = String(value || '').trim() |
| | | return singleValue || null |
| | | } |
| | | |
| | | const checkedRowKeysRef = ref<DataTableRowKey[]>([]) |
| | | const listData = ref<any[]>([]) |
| | |
| | | const option = statusOptions.find(item => item.value === row.status) |
| | | return ( |
| | | <NTag |
| | | type={option?.type || 'default'} |
| | | color={{ textColor: option?.textColor || '#0BB52D', color: option?.color || '#DCF5DD' }} |
| | | color={{ textColor: option?.textColor, color: option?.color }} |
| | | bordered={false} |
| | | style={row.status === 9 |
| | | ? { |
| | | color: '#764DFF', |
| | | backgroundColor: '#F6F0FF', |
| | | } |
| | | : {}} |
| | | > |
| | | {option?.label || ''} |
| | | </NTag> |
| | |
| | | v-model:value={model.value.plateNumber} |
| | | onUpdate:show={(val: any) => isPlateNumberOpen.value = val} |
| | | options={plateNumberOptions.value} |
| | | multiple |
| | | filterable |
| | | clearable |
| | | > |
| | |
| | | vehicleModel: model.value.vehicleModel, |
| | | orderMoney: model.value.orderMoney, |
| | | name: model.value.name, |
| | | plateNumber: model.value.plateNumber, |
| | | plateNumber: buildPlateNumberParam(model.value.plateNumber), |
| | | fleetId: model.value.fleetId, |
| | | orderSource: model.value.orderSource, |
| | | cityCode: model.value.cityCode, |
| | |
| | | endPointName: model.value.endPointName, |
| | | vehicleModel: model.value.vehicleModel, |
| | | orderMoney: model.value.orderMoney, |
| | | plateNumber: model.value.plateNumber, |
| | | plateNumber: buildPlateNumberParam(model.value.plateNumber), |
| | | name: model.value.name, |
| | | fleetId: model.value.fleetId, |
| | | orderSource: model.value.orderSource, |