Files
mp-10584/src/views/glt/gltUserTicket/index.vue
赵忠林 2e6004e2ad fix(glt): 修复票券模板编辑表单布局和字段映射问题
- 调整弹窗宽度从固定900px改为70%响应式宽度
- 修复表单项标签列布局配置
- 恢复购买数量是否算赠送开关组件并更新标签文字
- 交换释放期数和每期释放数量字段的标签、占位符和模型绑定
- 修复用户票券列表中购买数量字段的数据映射关系
2026-02-09 21:19:09 +08:00

301 lines
7.6 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"
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 === 'orderGoodsQty'">
{{ record.orderGoodsQty }}
</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>
<!-- 编辑弹窗 -->
<GltUserTicketEdit 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 GltUserTicketEdit from './components/gltUserTicketEdit.vue';
import { pageGltUserTicket, removeGltUserTicket, removeBatchGltUserTicket } from '@/api/glt/gltUserTicket';
import type { GltUserTicket, GltUserTicketParam } from '@/api/glt/gltUserTicket/model';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 表格选中数据
const selection = ref<GltUserTicket[]>([]);
// 当前编辑数据
const current = ref<GltUserTicket | 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 pageGltUserTicket({
...where,
...orders,
page,
limit
});
};
// 完整的列配置(包含所有字段)
const columns = ref<ColumnItem[]>([
{
title: '票号',
dataIndex: 'id',
key: 'id',
width: 90
},
{
title: '用户信息',
dataIndex: 'nickname',
key: 'nickname',
width: 280
},
{
title: '名称',
dataIndex: 'templateName',
key: 'templateName',
align: 'center'
},
{
title: '订单号',
dataIndex: 'orderNo',
key: 'orderNo',
align: 'center'
},
{
title: '金额',
dataIndex: 'payPrice',
key: 'payPrice',
align: 'center',
customRender: ({ text }) => `${text.toFixed(2)}`
},
{
title: '购买数量',
dataIndex: 'orderGoodsQty',
key: 'orderGoodsQty',
align: 'center'
},
{
title: '总数量',
dataIndex: 'totalQty',
key: 'totalQty',
align: 'center'
},
{
title: '可配送',
dataIndex: 'availableQty',
key: 'availableQty',
align: 'center'
},
{
title: '待赠送',
dataIndex: 'frozenQty',
key: 'frozenQty',
align: 'center'
},
{
title: '已使用',
dataIndex: 'usedQty',
key: 'usedQty',
align: 'center'
},
{
title: '已释放',
dataIndex: 'releasedQty',
key: 'releasedQty',
align: 'center'
},
// {
// title: '排序',
// dataIndex: 'sortNumber',
// key: 'sortNumber',
// },
// {
// title: '状态',
// dataIndex: 'status',
// key: 'status',
// align: 'center'
// },
{
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?: GltUserTicketParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
/* 打开编辑弹窗 */
const openEdit = (row?: GltUserTicket) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: GltUserTicket) => {
const hide = message.loading('请求中..', 0);
removeGltUserTicket(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);
removeBatchGltUserTicket(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: GltUserTicket) => {
// return {
// // 行点击事件
// onClick: () => {
// // console.log(record);
// },
// // 行双击事件
// onDblclick: () => {
// openEdit(record);
// }
// };
// };
query();
</script>
<script lang="ts">
export default {
name: 'GltUserTicket'
};
</script>
<style lang="less" scoped></style>