This commit is contained in:
磷叶 2025-04-11 15:35:32 +08:00
parent a382207c64
commit 27127509d7
12 changed files with 126 additions and 90 deletions

View File

@ -8,8 +8,8 @@
<el-form ref="form" :model="form" size="small" :rules="rules" label-width="6em">
<collapse-panel title="基本信息" :value="true">
<el-row :gutter="gutter">
<form-col :span="span" label="运营商" prop="userId">
<user-input v-model="form.userId" :text.sync="form.userName" :disabled="!checkPermi(['system:user:list'])"/>
<form-col :span="span" label="运营商" prop="userId" v-if="checkPermi(['system:user:list'])">
<user-input v-model="form.userId" :text.sync="form.userName"/>
</form-col>
<form-col :span="span" label="区域名称" prop="name">
<el-input v-model="form.name" placeholder="请输入区域名称" />
@ -61,13 +61,13 @@
<form-col :span="span" label="运营区外断电" prop="areaOutOutage" label-width="8em" tip="开启后,当超出运营区后将断电">
<el-switch v-model="form.areaOutOutage" active-text="断电" inactive-text="不断电"/>
</form-col>
<form-col :span="span" label="边界播报距离" prop="boundaryDistance" label-width="8em" tip="当车辆靠近边界时,将播报提醒">
<el-input v-model="form.boundaryDistance" placeholder="请输入边界播报距离" type="number">
<form-col :span="span" label="靠近边界播报" prop="boundaryDistance" label-width="8em" tip="当车辆靠近边界时,将播报提醒">
<el-input v-model="form.boundaryDistance" placeholder="请输入靠近边界播报距离" type="number">
<template #append></template>
</el-input>
</form-col>
<form-col :span="span" label="出界断电距离" prop="outageDistance" label-width="8em" tip="当车辆超出运营区此距离后将断电">
<el-input v-model="form.outageDistance" placeholder="请输入运营区外断电距离" type="number">
<el-input v-model="form.outageDistance" placeholder="请输入超出运营区外断电距离" type="number">
<template #append></template>
</el-input>
</form-col>
@ -75,8 +75,8 @@
</collapse-panel>
<collapse-panel title="还车设置" :value="true">
<el-row :gutter="gutter">
<form-col :span="span" label="还车误差" prop="error" tip="还车误差范围,允许用户在规划的停车点附近误差范围内还车">
<el-input v-model="form.error" placeholder="请输入还车误差" type="number">
<form-col :span="span" label="区域误差" prop="error" tip="子区域的误差范围,进入这个误差范围则视为在区域内(停车区、禁行区、禁停区适用)">
<el-input v-model="form.error" placeholder="请输入区域误差" type="number">
<template #append></template>
</el-input>
</form-col>

View File

@ -61,6 +61,27 @@ export const LABEL_STYLES = {
};
// SN标签样式
export function getSnLabel(AMap, sn, position) {
new AMap.Text({
text: sn,
position: position,
offset: new this.AMap.Pixel(0, -50), // 调整位置到marker上方
anchor: 'center',
style: {
background: '#fff',
border: '1px solid #409EFF',
borderRadius: '4px',
padding: '2px 8px',
color: '#409EFF',
fontSize: '12px',
whiteSpace: 'nowrap',
textAlign: 'center',
boxShadow: '0 2px 6px rgba(0,0,0,0.1)'
}
});
}
const icons = {
'blue': 'data:image/image/png;base64,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',
'red': 'data:image/image/png;base64,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',

View File

@ -18,12 +18,13 @@
<!-- 轨迹回放控制面板 -->
<playback-panel
v-if="isPlaybackVisible && locationLogList.length > 0"
v-show="isPlaybackVisible && locationLogList.length > 0"
:current-log="currentLog"
:current-speed="currentSpeed"
:max-index="sortedLocationLogs.length - 1"
:is-playing="isPlaying"
:playback-speed="playbackSpeed"
:current-index="currentLogIndex"
@slider-change="handleSliderChange"
@toggle-play="togglePlay"
@speed-change="setPlaybackSpeed"
@ -52,8 +53,8 @@ import AMapLoader from "@amap/amap-jsapi-loader";
import { AreaSubStatus } from "@/utils/enums";
import { debounce, isEmpty } from "@/utils/index";
import globalConfig from "@/utils/config/globalConfig";
import { AREA_STYLES, HIGHLIGHT_STYLES, MARKER_ICONS, LABEL_STYLES, DEVICE_STATUS_ICONS } from "@/views/bst/areaSub/components/AreaMap";
import PlaybackPanel from './PlaybackPanel.vue';
import { AREA_STYLES, HIGHLIGHT_STYLES, MARKER_ICONS, LABEL_STYLES, DEVICE_STATUS_ICONS, getSnLabel } from "@/views/bst/areaSub/components/AreaMap";
import PlaybackPanel from '@/views/bst/areaSub/components/PlaybackPanel.vue';
import { getLocationArea } from "@/api/bst/area";
export default {
@ -803,10 +804,11 @@ export default {
}
},
updateCurrentLog() {
if (this.sortedLocationLogs.length === 0) return;
if (this.sortedLocationLogs.length === 0) {
return;
}
this.currentLog = this.sortedLocationLogs[this.currentLogIndex];
this.currentSpeed = this.currentLog.speed;
this.updateDeviceMarker();
},
@ -819,7 +821,9 @@ export default {
return 0;
},
updateDeviceMarker() {
if (!this.currentLog) return;
if (!this.currentLog) {
return;
}
const position = [this.currentLog.longitude, this.currentLog.latitude];
@ -839,23 +843,7 @@ export default {
});
// SN
const snLabel = new this.AMap.Text({
text: `${this.currentLog.sn}`,
position: position,
offset: new this.AMap.Pixel(0, -50), // marker
anchor: 'center',
style: {
background: '#fff',
border: '1px solid #409EFF',
borderRadius: '4px',
padding: '2px 8px',
color: '#409EFF',
fontSize: '12px',
whiteSpace: 'nowrap',
textAlign: 'center',
boxShadow: '0 2px 6px rgba(0,0,0,0.1)'
}
});
const snLabel = getSnLabel(this.AMap, this.currentLog.sn, position)
this.map.add([this.currentDeviceMarker, snLabel]);
// snLabel便
@ -942,6 +930,8 @@ export default {
this.currentLogIndex = 0;
this.currentLog = null;
return;
} else {
this.currentLogIndex = this.locationLogList.length - 1;
}
//
@ -969,7 +959,6 @@ export default {
return log;
});
this.currentLogIndex = 0;
this.updateCurrentLog();
this.drawTrajectory();
},

View File

@ -1,29 +1,29 @@
<template>
<el-card class="playback-panel" header="轨迹控制台">
<el-row class="device-info">
<el-row class="device-info" v-if="currentLog">
<el-col :span="24" class="info-item">
<span class="label">时间</span>
<span class="value">{{ currentLog ? currentLog.at : '-' }}</span>
<span class="value">{{ currentLog.at | dv}}</span>
</el-col>
<el-col :span="24" class="info-item">
<span class="label">位置</span>
<span class="value">{{ currentLog ? `${currentLog.longitude}, ${currentLog.latitude}` : '-' }}</span>
<span class="value">{{currentLog.longitude | dv}},{{currentLog.latitude | dv}}</span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">速度</span>
<span class="value">{{ currentSpeed }} Km/h</span>
<span class="value">{{ currentLog.speed }} KM/h</span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">电压</span>
<span class="value">{{ currentLog ? currentLog.voltage + 'V' : '-' }}</span>
<span class="value">{{ currentLog.voltage | dv}} V</span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">信号</span>
<span class="value">{{ currentLog ? currentLog.signal : '-' }}</span>
<span class="value">{{ currentLog.signal | dv}}</span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">卫星</span>
<span class="value">{{ currentLog ? currentLog.satellites : '-' }}</span>
<span class="value">{{ currentLog.satellites | dv}}</span>
</el-col>
<el-col :span="12" class="info-item">
<span class="label">状态</span>
@ -41,7 +41,7 @@
<div class="playback-controls">
<el-slider
v-model="currentIndex"
:value="sliderValue"
:max="maxIndex"
:show-tooltip="false"
@input="handleSliderChange">
@ -75,10 +75,6 @@ export default {
type: Object,
default: () => ({})
},
currentSpeed: {
type: Number,
default: 0
},
maxIndex: {
type: Number,
default: 0
@ -90,19 +86,15 @@ export default {
playbackSpeed: {
type: Number,
default: 1
},
currentIndex: {
type: Number,
required: true
}
},
data() {
return {
currentIndex: 0
}
},
watch: {
currentLog(newVal) {
//
if (newVal && newVal.index !== undefined) {
this.currentIndex = newVal.index;
}
computed: {
sliderValue() {
return this.currentIndex;
}
},
methods: {

View File

@ -141,7 +141,7 @@
plain
icon="el-icon-upload"
size="mini"
@click="handleOut"
@click="handleOut(null)"
:disabled="multiple"
v-has-permi="['bst:device:out']"
>一键出仓</el-button>
@ -152,7 +152,7 @@
plain
icon="el-icon-download"
size="mini"
@click="handleIn"
@click="handleIn(null)"
:disabled="multiple"
v-has-permi="['bst:device:in']"
>一键入仓</el-button>
@ -163,7 +163,7 @@
plain
icon="el-icon-close"
size="mini"
@click="handleDisable"
@click="handleDisable(null)"
:disabled="multiple"
v-has-permi="['bst:device:disable']"
>一键禁用</el-button>
@ -174,7 +174,7 @@
plain
icon="el-icon-check"
size="mini"
@click="handleEnable"
@click="handleEnable(null)"
:disabled="multiple"
v-has-permi="['bst:device:enable']"
>一键启用</el-button>
@ -185,7 +185,7 @@
plain
icon="el-icon-sort"
size="mini"
@click="handleTransfer"
@click="handleTransfer(null)"
:disabled="multiple"
v-has-permi="['bst:device:transfer']"
>一键划拨</el-button>
@ -509,11 +509,10 @@ export default {
methods: {
//
handleTransfer(row) {
this.transferIds = this.ids;
if (row != null) {
this.transferIds = [row.id];
} else {
this.transferIds = this.ids;
}
}
this.showTransferDialog = true;
},
//

View File

@ -109,6 +109,7 @@ export default {
getStat({
keys:[
StatKeys.USER_COUNT,
StatKeys.ORDER_COUNT,
StatKeys.ORDER_PAY_AMOUNT,
StatKeys.ORDER_REFUND_AMOUNT,
],

View File

@ -5,15 +5,27 @@
width="500px"
append-to-body
@open="handleOpen"
center
>
<el-form :model="form" :rules="rules" ref="form" label-width="6em" v-loading="loading" size="small">
<el-form :model="form" :rules="rules" ref="form" label-width="5em" v-loading="loading" size="small">
<el-form-item label="车损费" prop="deductionFee">
<el-input-number
v-model="form.deductionFee"
type="number"
placeholder="请输入车损费"
:min="0"
controls-position="right"
:max="detail.depositFee - detail.totalFee"
style="width: 100%;"
/>
</el-form-item>
<el-form-item label="审核意见" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入审核意见" show-word-limit maxlength="200" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSubmit(true)">通过</el-button>
<el-button type="danger" @click="handleSubmit(false)">驳回</el-button>
<el-button type="success" plain @click="handleSubmit(true)" icon="el-icon-check">通过</el-button>
<el-button type="danger" plain @click="handleSubmit(false)" icon="el-icon-close">驳回</el-button>
</div>
</el-dialog>
</template>
@ -25,7 +37,7 @@ export default {
props: {
id: {
type: String,
default: ''
default: null
},
visible: {
type: Boolean,
@ -38,9 +50,6 @@ export default {
form: {},
loading: false,
rules: {
remark: [
{ required: true, message: '请输入备注', trigger: 'blur' },
],
}
}
},

View File

@ -356,10 +356,10 @@ export default {
},
methods: {
handleVerify(row) {
this.row = row;
this.showVerifyDialog = true;
},
handleView(row) {
this.row = row;
this.$router.push(`/view/order/${row.id}`)
},
handleEnd(row) {

View File

@ -83,17 +83,16 @@
<collapse-panel :value="true" title="归还信息">
<el-descriptions :column="4" >
<el-descriptions-item label="归还方式">
<el-descriptions-item label="定位方式">
<dict-tag :options="dict.type.order_return_mode" :value="detail.returnMode" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="归还类型">
<dict-tag :options="dict.type.order_return_type" :value="detail.returnType" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="归还时间">{{ detail.endTime }}</el-descriptions-item>
<el-descriptions-item label="归还经度" v-if="detail.returnLon">{{ detail.returnLon }}</el-descriptions-item>
<el-descriptions-item label="归还纬度" v-if="detail.returnLat">{{ detail.returnLat }}</el-descriptions-item>
<el-descriptions-item label="起始站点">{{ detail.startAreaSubName || '-' }}</el-descriptions-item>
<el-descriptions-item label="归还站点">{{ detail.endAreaSubName || '-' }}</el-descriptions-item>
<el-descriptions-item label="归还定位">{{ detail.returnLon | dv }}, {{ detail.returnLat | dv }}</el-descriptions-item>
<el-descriptions-item label="起始站点">{{ detail.startAreaSubName | dv }}</el-descriptions-item>
<el-descriptions-item label="归还站点">{{ detail.endAreaSubName | dv }}</el-descriptions-item>
</el-descriptions>
</collapse-panel>
</el-card>

View File

@ -112,15 +112,29 @@
<dict-tag :options="dict.type.order_device_type" :value="d.row.type" size="mini" style="margin-left: 4px;"/>
<dict-tag :options="dict.type.order_device_status" :value="d.row.status" size="mini" style="margin-left: 4px;"/>
<br/>
MAC{{d.row.deviceMac | dv}}
MAC{{d.row.deviceMac | dv}}<br/>
车牌{{d.row.deviceVehicleNum | dv}}
</template>
<template v-else-if="column.key === 'reason'">
<dict-tag :options="dict.type.order_device_reason" :value="d.row[column.key]" size="mini"/>
<dict-tag :options="dict.type.order_device_reason" :value="d.row.reason" size="mini"/>
</template>
<template v-else-if="column.key === 'finishPicture'">
<image-preview :src="d.row[column.key]" :width="50" :height="50"/>
<video v-if="d.row[column.key]" :src="d.row[column.key]" style="width: 50px; height: 50px; background-color: #000;" @click="handleVideo(d.row)"/>
</template>
<template v-else-if="column.key === 'returnMode'">
<dict-tag :options="dict.type.order_return_mode" :value="d.row[column.key]" size="mini"/><br/>
{{d.row.returnLon | dv }},{{d.row.returnLat | dv}}
</template>
<template v-else-if="column.key === 'startTime'">
开始{{d.row.startTime | dv}}<br/>
结束{{d.row.endTime | dv}}
</template>
<template v-else-if="column.key === 'orderNo'">
订单{{d.row.orderNo | dv}} <br/>
用户{{d.row.orderUserName | dv}}<br/>
手机号{{d.row.orderUserPhone | dv}}
</template>
<template v-else>
{{d.row[column.key]}}
</template>
@ -137,6 +151,10 @@
@pagination="getList"
/>
<el-dialog title="视频预览" :visible.sync="videoVisible" width="800px">
<video :src="row.finishPicture" style="width: 100%; height: fit-content; background-color: #000; max-height: 600px;" controls/>
</el-dialog>
</div>
</template>
@ -154,7 +172,7 @@ const defaultSort = {
export default {
name: "OrderDevice",
mixins: [$showColumns],
dicts: ['order_device_type', 'order_device_reason', 'order_device_status' ],
dicts: ['order_device_type', 'order_device_reason', 'order_device_status', 'order_return_mode' ],
components: {FormCol},
props: {
query: {
@ -164,18 +182,19 @@ export default {
},
data() {
return {
row: {},
videoVisible: false,
span: 24,
//
columns: [
{key: 'id', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'deviceSn', visible: true, label: 'SN', minWidth: "200", sortable: true, overflow: false, align: 'left', width: null},
{key: 'orderNo', visible: true, label: '订单号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'startTime', visible: true, label: '开始时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: null},
{key: 'endTime', visible: true, label: '结束时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: null},
{key: 'reason', visible: true, label: '换车原因', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'deviceSn', visible: true, label: '车辆', minWidth: "150", sortable: true, overflow: false, align: 'left', width: null},
{key: 'orderNo', visible: true, label: '订单', minWidth: "150", sortable: true, overflow: false, align: 'left', width: null},
{key: 'startTime', visible: true, label: '时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: "220"},
{key: 'deviceMchName', visible: true, label: '车辆归属', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'orderUserName', visible: true, label: '订单用户', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'finishPicture', visible: true, label: '还车图片', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reason', visible: true, label: '换车原因', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'finishPicture', visible: true, label: '还车视频', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'returnMode', visible: true, label: '还车定位', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
],
//
orderSorts: ['ascending', 'descending', null],
@ -240,6 +259,10 @@ export default {
this.getList();
},
methods: {
handleVideo(row) {
this.row = row;
this.videoVisible = true;
},
/** 当排序按钮被点击时触发 **/
onSortChange(column) {
if (column.order == null) {

View File

@ -146,6 +146,10 @@
<dict-tag :options="dict.type.account_type" :value="d.row.accountType" size="mini" style="margin-left: 4px"/>
<dict-tag :options="dict.type.withdraw_status" :value="d.row.status" size="mini" style="margin-left: 4px"/>
</template>
<template v-else-if="column.key === 'accountNo'">
<image-preview v-if="d.row.accountType === AccountType.QR" :src="d.row.accountNo" :width="50" :height="50" />
<span v-else>{{d.row.accountNo}}</span>
</template>
<template v-else-if="column.key === 'serviceCharge'">
{{d.row.serviceCharge | fix2 | dv}} <br/>
<dict-tag :options="dict.type.withdraw_service_type" :value="d.row.serviceType" size="mini" style="margin-left: 4px"/>
@ -200,7 +204,7 @@ import { $showColumns } from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import WithdrawVerifyDialog from '@/views/bst/withdraw/components/WithdrawVerifyDialog.vue';
import WithdrawAddDialog from '@/views/bst/withdraw/components/WithdrawAddDialog.vue';
import { AccountType } from '@/utils/enums';
//
const defaultSort = {
prop: "createTime",
@ -214,6 +218,7 @@ export default {
components: {FormCol, WithdrawVerifyDialog, WithdrawAddDialog},
data() {
return {
AccountType,
span: 24,
selectedId: null,
//

View File

@ -46,9 +46,7 @@ export default {
redirectToWx() {
wx.miniProgram.getEnv( (envRes) => {
if (envRes.miniprogram) {
wx.miniProgram.redirectTo({
url: `/page_fenbao/renlianzhongzhuan`
})
wx.miniProgram.navigateBack()
}
})
}