feat(violation): 添加违章处理状态选择功能

- 新增处理状态字段,默认值为"未处理"
- 添加状态选择器组件,支持选择"未处理"和"已处理"
- 更新表单初始化逻辑,兼容编辑和新增模式下的状态设置
- 调整API基础URL配置,统一使用生产环境地址
- 更新应用名称为"邕递+"
- 车辆信息模型增加保单图片字段
-优化车辆查询页面,显示保单图片预览功能
- 更新违章列表页面,将"提交时间"改为"创建时间"显示
This commit is contained in:
2025-10-15 01:01:43 +08:00
parent cd7de05e33
commit d52731e435
5 changed files with 106 additions and 24 deletions

View File

@@ -2,14 +2,14 @@
export const ENV_CONFIG = {
// 开发环境
development: {
API_BASE_URL: 'http://127.0.0.1/api',
API_BASE_URL: 'https://cms-api.websoft.top/api',
APP_NAME: '开发环境',
DEBUG: 'true',
},
// 生产环境
production: {
API_BASE_URL: 'https://cms-api.websoft.top/api',
APP_NAME: '时里院子市集',
APP_NAME: '邕递+',
DEBUG: 'false',
},
// 测试环境

View File

@@ -38,6 +38,8 @@ export interface HjmCar {
driverName?: string;
// 保险状态
insuranceStatus?: number;
// 保单图片
bdImg?: string;
// GPS设备编号
gpsNo?: string;
// 速度

View File

@@ -5,7 +5,7 @@ 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 {View,Text} from '@tarojs/components'
import {
Form,
Button,
@@ -43,6 +43,8 @@ const Query = () => {
const [dict, setDict] = useState<DictData[]>([])
const [claimVehicle, setClaimVehicle] = useState<boolean>(false)
const [showPreview, setShowPreview] = useState(false)
const [showBdImgPreview, setShowBdImgPreview] = useState(false)
const [fileList2, setFileList2] = useState<UploadedImageData[]>([]) // 图片文件列表
const [disabled, setDisabled] = useState<boolean>(false)
const [fileList, setFileList] = useState<UploadedImageData[]>([]) // 图片文件列表
const [FormData, setFormData] = useState<HjmCar>(
@@ -321,8 +323,8 @@ const Query = () => {
// 认领车辆
const onClaimVehicle = async () => {
const myVerify = await myUserVerify({status: 1})
if(myVerify){
if(myVerify.organizationId != FormData.organizationId){
if (myVerify) {
if (myVerify.organizationId != FormData.organizationId) {
Taro.showToast({
title: '只能认领【' + myVerify.organizationName + '】的车辆',
icon: 'none'
@@ -448,7 +450,7 @@ const Query = () => {
// 2.1先查询名下有多少辆车
const carCount = await pageHjmCar({driverId: Taro.getStorageSync('UserId')})
carCount?.list.map(d => {
if(d.code == code){
if (d.code == code) {
// 只能绑定一辆车
}
})
@@ -461,6 +463,20 @@ const Query = () => {
}
return false
}
if(carInfo.bdImg){
const parse = JSON.parse(carInfo.bdImg);
if(parse.length > 0){
setFileList2(parse.map(
(img) => ({
url: img.url,
src: img.url,
name: img.name,
uid: img.uid
})
))
}
}
// if(carInfo.status == 1 && Taro.getStorageSync('UserId') != carInfo.driverId){
// Taro.showToast({
// title: '暂无权限',
@@ -611,7 +627,7 @@ const Query = () => {
style={{display: 'flex', alignItems: 'center'}}
onClick={saveGpsNo}
>
<Scan />
<Scan/>
</div>
</div>
</Form.Item>
@@ -761,8 +777,11 @@ const Query = () => {
<Cell className={'car-info-item-title'}>
{FormData?.kuaidiAdmin}
</Cell>
<Cell className={'car-info-item-content'}>
{FormData?.insuranceStatus}
<Cell title={
<View>{FormData?.insuranceStatus}</View>
} className={'car-info-item-content'} extra={FormData?.bdImg ? <Text className={'text-blue-500'} onClick={() => {
setShowBdImgPreview(true)
}}></Text> : ''}>
</Cell>
<Cell className={'car-info-item-content'}>
GPS编号{FormData?.gpsNo}
@@ -824,6 +843,13 @@ const Query = () => {
)
}
</div>
<ImagePreview
autoPlay
// @ts-ignore
images={fileList2}
visible={showBdImgPreview}
onClose={() => setShowBdImgPreview(false)}
/>
</div>
)}
</>

View File

@@ -5,6 +5,7 @@ import {
TextArea,
Cell,
Input,
Picker
} from '@nutui/nutui-react-taro'
import {addHjmViolation, getHjmViolation, updateHjmViolation} from "@/api/hjm/hjmViolation";
import {HjmViolation} from "@/api/hjm/hjmViolation/model";
@@ -17,12 +18,19 @@ function Add() {
const [loading, setLoading] = useState<boolean>(false)
const [lastSubmitTime, setLastSubmitTime] = useState<number>(0) // 最后提交时间
const [isEditMode, setIsEditMode] = useState<boolean>(false) // 是否为编辑模式
const [isPickerVisible, setIsPickerVisible] = useState<boolean>(false) // 处理状态选择器可见性
// 处理状态选项
const statusOptions = [
{text: '未处理', value: 0},
{text: '已处理', value: 1}
]
const [formData, setFormData] = useState<HjmViolation>({
code: '',
title: '',
money: '',
score: '',
comments: ''
comments: '',
status: 0 // 默认为未处理
})
// 初始化页面数据
@@ -35,7 +43,10 @@ function Add() {
try {
const violation = await getHjmViolation(Number(params.id));
if (violation) {
setFormData(violation);
setFormData({
...violation,
status: violation.status ?? 0 // 如果没有状态值默认为0(未处理)
});
} else {
Taro.showToast({
title: '未找到该违章记录',
@@ -49,6 +60,12 @@ function Add() {
icon: 'none'
})
}
} else {
// 新增模式下设置默认状态
setFormData(prev => ({
...prev,
status: 0
}))
}
setLoading(false)
} catch (error) {
@@ -113,12 +130,7 @@ function Add() {
Taro.eventCenter.trigger('violationListRefresh')
} else {
// 新增模式 - 添加违章记录
// 构建提交数据
const submitData: HjmViolation = {
...formData,
status: 0 // 0未处理, 1已处理
}
await addHjmViolation(submitData);
await addHjmViolation(formData);
Taro.showToast({
title: '提交成功',
icon: 'success'
@@ -131,7 +143,8 @@ function Add() {
title: '',
money: '',
score: '',
comments: ''
comments: '',
status: 0
})
}
@@ -148,6 +161,15 @@ function Add() {
}
}
// 处理状态选择确认
const handleStatusConfirm = (_: any[], values: (string | number)[]) => {
setFormData({
...formData,
status: values[0] as number
})
setIsPickerVisible(false)
}
useEffect(() => {
initPageData().then(r => {
console.log(r, 'rr')
@@ -198,7 +220,7 @@ function Add() {
</span>
</div>
<Cell.Group>
<Cell title="车辆编号" style={{padding: '12px 16px'}}>
<Cell title={'车辆编号'} description={'请填写车辆编号'} extra={
<Input
placeholder="YT000001"
value={formData.code}
@@ -206,24 +228,29 @@ function Add() {
style={{backgroundColor: '#ffffff', borderRadius: '8px'}}
disabled={isEditMode} // 编辑模式下禁用车辆编号输入
/>
} style={{padding: '12px 16px'}}>
</Cell>
<Cell title="违章标题" style={{padding: '12px 16px'}}>
<Cell title="违章项目" description={'逆行|闯红灯|不按规定停车'} extra={
<Input
placeholder="不按规定停车"
value={formData.title}
onChange={(value) => setFormData({...formData, title: value})}
style={{backgroundColor: '#ffffff', borderRadius: '8px'}}
/>
} style={{padding: '12px 16px'}}>
</Cell>
<Cell title="违章描述" style={{padding: '12px 16px'}}>
<Cell title="违章描述" description="违章描述" extra={
<TextArea
placeholder={'XX路1号...'}
value={formData.comments}
onChange={(value) => setFormData({...formData, comments: value})}
style={{backgroundColor: '#ffffff', borderRadius: '8px'}}
/>
} style={{padding: '12px 16px'}}>
</Cell>
<Cell title="处罚金额" style={{padding: '12px 16px'}}>
<Cell title="处罚金额" extra={
<Input
type="number"
placeholder="200(元)"
@@ -232,8 +259,10 @@ function Add() {
onChange={(value) => setFormData({...formData, money: value})}
style={{backgroundColor: '#ffffff', borderRadius: '8px'}}
/>
} style={{padding: '12px 16px'}}>
</Cell>
<Cell title="扣分" style={{padding: '12px 16px'}}>
<Cell title="扣分" extra={
<Input
type="number"
maxLength={2}
@@ -242,10 +271,35 @@ function Add() {
onChange={(value) => setFormData({...formData, score: value})}
style={{backgroundColor: '#ffffff', borderRadius: '8px'}}
/>
} style={{padding: '12px 16px'}}>
</Cell>
<Cell title="处理状态" description={'请选择'} extra={
<div style={{
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end',
height: '24px'
}}>
<span style={{color: '#333', fontSize: '14px'}}>
{statusOptions.find(option => option.value === formData.status)?.text || '请选择'}
</span>
</div>
} style={{padding: '12px 16px'}} onClick={() => setIsPickerVisible(true)}>
</Cell>
</Cell.Group>
</div>
{/* 处理状态选择器 */}
<Picker
visible={isPickerVisible}
options={statusOptions}
value={[formData.status ?? 0]}
onConfirm={handleStatusConfirm}
onCancel={() => setIsPickerVisible(false)}
onClose={() => setIsPickerVisible(false)}
/>
{/* 提交按钮 */}
<div style={{
position: 'fixed',

View File

@@ -249,7 +249,7 @@ const List: React.FC = () => {
}}>
<Calendar size={14} color="#8c8c8c"/>
<span style={{fontSize: '13px', color: '#8c8c8c'}}>
{item.createTime}
{item.createTime}
</span>
</div>
</Space>