import {useEffect, useState} from "react"; import Taro, {useRouter} from '@tarojs/taro' import {getHjmCarByCode, pageHjmCar, updateHjmCar} from "@/api/hjm/hjmCar"; import {HjmCar} from "@/api/hjm/hjmCar/model"; import './location.scss'; import {Swiper} from '@nutui/nutui-react-taro' import {copyText} from "@/utils/common"; import {View} from '@tarojs/components' import { Form, Button, Input, Radio, Cell, Image } from '@nutui/nutui-react-taro' import {ImagePreview} from '@nutui/nutui-react-taro' import {Scan} from '@nutui/icons-react-taro' import {pageDictData} from "@/api/system/dict-data"; import {DictData} from "@/api/system/dict-data/model"; import {myUserVerify} from "@/api/system/userVerify"; import {listUserRole} from "@/api/system/userRole"; import {TenantId} from "@/utils/config"; // 图片数据接口 interface UploadedImageData { url?: string; src?: string; name?: string; uid?: string; message?: string; type?: string; } /** * 文章终极列表 * @constructor */ const Query = () => { const {params} = useRouter(); const [keywords, setKeywords] = useState() const [dict, setDict] = useState([]) const [claimVehicle, setClaimVehicle] = useState(false) const [showPreview, setShowPreview] = useState(false) const [disabled, setDisabled] = useState(false) const [fileList, setFileList] = useState([]) // 图片文件列表 const [FormData, setFormData] = useState( { // 自增ID id: undefined, // 车辆名称 name: undefined, // 车辆图片 image: undefined, // 类型 0汽车 1其他车 type: undefined, // 快递公司 kuaidi: undefined, // 管理负责人 kuaidiAdmin: undefined, organization: undefined, organizationParentId: undefined, parentOrganization: undefined, parentOrganizationAdmin: undefined, // 车辆编号 code: undefined, // 操作员 driver: undefined, // 保险状态 insuranceStatus: undefined, // GPS设备编号 gpsNo: undefined, // 电子围栏ID fenceId: undefined, // 电子围栏名称 fenceName: undefined, // 电子围栏 fence: undefined, // 位置 location: undefined, // 经度 longitude: undefined, // 纬度 latitude: undefined, // 地址 address: undefined, // 用户ID userId: undefined, // 排序(数字越小越靠前) sortNumber: undefined, // 备注 comments: undefined, // 状态, 0正常, 1冻结 status: undefined, // 是否删除, 0否, 1是 deleted: undefined, // 租户id tenantId: undefined, // 创建时间 createTime: undefined, // 更新时间 updateTime: undefined, } ) // 提交表单 const submitSucceed = (values: any) => { // 禁用按钮 if (disabled) { return false; } console.log(values) if (FormData.image == '[]' || !FormData.image) { Taro.showToast({ title: '请上传车辆图片', icon: 'error' }); return false } if (!FormData.gpsNo) { Taro.showToast({ title: '请绑定GPS', icon: 'error' }); return false } // 安装车辆 updateHjmCar({ ...FormData, status: 1 }).then(() => { Taro.showToast({title: `安装成功`, icon: 'success'}) setTimeout(() => { return Taro.navigateBack() }, 1000) }).catch((err) => { Taro.showToast({ title: err.message, icon: 'none' }); }) } const submitFailed = (error: any) => { console.log(error, 'err...') } const saveGpsNo = () => { Taro.scanCode({ onlyFromCamera: true, scanType: ['barCode', 'qrCode'], success: (res) => { // 更新表单数据 setFormData({ ...FormData, gpsNo: res.result }); Taro.showToast({ title: res.result, icon: 'success', duration: 2000 }); }, fail: (err) => { console.log('扫码失败', err); Taro.showToast({ title: '扫码失败', icon: 'error', duration: 2000 }); } }); } // 选择并上传图片 const handleChooseImage = () => { if (disabled) { Taro.showToast({ title: '您不是安装人员', icon: 'error' }); return false; } if (fileList.length >= 5) { Taro.showToast({ title: '最多只能上传5张图片', icon: 'none' }) return } Taro.chooseImage({ count: 5 - fileList.length, // 剩余可选择的数量 sizeType: ['compressed'], sourceType: ['album', 'camera'], success: (res) => { console.log('选择图片成功:', res) // 逐个上传选中的图片 res.tempFilePaths.forEach((filePath, index) => { uploadSingleImage(filePath, index) }) }, fail: (err) => { console.log('选择图片失败:', err) Taro.showToast({ title: '选择图片失败', icon: 'error' }) } }) } // 上传单张图片 const uploadSingleImage = (filePath: any, index: number) => { Taro.uploadFile({ url: 'https://server.gxwebsoft.com/api/oss/upload', filePath: filePath, name: 'file', header: { 'content-type': 'application/json', TenantId }, success: (res) => { try { const data = JSON.parse(res.data); console.log('上传成功', data) if (data.code === 0) { // 更新文件列表 const newFile = { name: `图片${Date.now()}_${index}`, url: data.data.url, status: 'success', message: '上传成功', type: 'image', uid: `${Date.now()}_${index}`, } setFileList(prev => { const newList = [...prev, newFile] // 同时更新表单数据 - 使用JSON格式存储 const imageData: UploadedImageData[] = newList.map(f => ({ url: f.url, name: f.name, uid: f.uid })) setFormData(prevForm => ({ ...prevForm, image: JSON.stringify(imageData) })) return newList }) Taro.showToast({ title: '上传成功', icon: 'success' }) } else { Taro.showToast({ title: data.message || '上传失败', icon: 'error' }) } } catch (error) { console.error('解析响应失败:', error) Taro.showToast({ title: '上传失败', icon: 'error' }) } }, fail: (err) => { console.log('上传请求失败', err); Taro.showToast({ title: '上传失败', icon: 'error' }) } }) } // 处理文件删除 const handleFileRemove = (file: any) => { console.log('删除文件:', file) const newFileList = fileList.filter(f => f.uid !== file.uid) setFileList(newFileList) // 更新表单数据 - 使用JSON格式存储 if (newFileList.length === 0) { setFormData(prev => ({ ...prev, image: undefined })) } else { const imageData: UploadedImageData[] = newFileList.map(f => ({ url: f.url, src: f.url, name: f.name, uid: f.uid })) setFormData(prev => ({ ...prev, image: JSON.stringify(imageData) })) } } // 认领车辆 const onClaimVehicle = () => { updateHjmCar({ ...FormData, status: 2, driverId: Taro.getStorageSync('UserId'), driverName: Taro.getStorageSync('RealName') }).then(() => { Taro.showToast({title: `认领成功`, icon: 'success'}) setTimeout(() => { return Taro.navigateBack() }, 1000) }).catch((err) => { Taro.showToast({ title: err.message, icon: 'none' }); }) } const reload = async () => { // 1.判断是否登录 if (!Taro.getStorageSync('UserId')) { Taro.showToast({ title: '请先登录', icon: 'error' }) setDisabled(true); setTimeout(() => { Taro.navigateBack() }, 2000) return false } // 2.获取数据字典 const dict = await pageDictData({dictCode: 'InsuranceStatus'}) setDict(dict?.list || []) // 3.检查是否已实名 const verify = await myUserVerify({status: 1}) if (!verify) { Taro.showToast({ title: '未实名认证', icon: 'error' }) setTimeout(() => { Taro.navigateTo({ url: '/user/userVerify/index' }) }, 1000) return false } // 4.查询角色 const role = await listUserRole({userId: Taro.getStorageSync('UserId')}) const roleCode = role[0].roleCode; // 5.获取车辆信息 const code = params.id; if (code) { const carInfo = await getHjmCarByCode(code); if (carInfo) { // 赋值车辆信息 setFormData(carInfo) setKeywords(carInfo.code) if (carInfo.image) { try { const parsedImages: UploadedImageData[] = JSON.parse(carInfo.image) setFileList(parsedImages.map((img) => ({ url: img.url, src: img.url }))) } catch (error) { // 如果解析失败,可能是旧格式的单个URL if (carInfo.image && carInfo.image.trim()) { setFileList([{ src: carInfo.image, url: carInfo.image, message: '上传成功', type: 'image', uid: `legacy_${Date.now()}`, }]) } } } // 1.符合条件则由安装人员安装车辆,否则提示无权限 console.log(roleCode,'roleCode..') if (carInfo.status == 0 && roleCode != 'Installer') { Taro.setNavigationBarTitle({ title: '安装设备' }) Taro.showToast({ title: '您不是安装人员', icon: 'error' }) setDisabled(true) return false } // 2.如果已安装,则判断是否已认领车辆 if (carInfo.status == 1 && roleCode == 'kuaidiyuan') { // 2.1先查询名下有多少辆车 const carCount = await pageHjmCar({driverId: Taro.getStorageSync('UserId')}) if (carCount?.count && carCount?.count == 0) { // 2.2无车辆则认领 setClaimVehicle(true) Taro.setNavigationBarTitle({ title: '认领车辆' }) } else { // 2.3存在车辆则展示车辆信息 setClaimVehicle(false) Taro.setNavigationBarTitle({ title: '车辆信息' }) if(Taro.getStorageSync('UserId') != carInfo.driverId){ Taro.showToast({ title: '暂无权限', icon: 'error' }) setTimeout(() => { Taro.navigateBack() },2000) return false } } } } } // 执行搜索 if (keywords) { pageHjmCar({keywords}).then(res => { if (res?.list && res?.list?.length > 0) { const data = res?.list[0]; // setFormData(data) setKeywords(data.code) } }) return false; } } useEffect(() => { reload().then(() => { console.log('初始化完成') }) }, []) return ( <> {/* 未安装 */} {FormData?.status == 0 ? (
submitSucceed(values)} onFinishFailed={(errors) => submitFailed(errors)} footer={
} > copyText(`${FormData?.code}`)}>{FormData?.code} { dict?.map((item, index) => ( {item.dictDataName} )) }
setFormData({...FormData, gpsNo: value})} />
{/* 显示已上传的图片 */} {fileList.map((file) => (
{file.name}
))} {/* 添加图片按钮 */} {fileList.length < 5 && (
+ 添加图片
)} {/* 显示上传数量提示 */} {fileList.length > 0 && (
已上传{fileList.length}张图片(最多5张)
)}
) : ''} {/* 已安装 */} {FormData?.status != 0 ? (
{/* 显示多张图片 */}
setShowPreview(false)} /> {fileList.map((item) => ( // @ts-ignore setShowPreview(true)} src={item.url} /> ))}
copyText(`${FormData?.code}`)}> 车辆编号:{FormData?.code} 快递公司品牌:{FormData?.parentOrganization} 所属站点:{FormData?.organization} 管理责任人:{FormData?.parentOrganizationAdmin} 保险状态:{FormData?.insuranceStatus} GPS编号:{FormData?.gpsNo} 电子围栏:{FormData.fenceName} 操作员:{FormData.status == 2 ? FormData.driver : '-'} { // 认领车辆 claimVehicle && (
) } { // 展示车辆信息 !claimVehicle && !disabled && (
) }
) : ''} ) } // @ts-ignore export default Query