Files
mp-10584/src/views/glt/gltUserTicketLog/index.vue
赵忠林 1d8da2c5be feat(glt): 水票功能模块重构优化
- 将水票模板表单的标题从"编辑水票"改为"规则设置"
- 统一表单数据绑定方式,移除computed计算属性直接使用form绑定
- 调整includeBuyQty字段类型从string改为boolean并更新相关逻辑
- 添加normalizeBoolean函数处理布尔值转换
- 更新商品列表API调用参数从pageSize改为limit
- 优化水票模板表格列配置,调整列标题和对齐方式
- 隐藏部分不必要的表格列如备注、排序、状态等
- 移除水票编辑表单中的多余字段如用户ID、状态等
- 重构搜索组件,使用关键词搜索替换按钮添加功能
- 在表格中新增用户信息展示列,包含头像、昵称、ID和手机号
- 调整水票记录和释放记录的表格列布局和标题
- 移除表格中的操作列和修改时间列
- 修复布尔值在表单提交时的类型转换问题
- 添加表单验证前的数据类型标准化处理
2026-02-04 02:45:24 +08:00

281 lines
7.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="id"
:columns="columns"
:datasource="datasource"
:customRow="customRow"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'nickname'">
<a-space>
<a-avatar :src="record.avatar" />
<div class="flex flex-col">
<div>
<span>{{ record.nickname }}</span>
<span class="text-gray-400">ID{{ record.userId }}</span>
</div>
<div><span class="text-gray-400">{{ record.phone }}</span></div>
</div>
</a-space>
</template>
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="50" />
</template>
<template v-if="column.key === 'status'">
<a-tag v-if="record.status === 0" color="green">显示</a-tag>
<a-tag v-if="record.status === 1" color="red">隐藏</a-tag>
</template>
<template v-if="column.key === 'action'">
<a-space>
<a @click="openEdit(record)">修改</a>
<a-divider type="vertical" />
<a-popconfirm
title="确定要删除此记录吗?"
@confirm="remove(record)"
>
<a class="ele-text-danger">删除</a>
</a-popconfirm>
</a-space>
</template>
</template>
</ele-pro-table>
</a-card>
<!-- 编辑弹窗 -->
<GltUserTicketLogEdit v-model:visible="showEdit" :data="current" @done="reload" />
</a-page-header>
</template>
<script lang="ts" setup>
import { createVNode, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import type { EleProTable } from 'ele-admin-pro';
import { toDateString } from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import {getPageTitle} from '@/utils/common';
import GltUserTicketLogEdit from './components/gltUserTicketLogEdit.vue';
import { pageGltUserTicketLog, removeGltUserTicketLog, removeBatchGltUserTicketLog } from '@/api/glt/gltUserTicketLog';
import type { GltUserTicketLog, GltUserTicketLogParam } from '@/api/glt/gltUserTicketLog/model';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格选中数据
const selection = ref<GltUserTicketLog[]>([]);
// 当前编辑数据
const current = ref<GltUserTicketLog | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
return pageGltUserTicketLog({
...where,
...orders,
page,
limit
});
};
// 完整的列配置(包含所有字段)
const columns = ref<ColumnItem[]>([
{
title: '票号',
dataIndex: 'userTicketId',
key: 'userTicketId',
width: 90
},
{
title: '用户信息',
dataIndex: 'nickname',
key: 'nickname',
width: 280
},
{
title: '名称',
dataIndex: 'templateName',
key: 'templateName',
align: 'center'
},
{
title: '变更类型',
dataIndex: 'changeType',
key: 'changeType',
align: 'center'
},
// {
// title: '可更改',
// dataIndex: 'changeAvailable',
// key: 'changeAvailable',
// width: 120
// },
// {
// title: '更改冻结状态',
// dataIndex: 'changeFrozen',
// key: 'changeFrozen',
// width: 120
// },
// {
// title: '已使用更改',
// dataIndex: 'changeUsed',
// key: 'changeUsed',
// width: 120
// },
// {
// title: '可用后',
// dataIndex: 'availableAfter',
// key: 'availableAfter',
// width: 120
// },
// {
// title: '冻结后',
// dataIndex: 'frozenAfter',
// key: 'frozenAfter',
// width: 120
// },
// {
// title: '使用后',
// dataIndex: 'usedAfter',
// key: 'usedAfter',
// width: 120
// },
{
title: '核销时间',
dataIndex: 'createTime',
key: 'createTime',
width: 200,
align: 'center',
sorter: true,
ellipsis: true,
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
},
// {
// title: '操作',
// key: 'action',
// width: 180,
// fixed: 'right',
// align: 'center',
// hideInSetting: true
// }
]);
/* 搜索 */
const reload = (where?: GltUserTicketLogParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
/* 打开编辑弹窗 */
const openEdit = (row?: GltUserTicketLog) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: GltUserTicketLog) => {
const hide = message.loading('请求中..', 0);
removeGltUserTicketLog(row.id)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchGltUserTicketLog(selection.value.map((d) => d.id))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: GltUserTicketLog) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
</script>
<script lang="ts">
export default {
name: 'GltUserTicketLog'
};
</script>
<style lang="less" scoped></style>