You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="form-container">
<!-- 工单类型 -->
<view class="form-item" @click="openWorkOrderTypePicker">
<text class="form-label">工单类型</text>
<view class="form-value">
<text>{{ formData.workOrderTypeText || '' }}</text>
<uni-icons type="right" size="20"></uni-icons>
</view>
</view>
<!-- 倒伏相关选项 -->
<view class="form-item" v-if="showFallOptions" @click="openFallAffectPicker">
<text class="form-label">倒伏状态:</text>
<view class="form-value">
<text>{{ formData.fallAffectText || '' }}</text>
<uni-icons type="right" size="20"></uni-icons>
</view>
</view>
<!-- 影响类型 -->
<view class="form-item" style="justify-content: flex-start">
<text class="form-label">影响类型:</text>
<view class="form-value">
<uni-data-checkbox v-model="formData.workOrderLevel" multiple :localdata="workOrderLevels" />
</view>
</view>
<!-- 工单描述 -->
<view class="form-item">
<text class="form-label">工单描述:</text>
<view class="form-value">
<textarea v-model="formData.description" placeholder="请输入工单描述信息" class="textarea" />
</view>
</view>
<!-- 工单图片 -->
<view class="form-item">
<text class="form-label">工单图片:</text>
<view class="form-value">
<uni-file-picker v-model="imageValue" fileMediatype="image" mode="grid" @select="select" @progress="progress" @success="success" @fail="fail" />
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-btn">
<button type="primary" @click="handleSubmit('pending')"></button>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
import { getDicts } from '@/api/system/dict/data';
// 获取工单类型字典
const fetchDicts = async () => {
const response = await getDicts('gdlx', 'xdsqm', 'yxlx');
options.value = response.data.map((item) => ({
value: item.dictValue,
text: item.dictLabel
}));
};
// 表单数据
const formData = ref({
workOrderType: '',
workOrderTypeText: '',
fallAffect: '',
fallAffectText: '',
workOrderLevel: [],
description: '',
images: []
});
// 图片上传相关
const imageValue = ref([]);
// 控制显示倒伏选项
const showFallOptions = ref(false);
// 选项数据
const workOrderTypes = [
{ value: 'fall', text: '行道树/乔木' },
{ value: 'tilt', text: '花箱设施' },
{ value: 'broken', text: '建筑物' },
{ value: 'others', text: '其他' }
];
const fallAffectOptions = [
{ value: 'wire', text: '倒伏' },
{ value: 'vehicle', text: '倾斜' },
{ value: 'wall', text: '断枝' },
{ value: 'eaves', text: '其他' }
];
const workOrderLevels = [
{ value: 'wire', text: '线缆' },
{ value: 'road', text: '道路' },
{ value: 'vehicle', text: '车辆' },
{ value: 'building', text: '建筑物' },
{ value: 'others', text: '其他' }
];
// 打开工单类型选择器
const openWorkOrderTypePicker = () => {
uni.showActionSheet({
itemList: workOrderTypes.map((item) => item.text),
success: (res) => {
const selected = workOrderTypes[res.tapIndex];
formData.value.workOrderType = selected.value;
formData.value.workOrderTypeText = selected.text;
showFallOptions.value = selected.value === 'fall';
}
});
};
// 打开倒伏状态选择器
const openFallAffectPicker = () => {
uni.showActionSheet({
itemList: fallAffectOptions.map((item) => item.text),
success: (res) => {
const selected = fallAffectOptions[res.tapIndex];
formData.value.fallAffect = selected.value;
formData.value.fallAffectText = selected.text;
}
});
};
// 图片上传相关方法
const select = (e) => {
console.log('选择文件:', e);
};
const progress = (e) => {
console.log('上传进度:', e);
};
const success = (e) => {
console.log('上传成功:', e);
formData.value.images.push(e.tempFilePaths[0]);
};
const fail = (e) => {
console.log('上传失败:', e);
};
// 按钮处理方法
const handleBack = () => {
uni.showModal({
title: '提示',
content: '确定要退单吗?',
success: (res) => {
if (res.confirm) {
console.log('退单操作');
}
}
});
};
const handleSubmit = (type) => {
// 表单验证
if (!formData.value.workOrderType) {
uni.showToast({ title: '请选择工单类型', icon: 'none' });
return;
}
if (showFallOptions.value && !formData.value.fallAffect) {
uni.showToast({ title: '请选择倒伏状态', icon: 'none' });
return;
}
if (formData.value.workOrderLevel.length === 0) {
uni.showToast({ title: '请选择影响类型', icon: 'none' });
return;
}
if (!formData.value.description) {
uni.showToast({ title: '请输入工单描述', icon: 'none' });
return;
}
console.log('提交数据:', {
...formData.value,
submitType: type
});
uni.showToast({ title: '提交成功', icon: 'success' });
};
</script>
<style scoped>
.form-container {
overflow: auto;
}
.form-item {
display: flex;
justify-content: space-between;
padding: 20rpx 0;
border-bottom: 1px solid #eee;
}
.form-label {
width: 155rpx;
font-size: 28rpx;
color: #767d9c;
}
.form-value {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
color: #333;
}
.arrow {
color: #999;
font-size: 30rpx;
}
.checkbox-item {
margin-right: 30rpx;
margin-bottom: 20rpx;
display: inline-flex;
align-items: center;
}
.checkbox {
margin-right: 10rpx;
transform: scale(0.9);
}
.textarea {
width: 100%;
min-height: 200rpx;
padding-left: 5rpx;
border: 1px solid #eee;
border-radius: 8rpx;
}
.bottom-btn {
width: 100%;
display: flex;
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 20rpx;
background-color: #fff;
box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
}
.bottom-btn button {
flex: 1;
margin: 0 10rpx;
font-size: 28rpx;
}
button[type='default'] {
background-color: #f8f8f8;
color: #333;
}
</style>