<template>
<a-card :bordered="false">
<BasicTable @register="registerTable" :expandedRowKeys="expandedRowKeys" :rowSelection="rowSelection" @expand="handleExpand">
<template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
</template>
<template #expandedRowRender>
<BasicTable bordered size="middle" rowKey="id" :canResize="false" :columns="innerColumns" :dataSource="innerData" :pagination="false">
</BasicTable>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
<JVxeTableModal @register="registerModal" @success="reload()"></JVxeTableModal>
</a-card>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import JVxeTableModal from '/@/views/demo/vextable/jvxetable/JVxeTableModal.vue';
//接口url
const url = {
list: '/test/order/orderList',
delete: '/test/order/delete',
deleteBatch: '/test/order/deleteBatch',
customerListByMainId: '/test/order/listOrderCustomerByMainId',
};
// 展开key
const expandedRowKeys = ref<any[]>([]);
// 选择key
const checkedKeys = ref<any[]>([]);
// 子表数据
const innerData = ref<any[]>([]);
// 主表表头
const columns = [
{
title: '订单号',
align: 'center',
dataIndex: 'orderCode',
width: 100,
},
{
title: '订单类型',
align: 'center',
dataIndex: 'ctype',
width: 100,
customRender: ({ text }) => {
let re = '';
if (text === '1') {
re = '国内订单';
} else if (text === '2') {
re = '国际订单';
}
return re;
},
},
{
title: '订单日期',
align: 'center',
width: 100,
dataIndex: 'orderDate',
},
{
title: '订单金额',
align: 'center',
dataIndex: 'orderMoney',
width: 100,
},
{
title: '订单备注',
align: 'center',
dataIndex: 'content',
width: 100,
},
];
// 子表表头
const innerColumns = [
{
title: '客户名',
align: 'center',
width: 100,
dataIndex: 'name',
key: 'name',
},
{
title: '性别',
align: 'center',
dataIndex: 'sex',
customRender: function (text) {
//console.log(typeof text )
//console.log(text)
if (text.value == '1') {
return '男';
} else if (text.value == '2') {
return '女';
} else {
return text;
}
},
},
{
title: '身份证号码',
align: 'center',
dataIndex: 'idcard',
},
{
title: '电话',
dataIndex: 'telphone',
align: 'center',
},
];
const list = (params) => defHttp.get({ url: url.list, params });
const [registerModal, { openModal }] = useModal();
const [registerTable, { reload }] = useTable({
columns,
api: list,
rowKey: 'id',
striped: true,
useSearchForm: false,
showTableSetting: true,
clickToRowSelect: false,
bordered: true,
actionColumn: {
width: 110,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
},
});
/**
* 选择列配置
*/
const rowSelection = {
type: 'checkbox',
columnWidth: 30,
selectedRowKeys: checkedKeys,
onChange: onSelectChange,
};
/**
* 选择事件
*/
function onSelectChange(selectedRowKeys: (string | number)[]) {
checkedKeys.value = selectedRowKeys;
}
/**
* 展开事件
* */
function handleExpand(expanded, record) {
expandedRowKeys.value = [];
innerData.value = [];
if (expanded === true) {
expandedRowKeys.value.push(record.id);
defHttp.get({ url: url.customerListByMainId, params: { orderId: record.id } }, { isTransformResponse: false }).then((res) => {
if (res.success) {
innerData.value = res.result.records;
}
});
}
}
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
});
}
/**
* 编辑事件
*/
function handleEdit(record) {
openModal(true, {
record,
isUpdate: true,
});
}
/**
* 删除事件
*/
function handleDelete(record) {
defHttp.delete({ url: url.delete, data: { id: record.id } }, { joinParamsToUrl: true }).then(() => {
reload();
});
}
/**
* 操作栏
*/
function getTableAction(record) {
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
];
}
</script>
<style scoped>
.ant-card-body .table-operator {
margin-bottom: 18px;
}
.ant-table-tbody .ant-table-row td {
padding-top: 15px;
padding-bottom: 15px;
}
.anty-row-operator button {
margin: 0 5px;
}
.ant-btn-danger {
background-color: #ffffff;
}
.ant-modal-cust-warp {
height: 100%;
}
.ant-modal-cust-warp .ant-modal-body {
height: calc(100% - 110px) !important;
overflow-y: auto;
}
.ant-modal-cust-warp .ant-modal-content {
height: 90% !important;
overflow-y: hidden;
}
</style>