更新
This commit is contained in:
parent
a382207c64
commit
27127509d7
|
@ -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>
|
||||
|
|
|
@ -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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',
|
||||
|
|
|
@ -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();
|
||||
},
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
// 管理员开锁
|
||||
|
|
|
@ -109,6 +109,7 @@ export default {
|
|||
getStat({
|
||||
keys:[
|
||||
StatKeys.USER_COUNT,
|
||||
StatKeys.ORDER_COUNT,
|
||||
StatKeys.ORDER_PAY_AMOUNT,
|
||||
StatKeys.ORDER_REFUND_AMOUNT,
|
||||
],
|
||||
|
|
|
@ -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' },
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
// 字段列表
|
||||
|
|
|
@ -46,9 +46,7 @@ export default {
|
|||
redirectToWx() {
|
||||
wx.miniProgram.getEnv( (envRes) => {
|
||||
if (envRes.miniprogram) {
|
||||
wx.miniProgram.redirectTo({
|
||||
url: `/page_fenbao/renlianzhongzhuan`
|
||||
})
|
||||
wx.miniProgram.navigateBack()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user