From bc4ed94ddbc32fcf5ca90e2b8250d0ec2f07d0fd Mon Sep 17 00:00:00 2001
From: 18650502300 <18650502300@163.com>
Date: Fri, 6 Sep 2024 15:26:24 +0800
Subject: [PATCH 1/3] =?UTF-8?q?1.=E6=94=AF=E4=BB=98=E6=B8=A0=E9=81=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/system/channel.js                  |  44 +++
 src/api/system/channelWithdraw.js          |  44 +++
 src/components/FormCol/index.vue           |  31 ++
 src/main.js                                |   3 +
 src/utils/mixins.js                        |  53 +++
 src/views/system/channel/index.vue         | 270 +++++++++++++++
 src/views/system/channelWithdraw/index.vue | 385 +++++++++++++++++++++
 7 files changed, 830 insertions(+)
 create mode 100644 src/api/system/channel.js
 create mode 100644 src/api/system/channelWithdraw.js
 create mode 100644 src/components/FormCol/index.vue
 create mode 100644 src/utils/mixins.js
 create mode 100644 src/views/system/channel/index.vue
 create mode 100644 src/views/system/channelWithdraw/index.vue

diff --git a/src/api/system/channel.js b/src/api/system/channel.js
new file mode 100644
index 0000000..57e9cf9
--- /dev/null
+++ b/src/api/system/channel.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询充值渠道列表
+export function listChannel(query) {
+  return request({
+    url: '/system/channel/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询充值渠道详细
+export function getChannel(channelId) {
+  return request({
+    url: '/system/channel/' + channelId,
+    method: 'get'
+  })
+}
+
+// 新增充值渠道
+export function addChannel(data) {
+  return request({
+    url: '/system/channel',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改充值渠道
+export function updateChannel(data) {
+  return request({
+    url: '/system/channel',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除充值渠道
+export function delChannel(channelId) {
+  return request({
+    url: '/system/channel/' + channelId,
+    method: 'delete'
+  })
+}
diff --git a/src/api/system/channelWithdraw.js b/src/api/system/channelWithdraw.js
new file mode 100644
index 0000000..045e258
--- /dev/null
+++ b/src/api/system/channelWithdraw.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询提现渠道列表
+export function listChannelWithdraw(query) {
+  return request({
+    url: '/ss/channelWithdraw/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询提现渠道详细
+export function getChannelWithdraw(channelId) {
+  return request({
+    url: '/ss/channelWithdraw/' + channelId,
+    method: 'get'
+  })
+}
+
+// 新增提现渠道
+export function addChannelWithdraw(data) {
+  return request({
+    url: '/ss/channelWithdraw',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改提现渠道
+export function updateChannelWithdraw(data) {
+  return request({
+    url: '/ss/channelWithdraw',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除提现渠道
+export function delChannelWithdraw(channelId) {
+  return request({
+    url: '/ss/channelWithdraw/' + channelId,
+    method: 'delete'
+  })
+}
diff --git a/src/components/FormCol/index.vue b/src/components/FormCol/index.vue
new file mode 100644
index 0000000..2543509
--- /dev/null
+++ b/src/components/FormCol/index.vue
@@ -0,0 +1,31 @@
+<template>
+  <el-col :span="span">
+    <el-form-item :label="label" :prop="prop" :label-width="labelWidth">
+      <slot></slot>
+    </el-form-item>
+  </el-col>
+</template>
+
+<script>
+export default {
+  name: 'FormCol',
+  props: {
+    span: {
+      type: Number,
+      default: 24
+    },
+    label: {
+      type: String,
+      default: null
+    },
+    prop: {
+      type: String,
+      default: null
+    },
+    labelWidth: {
+      type: String,
+      default: null
+    }
+  }
+}
+</script>
diff --git a/src/main.js b/src/main.js
index 55cc2df..8fb0758 100644
--- a/src/main.js
+++ b/src/main.js
@@ -37,6 +37,8 @@ import ImageUpload from "@/components/ImageUpload"
 import ImagePreview from "@/components/ImagePreview"
 // 字典标签组件
 import DictTag from '@/components/DictTag'
+// 行内表单组件
+import FormCol from '@/components/FormCol/index.vue'
 // 头部标签组件
 import VueMeta from 'vue-meta'
 // 字典数据组件
@@ -71,6 +73,7 @@ Vue.component('ImageUpload', ImageUpload)
 Vue.component('ImagePreview', ImagePreview)
 Vue.component('AreaMap', AreaMap)
 Vue.component('Map', Map)
+Vue.component('FormCol', FormCol)
 
 Vue.use(directive)
 Vue.use(plugins)
diff --git a/src/utils/mixins.js b/src/utils/mixins.js
new file mode 100644
index 0000000..32626fa
--- /dev/null
+++ b/src/utils/mixins.js
@@ -0,0 +1,53 @@
+
+// 充值服务费
+export const $serviceType = {
+  computed: {
+    // 服务费单位
+    serviceUnit() {
+      return (type) => {
+        return type === '2' ? '元' : '%';
+      }
+    }
+  }
+}
+
+// 提现服务费
+export const $withdrawServiceType = {
+  computed: {
+    // 提现服务费单位
+    withdrawServiceUnit() {
+      return (type) => {
+        return type === '2' ? '元' : '%';
+      }
+    }
+  }
+}
+
+
+/**
+ * 显隐列
+ **/
+export const $showColumns = {
+  data() {
+    return {
+      columns: []
+    }
+  },
+  computed: {
+    showColumns() {
+      if (this.columns == null) {
+        return [];
+      }
+      return this.columns.filter(item => item.visible);
+    },
+    isShow() {
+      return (key) => {
+        if (this.columns == null) {
+          return false;
+        }
+        let column = this.columns.find(item => item.key === key);
+        return column != null && column.visible;
+      }
+    }
+  },
+}
diff --git a/src/views/system/channel/index.vue b/src/views/system/channel/index.vue
new file mode 100644
index 0000000..ab16e5c
--- /dev/null
+++ b/src/views/system/channel/index.vue
@@ -0,0 +1,270 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="渠道名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入渠道名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:channel:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="channelList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="channelId" width="80"/>
+      <el-table-column label="渠道名称" align="center" prop="name"/>
+      <el-table-column label="图片" align="center" prop="picture" width="100">
+        <image-preview slot-scope="d" :src="d.row.picture" :width="32" :height="32"/>
+      </el-table-column>
+      <el-table-column label="是否启用" align="center" prop="enabled">
+        <template slot-scope="d">
+          <el-switch v-model="d.row.enabled" @change="(nv) => {onChangeEnabled(d.row, nv)}"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="渠道成本" align="center" prop="costRate">
+        <template slot-scope="d">{{d.row.costRate | money}} %</template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:channel:edit']"
+          >修改</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改充值渠道对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="7em">
+        <form-col :span="span" label="渠道名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入渠道名称"  disabled readonly/>
+        </form-col>
+        <form-col :span="span" label="图片" prop="picture">
+          <image-upload v-model="form.picture" :limit="1"/>
+        </form-col>
+        <form-col :span="span" label="是否启用" prop="enabled">
+          <el-switch v-model="form.enabled" />
+        </form-col>
+        <form-col :span="span" label="渠道成本" prop="costRate">
+          <el-input v-model.number="form.costRate"  placeholder="请输入充值成本率" :min="0">
+            <template #suffix>%</template>
+          </el-input>
+        </form-col>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listChannel, getChannel, delChannel, addChannel, updateChannel } from "@/api/system/channel";
+import { $serviceType, $withdrawServiceType } from '@/utils/mixins'
+
+export default {
+  name: "Channel",
+  mixins: [$serviceType, $withdrawServiceType],
+  dicts: ['withdraw_service_type', 'service_type'],
+  data() {
+    return {
+      span: 24,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 充值渠道表格数据
+      channelList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        enabled: null,
+        serviceRate: null,
+        costRate: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          {required: true, message: '渠道名称不能为空', target: 'blur'}
+        ],
+        enabled: [
+          {required: true, type: 'boolean', message: '是否启用不能为空', target: 'blur'}
+        ],
+        costRate: [
+          {required: true, type: 'number', message: '成本不能为空', target: 'blur'}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    parseNumber(val) {
+      if (val == null) {
+        return null;
+      }
+      return parseFloat(val);
+    },
+    // 更新是否启用
+    onChangeEnabled(row, enabled) {
+      if (row == null) {
+        return this.$message.warning("参数错误");
+      }
+      updateChannel({channelId: row.channelId, enabled: enabled}).catch(() => {
+        row.enabled = !enabled;
+      })
+    },
+    onChangeWithdrawEnabled(row, enabled) {
+      if (row == null) {
+        return this.$message.warning("参数错误");
+      }
+      updateChannel({channelId: row.channelId, withdrawEnabled: enabled}).catch(() => {
+        row.withdrawEnabled = !enabled;
+      })
+    },
+    /** 查询充值渠道列表 */
+    getList() {
+      this.loading = true;
+      listChannel(this.queryParams).then(response => {
+        this.channelList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        channelId: null,
+        name: null,
+        enabled: null,
+        serviceRate: null,
+        costRate: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.channelId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加充值渠道";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const channelId = row.channelId || this.ids
+      getChannel(channelId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改充值渠道";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.channelId != null) {
+            updateChannel(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addChannel(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const channelIds = row.channelId || this.ids;
+      this.$modal.confirm('是否确认删除充值渠道编号为"' + channelIds + '"的数据项?').then(function() {
+        return delChannel(channelIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/channel/export', {
+        ...this.queryParams
+      }, `channel_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/src/views/system/channelWithdraw/index.vue b/src/views/system/channelWithdraw/index.vue
new file mode 100644
index 0000000..d1cafab
--- /dev/null
+++ b/src/views/system/channelWithdraw/index.vue
@@ -0,0 +1,385 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="渠道名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入渠道名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="账户类型" prop="accountType">
+        <el-select v-model="queryParams.accountType" placeholder="请选择对应账户类型" clearable>
+          <el-option
+            v-for="dict in dict.type.account_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="服务费收取类型" prop="serviceType" label-width="8em">
+        <el-select v-model="queryParams.serviceType" placeholder="请选择服务费收取类型" clearable>
+          <el-option
+            v-for="dict in dict.type.withdraw_service_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否启用" prop="enabled">
+        <el-radio-group v-model="queryParams.enabled">
+          <el-radio-button :label="true">是</el-radio-button>
+          <el-radio-button :label="false">否</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['ss:channelWithdraw:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="channelWithdrawList" @selection-change="handleSelectionChange" :default-sort="defaultSort"  @sort-change="onSortChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <template v-for="column of showColumns">
+        <el-table-column
+            :key="column.key"
+            :label="column.label"
+            :prop="column.key"
+            :align="column.align"
+            :min-width="column.minWidth"
+            :sort-orders="orderSorts"
+            :sortable="column.sortable"
+            :show-overflow-tooltip="column.overflow"
+            :width="column.width"
+        >
+          <template slot-scope="d">
+            <template v-if="column.key === 'channelId'">
+              {{d.row[column.key]}}
+            </template>
+            <template v-else-if="column.key === 'accountType'">
+              <dict-tag :options="dict.type.account_type" :value="d.row[column.key]"/>
+            </template>
+            <template v-else-if="column.key === 'enabled'">
+              <el-switch v-model="d.row.enabled" @change="(nv ) =>{onChangeEnabled(d.row, nv)}"/>
+            </template>
+            <template v-else-if="column.key === 'serviceType'">
+              <dict-tag :options="dict.type.withdraw_service_type" :value="d.row.serviceType"/>
+            </template>
+            <template v-else-if="column.key === 'serviceRate'">
+              {{d.row.serviceRate | money}} {{withdrawServiceUnit(d.row.serviceType)}}
+            </template>
+            <template v-else-if="column.key === 'costRate'">
+              {{d.row.costRate | money}} %
+            </template>
+            <template v-else-if="column.key === 'picture'">
+              <image-preview :src="d.row.picture" :width="32" :height="32"/>
+            </template>
+            <template v-else-if="column.key === 'minAmount' || column.key === 'maxAmount'">
+              {{d.row[column.key] | money}} 元
+            </template>
+            <template v-else>
+              {{d.row[column.key]}}
+            </template>
+          </template>
+        </el-table-column>
+      </template>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['ss:channelWithdraw:edit']"
+          >修改</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改提现渠道对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <form-col :span="span * 2" label="图片" prop="picture">
+          <image-upload v-model="form.picture" :limit="1"/>
+        </form-col>
+        <form-col :span="span" label="渠道名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入渠道名称" />
+        </form-col>
+        <form-col :span="span" label="账户类型" prop="accountType">
+          <el-select v-model="form.accountType" style="width: 100%">
+            <el-option
+              v-for="dict in dict.type.account_type"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </form-col>
+<!--        <form-col :span="span * 2" label="服务费收取方式" label-width="9em" prop="serviceType">-->
+<!--          <el-radio-group v-model="form.serviceType">-->
+<!--            <el-radio v-for="dict in dict.type.withdraw_service_type" :key="dict.value" :label="dict.value">{{dict.label}}</el-radio>-->
+<!--          </el-radio-group>-->
+<!--        </form-col>-->
+        <form-col :span="span" label="服务费" prop="serviceRate">
+          <el-input v-model.number="form.serviceRate" :min="0" type="number">
+            <template #suffix>
+              {{withdrawServiceUnit(form.withdrawType)}}
+            </template>
+          </el-input>
+        </form-col>
+        <form-col :span="span" label="渠道成本" prop="costRate">
+          <el-input v-model.number="form.costRate"  placeholder="请输入充值成本率" :min="0" type="number">
+            <template #suffix>%</template>
+          </el-input>
+        </form-col>
+        <form-col :span="span" label="单笔最低" prop="minAmount">
+          <el-input v-model.number="form.minAmount"  placeholder="请输入单笔最低提现金额" :min="0" type="number">
+            <template #suffix>元</template>
+          </el-input>
+        </form-col>
+        <form-col :span="span" label="单笔最高" prop="maxAmount">
+          <el-input v-model.number="form.maxAmount"  placeholder="请输入单笔最高提现金额" :min="0" type="number">
+            <template #suffix>元</template>
+          </el-input>
+        </form-col>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listChannelWithdraw, getChannelWithdraw, delChannelWithdraw, addChannelWithdraw, updateChannelWithdraw } from "@/api/system/channelWithdraw";
+import { $showColumns, $withdrawServiceType } from '@/utils/mixins'
+import { updateBill } from '@/api/system/withdraw'
+
+// 默认排序字段
+const defaultSort = {
+  prop: "channelId",
+  order: "descending"
+}
+
+export default {
+  name: "ChannelWithdraw",
+  mixins: [$showColumns, $withdrawServiceType],
+  dicts: ['account_type', 'withdraw_service_type'],
+  data() {
+    return {
+      span: 12,
+      // 字段列表
+      columns: [
+        {key: 'channelId', visible: true, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
+        {key: 'name', visible: true, label: '渠道名称', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'picture', visible: true, label: '图片', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
+        {key: 'enabled', visible: true, label: '是否启用', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'accountType', visible: true, label: '对应账户类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'serviceType', visible: true, label: '服务费收取类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'serviceRate', visible: true, label: '服务费', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'costRate', visible: true, label: '渠道成本', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'minAmount', visible: true, label: '单笔最低', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+        {key: 'maxAmount', visible: true, label: '单笔最高', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
+      ],
+      // 排序方式
+      orderSorts: ['ascending', 'descending', null],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 提现渠道表格数据
+      channelWithdrawList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      defaultSort,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderByColumn: defaultSort.prop,
+        isAsc: defaultSort.order,
+        channelId: null,
+        name: null,
+        accountType: null,
+        serviceType: null,
+        enabled: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          { required: true, message: "渠道名称不能为空", trigger: "blur" }
+        ],
+        accountType: [
+          { required: true, message: "对应账户类型不能为空", trigger: "change" }
+        ],
+        serviceType: [
+          { required: true, message: "服务费收取类型不能为空", trigger: "change" }
+        ],
+        serviceRate: [
+          { required: true, message: "服务费不能为空", trigger: "blur" }
+        ],
+        enabled: [
+          { required: true, message: "是否启用不能为空", trigger: "blur" }
+        ],
+        costRate: [
+          { required: true, message: "渠道成本不允许为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    onChangeEnabled(row, enabled) {
+      updateChannelWithdraw({channelId: row.channelId, enabled: enabled}).catch(() => {
+        row.enabled = !enabled;
+      })
+    },
+    /** 当排序按钮被点击时触发 **/
+    onSortChange(column) {
+      if (column.order == null) {
+        this.queryParams.orderByColumn = defaultSort.prop;
+        this.queryParams.isAsc = defaultSort.order;
+      } else {
+        this.queryParams.orderByColumn = column.prop;
+        this.queryParams.isAsc = column.order;
+      }
+      this.getList();
+    },
+    /** 查询提现渠道列表 */
+    getList() {
+      this.loading = true;
+      listChannelWithdraw(this.queryParams).then(response => {
+        this.channelWithdrawList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        channelId: null,
+        name: null,
+        accountType: null,
+        serviceType: null,
+        serviceRate: null,
+        enabled: null,
+        costRate: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.channelId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加提现渠道";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const channelId = row.channelId || this.ids
+      getChannelWithdraw(channelId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改提现渠道";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.channelId != null) {
+            updateChannelWithdraw(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addChannelWithdraw(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const channelIds = row.channelId || this.ids;
+      this.$modal.confirm('是否确认删除提现渠道编号为"' + channelIds + '"的数据项?').then(function() {
+        return delChannelWithdraw(channelIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('ss/channelWithdraw/export', {
+        ...this.queryParams
+      }, `channelWithdraw_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>

From 8c4897c849e37d19efcc55c3d505ce5374dfc7dc Mon Sep 17 00:00:00 2001
From: 18650502300 <18650502300@163.com>
Date: Fri, 6 Sep 2024 22:35:28 +0800
Subject: [PATCH 2/3] =?UTF-8?q?1.=E6=94=AF=E4=BB=98=E6=B8=A0=E9=81=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/router/index.js              | 14 +++++
 src/views/system/flow/index.vue  | 95 +++++++++++++++++++-------------
 src/views/system/order/index.vue | 83 +++++++++++++++++++++-------
 src/views/user/user/index.vue    |  4 ++
 4 files changed, 140 insertions(+), 56 deletions(-)

diff --git a/src/router/index.js b/src/router/index.js
index 04f3952..0c115a8 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -134,6 +134,20 @@ export const dynamicRoutes = [
       }
     ]
   },
+  {
+    path: '/user/user/userName',
+    component: Layout,
+    hidden: true,
+    permissions: ['user:user:list'],
+    children: [
+      {
+        path: 'index/:userName',
+        component: () => import('@/views/user/user'),
+        name: 'Data',
+        meta: { title: 'APP用户信息', activeMenu: '/system/user' }
+      }
+    ]
+  },
   {
     path: '/system/device/sn',
     component: Layout,
diff --git a/src/views/system/flow/index.vue b/src/views/system/flow/index.vue
index 462814d..2f4f793 100644
--- a/src/views/system/flow/index.vue
+++ b/src/views/system/flow/index.vue
@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="运营区" prop="areaId" v-if="userName == 'admin'">
-        <el-select v-model="queryParams.areaId" filterable placeholder="请选择运营区" clearable>
+        <el-select v-model="queryParams.areaId" filterable placeholder="请选择运营区" style="width: 9em" clearable>
           <el-option
             v-for="item in areaOptions"
             :key="item.areaId"
@@ -15,18 +15,19 @@
         <el-input
           v-model="queryParams.orderNo"
           placeholder="请输入关联订单号"
+          style="width: 12em"
           clearable
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="第三方交易单号" label-width="100" prop="outTradeNo">
-        <el-input
-          v-model="queryParams.outTradeNo"
-          placeholder="请输入第三方交易单号"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
+<!--      <el-form-item label="第三方交易单号" label-width="100" prop="outTradeNo">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.outTradeNo"-->
+<!--          placeholder="请输入第三方交易单号"-->
+<!--          clearable-->
+<!--          @keyup.enter.native="handleQuery"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="收支类型" prop="type">
         <el-select style="width: 100px" v-model="queryParams.type" placeholder="请选择收支类型" clearable>
           <el-option
@@ -47,20 +48,20 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="支付方式" prop="payType">
-        <el-select style="width: 150px" v-model="queryParams.payType" placeholder="请选择业务类型" clearable>
-          <el-option
-            v-for="dict in dict.type.et_pay_type"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
+<!--      <el-form-item label="支付方式" prop="payType">-->
+<!--        <el-select style="width: 150px" v-model="queryParams.payType" placeholder="请选择业务类型" clearable>-->
+<!--          <el-option-->
+<!--            v-for="dict in dict.type.et_pay_type"-->
+<!--            :key="dict.value"-->
+<!--            :label="dict.label"-->
+<!--            :value="dict.value"-->
+<!--          />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
       <el-form-item label="交易时间">
         <el-date-picker
           v-model="dateRange"
-          style="width: 240px"
+          style="width: 220px"
           value-format="yyyy-MM-dd"
           type="daterange"
           range-separator="-"
@@ -69,7 +70,7 @@
         ></el-date-picker>
       </el-form-item>
       <el-form-item label="型号" prop="modelId" >
-        <el-select v-model="queryParams.modelId" filterable placeholder="请选择型号" clearable>
+        <el-select v-model="queryParams.modelId" filterable placeholder="请选择型号" style="width: 8em" clearable>
           <el-option
             v-for="item in modelOptions"
             :key="item.modelId"
@@ -108,8 +109,15 @@
       </el-table-column>
       <el-table-column label="区域" align="center" prop="areaName" />
       <el-table-column label="所属人" align="center" prop="owner" />
-      <el-table-column label="关联订单号" width="180" align="center" prop="orderNo" />
-      <el-table-column label="第三方交易单号" width="180" align="center" prop="outTradeNo" />
+<!--      <el-table-column label="关联订单号" width="180" align="center" prop="orderNo" />-->
+      <el-table-column align="center" label="关联订单号" width="180"  prop="orderNo">
+        <template slot-scope="scope">
+          <router-link :to="'/system/order/index/' + scope.row.orderNo" class="link-type">
+            <span>{{ scope.row.orderNo }}</span>
+          </router-link>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="第三方交易单号" width="180" align="center" prop="outTradeNo" />-->
       <el-table-column label="收支类型" align="center" prop="type">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.et_flow_type" :value="scope.row.type"/>
@@ -120,22 +128,22 @@
           <dict-tag :options="dict.type.et_business_type" :value="scope.row.busType"/>
         </template>
       </el-table-column>
-      <el-table-column label="交易金额" align="center" prop="amount" :formatter="formatAmount"/>
-      <el-table-column label="支付手续费" align="center" prop="handlingCharge" :formatter="formatAmount"/>
-      <el-table-column label="平台服务费" align="center" prop="platformServiceFee" :formatter="formatAmount"/>
-      <el-table-column label="账变金额" align="center" prop="operatorDividend" :formatter="formatAmount"/>
+<!--      <el-table-column label="交易金额" align="center" prop="amount" :formatter="formatAmount"/>-->
+<!--      <el-table-column label="支付手续费" align="center" prop="handlingCharge" :formatter="formatAmount"/>-->
+<!--      <el-table-column label="平台服务费" align="center" prop="platformServiceFee" :formatter="formatAmount"/>-->
+      <el-table-column label="账变金额" align="left" prop="operatorDividend" :formatter="formatAmount2"/>
       <el-table-column label="运营商结余" align="center" prop="operatorBalance" :formatter="formatAmount"/>
 <!--      <el-table-column label="合伙人分账" align="center" prop="partnerDividend" :formatter="formatAmount"/>-->
-      <el-table-column label="支付方式" align="center" prop="payType">
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.et_pay_type" :value="scope.row.payType"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="状态" align="center" prop="status">
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.et_flow_status" :value="scope.row.status"/>
-        </template>
-      </el-table-column>
+<!--      <el-table-column label="支付方式" align="center" prop="payType">-->
+<!--        <template slot-scope="scope">-->
+<!--          <dict-tag :options="dict.type.et_pay_type" :value="scope.row.payType"/>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="状态" align="center" prop="status">-->
+<!--        <template slot-scope="scope">-->
+<!--          <dict-tag :options="dict.type.et_flow_status" :value="scope.row.status"/>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="车型" align="center" prop="model" />
     </el-table>
 
@@ -294,6 +302,19 @@ export default {
       const key = column.property;
       return parseFloat(row[key] || 0).toFixed(2);
     },
+    formatAmount2(row) {
+      if (row.operatorDividend == null) return '';
+      // 将值转换为字符串,检查是否带有 "-"
+      let amount = parseFloat(row.operatorDividend).toFixed(2);
+
+      // 如果带有 "-",则直接返回原值
+      if (amount.startsWith('-')) {
+        return amount;
+      }
+
+      // 如果不带 "-",在前面加上 "+"
+      return `+${amount}`;
+    },
     /** 查询资金流水列表 */
     getList() {
       this.loading = true;
diff --git a/src/views/system/order/index.vue b/src/views/system/order/index.vue
index 456afea..a0104db 100644
--- a/src/views/system/order/index.vue
+++ b/src/views/system/order/index.vue
@@ -87,37 +87,64 @@
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="订单id" align="center" prop="orderId" />-->
       <el-table-column label="区域" align="center" prop="area" />
-      <el-table-column label="订单号" align="center" prop="orderNo" width="200"/>
-      <el-table-column label="用户" align="center" prop="userName" width="100"/>
-      <el-table-column label="设备SN" align="center" prop="sn" >
+      <el-table-column label="订单号" align="center" prop="orderNo" width="120"/>
+      <el-table-column label="用户" align="center" width="100">
         <template slot-scope="scope">
-          <router-link :to="'/system/device/sn/index/' + scope.row.sn" class="link-type">
-            <span>{{ scope.row.sn }}</span>
+          <router-link :to="'/user/user/userName/index/' + scope.row.userName" class="link-type">
+            <span>{{ scope.row.userName }}</span>
           </router-link>
         </template>
       </el-table-column>
-      <el-table-column label="车牌号" align="center" prop="vehicleNum" >
+      <el-table-column label="设备信息" align="center" width="120">
         <template slot-scope="scope">
-          <router-link :to="'/system/device/vehicleNum/index/' + scope.row.vehicleNum" class="link-type">
-            <span>{{ scope.row.vehicleNum }}</span>
-          </router-link>
+          <div>
+            <router-link :to="'/system/device/sn/index/' + scope.row.sn" class="link-type">
+              <span>SN: {{ scope.row.sn }}</span>
+            </router-link>
+            <br />
+            <router-link :to="'/system/device/vehicleNum/index/' + scope.row.vehicleNum" class="link-type">
+              <span>车牌号: {{ scope.row.vehicleNum }}</span>
+            </router-link>
+          </div>
         </template>
       </el-table-column>
+      <!--      <el-table-column label="设备SN" align="center" prop="sn" >-->
+<!--        <template slot-scope="scope">-->
+<!--          <router-link :to="'/system/device/sn/index/' + scope.row.sn" class="link-type">-->
+<!--            <span>{{ scope.row.sn }}</span>-->
+<!--          </router-link>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="车牌号" align="center" prop="vehicleNum" >-->
+<!--        <template slot-scope="scope">-->
+<!--          <router-link :to="'/system/device/vehicleNum/index/' + scope.row.vehicleNum" class="link-type">-->
+<!--            <span>{{ scope.row.vehicleNum }}</span>-->
+<!--          </router-link>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="状态" align="center" prop="status">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.et_order_status" :value="scope.row.status"/>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="90">
+      <el-table-column label="创建时间/开始骑行" align="center" width="135">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="开始骑行" align="center" prop="unlockTime" width="90">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <div>
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />
+            <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          </div>
         </template>
       </el-table-column>
+      <!--      <el-table-column label="创建时间" align="center" prop="createTime" width="90">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="开始骑行" align="center" prop="unlockTime" width="90">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="结束骑行" align="center" prop="returnTime" width="90">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
@@ -134,9 +161,23 @@
         </template>
       </el-table-column>
       <el-table-column label="金额(元)" align="center" prop="totalFee" width="70"/>
-      <el-table-column label="备注" align="center" prop="mark" />
-      <el-table-column label="订单时长" align="center" prop="duration" :formatter="formatDuration"/>
-      <el-table-column label="距离" align="center" prop="distance" :formatter="formatDistance"/>
+<!--      <el-table-column label="备注" align="center" prop="mark" />-->
+<!--      <el-table-column label="交易金额" align="center" prop="amount" :formatter="formatAmount"/>-->
+      <el-table-column label="手续费" align="center" prop="handlingCharge" :formatter="formatAmount"/>
+      <el-table-column label="成本" align="center" prop="handlingCharge" :formatter="formatAmount"/>
+      <el-table-column label="服务费" align="center" prop="platformServiceFee" :formatter="formatAmount"/>
+      <el-table-column label="到账金额" align="center" prop="platformServiceFee" :formatter="formatAmount"/>
+<!--      <el-table-column label="订单时长" align="center" prop="duration" :formatter="formatDuration"/>-->
+<!--      <el-table-column label="距离" align="center" prop="distance" :formatter="formatDistance"/>-->
+      <el-table-column label="订单信息" align="center" width="120">
+        <template slot-scope="scope">
+          <div>
+            <span>时长: {{ formatDuration(scope.row) }}</span><br />
+            <span>距离: {{ formatDistance(scope.row) }}</span>
+          </div>
+        </template>
+      </el-table-column>
+
       <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -560,6 +601,10 @@ export default {
     }
   },
   methods: {
+    formatAmount(row, column) {
+      const key = column.property;
+      return parseFloat(row[key] || 0).toFixed(2);
+    },
     confirmDeduction(){
       // 扣款金额 1. 退剩余押金
       this.$refs["form4"].validate(valid => {
diff --git a/src/views/user/user/index.vue b/src/views/user/user/index.vue
index 686d992..c55cd97 100644
--- a/src/views/user/user/index.vue
+++ b/src/views/user/user/index.vue
@@ -500,6 +500,10 @@ export default {
     };
   },
   created() {
+    const userName = this.$route.params && this.$route.params.userName;
+    if (userName != null) {
+      this.queryParams.userName = userName;
+    }
     this.getList();
     this.getAreaList();
     this.getConfigKey("sys.user.initPassword").then(response => {

From b60cb7c0ae4b94906bd94d356a710cd287e52346 Mon Sep 17 00:00:00 2001
From: 18650502300 <18650502300@163.com>
Date: Mon, 9 Sep 2024 09:25:08 +0800
Subject: [PATCH 3/3] =?UTF-8?q?1.=E8=AE=A2=E5=8D=95=E9=A1=B5=E9=9D=A2?=
 =?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/views/system/order/index.vue | 89 +++++++++++++++++++++-----------
 1 file changed, 58 insertions(+), 31 deletions(-)

diff --git a/src/views/system/order/index.vue b/src/views/system/order/index.vue
index a0104db..eabbfc9 100644
--- a/src/views/system/order/index.vue
+++ b/src/views/system/order/index.vue
@@ -87,14 +87,25 @@
       <el-table-column type="selection" width="55" align="center" />
 <!--      <el-table-column label="订单id" align="center" prop="orderId" />-->
       <el-table-column label="区域" align="center" prop="area" />
-      <el-table-column label="订单号" align="center" prop="orderNo" width="120"/>
-      <el-table-column label="用户" align="center" width="100">
+      <el-table-column label="订单信息" align="center" width="150">
         <template slot-scope="scope">
-          <router-link :to="'/user/user/userName/index/' + scope.row.userName" class="link-type">
-            <span>{{ scope.row.userName }}</span>
-          </router-link>
+          <div>
+            <span>{{ scope.row.orderNo }}</span> <!-- 显示订单号 -->
+            <br> <!-- 换行 -->
+            <router-link :to="'/user/user/userName/index/' + scope.row.userName" class="link-type">
+              <span>{{ scope.row.userName }}</span> <!-- 显示用户名 -->
+            </router-link>
+          </div>
         </template>
       </el-table-column>
+<!--      <el-table-column label="订单号" align="center" prop="orderNo" width="120"/>-->
+<!--      <el-table-column label="用户" align="center" width="100">-->
+<!--        <template slot-scope="scope">-->
+<!--          <router-link :to="'/user/user/userName/index/' + scope.row.userName" class="link-type">-->
+<!--            <span>{{ scope.row.userName }}</span>-->
+<!--          </router-link>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
       <el-table-column label="设备信息" align="center" width="120">
         <template slot-scope="scope">
           <div>
@@ -122,46 +133,62 @@
 <!--          </router-link>-->
 <!--        </template>-->
 <!--      </el-table-column>-->
-      <el-table-column label="状态" align="center" prop="status">
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.et_order_status" :value="scope.row.status"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="创建时间/开始骑行" align="center" width="135">
+      <el-table-column label="状态/支付方式" align="center" width="150">
         <template slot-scope="scope">
           <div>
-            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />
-            <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+            <dict-tag :options="dict.type.et_order_status" :value="scope.row.status" /> <!-- 显示状态 -->
+            <dict-tag :options="dict.type.et_pay_type" :value="scope.row.payType" /> <!-- 显示支付方式 -->
           </div>
         </template>
       </el-table-column>
-      <!--      <el-table-column label="创建时间" align="center" prop="createTime" width="90">-->
+      <el-table-column label="时间详情" header-align="center" align="left" width="200">
+        <template slot-scope="scope">
+          <div>
+            <span>创建时间:{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />
+            <span>开始骑行:{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />
+            <span>结束骑行:{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />
+            <span>支付时间:{{ parseTime(scope.row.payTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          </div>
+        </template>
+      </el-table-column>
+
+      <!--      <el-table-column label="创建时间/开始骑行" align="center" width="135">-->
 <!--        <template slot-scope="scope">-->
-<!--          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--          <div>-->
+<!--            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span><br />-->
+<!--            <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--          </div>-->
 <!--        </template>-->
 <!--      </el-table-column>-->
-<!--      <el-table-column label="开始骑行" align="center" prop="unlockTime" width="90">-->
+<!--      <el-table-column label="结束骑行" align="center" prop="returnTime" width="90">-->
 <!--        <template slot-scope="scope">-->
-<!--          <span>{{ parseTime(scope.row.unlockTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--          <span>{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
 <!--        </template>-->
 <!--      </el-table-column>-->
-      <el-table-column label="结束骑行" align="center" prop="returnTime" width="90">
+<!--      <el-table-column label="支付时间" align="center" prop="payTime" width="90">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.payTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="支付方式" align="center" prop="payType" width="80">-->
+<!--        <template slot-scope="scope">-->
+<!--          <dict-tag :options="dict.type.et_pay_type" :value="scope.row.payType"/>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="金额(元)" align="center" prop="totalFee" width="70"/>-->
+      <el-table-column label="费用详情" header-align="center" align="left" width="200">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.returnTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+          <div>
+            <span style="font-weight: bold;color: red">总:{{ formatFee(scope.row.totalFee) }}</span><br />
+            <span>预约费:{{ formatFee(scope.row.appointmentFee) }}</span><br />
+            <span>骑行费:{{ formatFee(scope.row.ridingFee) }}</span><br />
+            <span>运营区外调度费:{{ formatFee(scope.row.dispatchFee) }}</span><br />
+            <span>停车点外调度费:{{ formatFee(scope.row.manageFee) }}</span>
+          </div>
         </template>
       </el-table-column>
-      <el-table-column label="支付时间" align="center" prop="payTime" width="90">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.payTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="支付方式" align="center" prop="payType" width="80">
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.et_pay_type" :value="scope.row.payType"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="金额(元)" align="center" prop="totalFee" width="70"/>
-<!--      <el-table-column label="备注" align="center" prop="mark" />-->
+
+      <!--      <el-table-column label="备注" align="center" prop="mark" />-->
 <!--      <el-table-column label="交易金额" align="center" prop="amount" :formatter="formatAmount"/>-->
       <el-table-column label="手续费" align="center" prop="handlingCharge" :formatter="formatAmount"/>
       <el-table-column label="成本" align="center" prop="handlingCharge" :formatter="formatAmount"/>