提交 ea405e02 authored 作者: 何忠建's avatar 何忠建

生活缴费导入导出

上级 108db7c6
...@@ -339,13 +339,13 @@ export default { ...@@ -339,13 +339,13 @@ export default {
return return
} }
if (typeof window.navigator.msSaveBlob !== 'undefined') { if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xlsx') window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
} else { } else {
let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' })) let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
let link = document.createElement('a') let link = document.createElement('a')
link.style.display = 'none' link.style.display = 'none'
link.href = url link.href = url
link.setAttribute('download', fileName + '.xlsx') link.setAttribute('download', fileName + '.xls')
document.body.appendChild(link) document.body.appendChild(link)
link.click() link.click()
document.body.removeChild(link) //下载完成移除元素 document.body.removeChild(link) //下载完成移除元素
......
...@@ -29,11 +29,16 @@ ...@@ -29,11 +29,16 @@
<!-- 操作按钮区域 --> <!-- 操作按钮区域 -->
<div class="table-operator"> <div class="table-operator">
<a-button @click="onMeterReading" type="primary" icon="plus">抄表</a-button> <a-button @click="onMeterReading" type="primary" icon="plus">抄表</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('t_property_settled')">导出</a-button> <a-button icon="download" @click="downloadExportXls()">模板下载</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
:action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
<a-button type="primary" icon="download" @click="handleExportXls('生活缴费')">导出</a-button>
<a-dropdown v-if="selectedRowKeys.length > 0"> <a-dropdown v-if="selectedRowKeys.length > 0">
<a-menu slot="overlay"> <a-menu slot="overlay">
<a-menu-item key="1" @click="onBatchCallpay"><a-icon type="message"/>催缴</a-menu-item> <a-menu-item key="1" @click="onBatchCallpay"><a-icon type="message" />催缴</a-menu-item>
<a-menu-item key="2" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> <a-menu-item key="2" @click="batchDel"><a-icon type="delete" />删除</a-menu-item>
</a-menu> </a-menu>
<a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
</a-dropdown> </a-dropdown>
...@@ -47,24 +52,12 @@ ...@@ -47,24 +52,12 @@
<a style="margin-left: 24px" v-if="selectedRowKeys.length > 0" @click="onClearSelected">清空</a> <a style="margin-left: 24px" v-if="selectedRowKeys.length > 0" @click="onClearSelected">清空</a>
</div> </div>
<a-table <a-table ref="table" size="middle" :scroll="{ x: 1500}" bordered rowKey="id" :columns="columns"
ref="table" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{
size="middle"
:scroll="{ x: 1500, y: 300 }"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{
selectedRowKeys: selectedRowKeys, selectedRowKeys: selectedRowKeys,
onChange: onSelectChange, onChange: onSelectChange,
getCheckboxProps: onCheckboxProps getCheckboxProps: onCheckboxProps
}" }" class="j-table-force-nowrap" @change="handleTableChange">
class="j-table-force-nowrap"
@change="handleTableChange"
>
<span slot="ownerId" slot-scope="text, record"> <span slot="ownerId" slot-scope="text, record">
<span>{{record.ownerName}}{{record.ownerPhone}}</span> <span>{{record.ownerName}}{{record.ownerPhone}}</span>
</span> </span>
...@@ -77,9 +70,9 @@ ...@@ -77,9 +70,9 @@
<span slot="action" slot-scope="text, record"> <span slot="action" slot-scope="text, record">
<a @click="onDetail(record.id)">查看</a> <a @click="onDetail(record.id)">查看</a>
<template v-if="record.paymentStatus === 'unPaid'"> <template v-if="record.paymentStatus === 'unPaid'">
<a-divider type="vertical"/> <a-divider type="vertical" />
<a @click="onCallPay(record.id)">催缴</a> <a @click="onCallPay(record.id)">催缴</a>
<a-divider type="vertical"/> <a-divider type="vertical" />
<a @click="handleDelete(record)">删除</a> <a @click="handleDelete(record)">删除</a>
</template> </template>
</span> </span>
...@@ -95,225 +88,258 @@ ...@@ -95,225 +88,258 @@
</template> </template>
<script> <script>
import { getBuildingListApi, getUnitListApi, getRoomListApi, callPayMentApi } from '@/api/api' import { getBuildingListApi, getUnitListApi, getRoomListApi, callPayMentApi } from '@/api/api'
import { JeecgListMixin } from '@/mixins/JeecgListMixin' import { downFile } from '@/api/manage'
import NoticeModal from './modules/NoticeModal' import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import {PAYMENT_STATUS, RELATION_SHIP, filterDictTextByStatic} from '@/assets/static.js' import NoticeModal from './modules/NoticeModal'
import { PAYMENT_STATUS, RELATION_SHIP, filterDictTextByStatic } from '@/assets/static.js'
const columns = [ const columns = [
{ {
title: '收费类型', title: '收费类型',
dataIndex: 'chargeTypeName', dataIndex: 'chargeTypeName',
key: 'chargeTypeName', key: 'chargeTypeName',
width: 120, width: 120,
align: 'center' align: 'center',
},
{
title: '收费项目',
dataIndex: 'chargeItem',
key: 'chargeItem',
width: 120,
align: 'center',
},
{
title: '业主',
dataIndex: 'ownerId',
key: 'ownerId',
width: 160,
scopedSlots: { customRender: 'ownerId' },
align: 'center',
},
{
title: '与业主关系',
dataIndex: 'relationShip',
key: 'relationShip',
width: 120,
align: 'center',
customRender: function (text) {
return filterDictTextByStatic(RELATION_SHIP, text)
}, },
{ },
title: '收费项目', {
dataIndex: 'chargeItem', title: '住户',
key: 'chargeItem', dataIndex: 'residentPhone',
width: 120, key: 'residentPhone',
align: 'center' width: 160,
scopedSlots: { customRender: 'residentPhone' },
align: 'center',
},
{
title: '房屋编号',
dataIndex: 'roomId',
scopedSlots: { customRender: 'roomId' },
key: 'roomId',
width: 140,
align: 'center',
},
{
title: '金额(元)',
dataIndex: 'totalAmount',
key: 'totalAmount',
width: 120,
align: 'center',
},
{
title: '本期读表时间',
dataIndex: 'meterReadingTime',
key: 'meterReadingTime',
width: 150,
align: 'center',
},
{
title: '缴费状态',
dataIndex: 'paymentStatus',
key: 'paymentStatus',
width: 120,
align: 'center',
customRender: function (text) {
return filterDictTextByStatic(PAYMENT_STATUS, text)
}, },
{ },
title: '业主', {
dataIndex: 'ownerId', title: '缴费单号',
key: 'ownerId', dataIndex: 'paymentNum',
width: 160, key: 'paymentNum',
scopedSlots: { customRender: 'ownerId' }, width: 120,
align: 'center' align: 'center',
},
{
title: '缴费日期',
dataIndex: 'paymentTime',
key: 'paymentTime',
width: 150,
align: 'center',
},
{
title: '创建日期',
dataIndex: 'createTime',
key: 'createTime',
width: 150,
align: 'center',
},
{
title: '操作',
dataIndex: 'action',
scopedSlots: { customRender: 'action' },
align: 'center',
width: 150,
fixed: 'right',
},
]
export default {
name: 'PermissionListAsync',
mixins: [JeecgListMixin],
components: { NoticeModal },
data() {
return {
// 表头
columns: columns,
url: {
list: '/property-community/payment/communityPayment/list',
delete: '/property-community/payment/communityPayment/delete',
deleteBatch: '/property-community/payment/communityPayment/deleteBatch',
exportXlsUrl: '/property-community/payment/communityPayment/exportXls',
importExcelUrl: 'property-community/payment/communityPayment/importExcel',
downloadExcelUrl: '/property-community/payment/communityPayment/downloadPaymentTemplate',
},
treeData: [],
}
},
created() {
this.getBuildingList()
// this.initDictData()
},
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
}, },
{ },
title: '与业主关系', methods: {
dataIndex: 'relationShip', onCheckboxProps(record) {
key: 'relationShip', let props = {
width: 120, disabled: record.paymentStatus === 'paid',
align: 'center', name: record.chargeTypeName,
customRender: function(text) {
return filterDictTextByStatic(RELATION_SHIP, text);
} }
return props
}, },
{ async getBuildingList() {
title: '住户', let { result } = await getBuildingListApi()
dataIndex: 'residentPhone', this.treeData = result.map((item) => {
key: 'residentPhone', return {
width: 160, title: item.buildingName,
scopedSlots: { customRender: 'residentPhone' }, key: item.id,
align: 'center' }
}, })
{
title: '房屋编号',
dataIndex: 'roomId',
scopedSlots: { customRender: 'roomId' },
key: 'roomId',
width: 140,
align: 'center'
},
{
title: '金额(元)',
dataIndex: 'totalAmount',
key: 'totalAmount',
width: 120,
align: 'center'
},
{
title: '本期读表时间',
dataIndex: 'meterReadingTime',
key: 'meterReadingTime',
width: 150,
align: 'center'
},
{
title: '缴费状态',
dataIndex: 'paymentStatus',
key: 'paymentStatus',
width: 120,
align: 'center',
customRender: function(text) {
return filterDictTextByStatic(PAYMENT_STATUS, text);
}
}, },
{ onClickTree(value, optios) {
title: '缴费单号', console.log(value, optios)
dataIndex: 'paymentNum',
key: 'paymentNum',
width: 120,
align: 'center'
}, },
{ onLoadData(treeNode) {
title: '缴费日期', return new Promise(async (resolve) => {
dataIndex: 'paymentTime', if (treeNode.dataRef.children) {
key: 'paymentTime', resolve()
width: 150, return
align: 'center' }
if (treeNode.pos.split('-').length === 2) {
let { result } = await getUnitListApi({ id: treeNode.eventKey })
treeNode.dataRef.children = result.map((item) => {
return {
title: item.unitName,
key: item.id,
}
})
this.treeData = [...this.treeData]
resolve()
} else {
let { result } = await getRoomListApi({ id: treeNode.eventKey })
treeNode.dataRef.children = result.map((item) => {
return {
title: item.roomNum,
key: item.id,
isLeaf: true,
}
})
this.treeData = [...this.treeData]
resolve()
}
})
}, },
{ onMeterReading() {
title: '创建日期', this.$refs.modalForm.add()
dataIndex: 'createTime', this.$refs.modalForm.title = '抄表'
key: 'createTime', this.$refs.modalForm.disableSubmit = false
width: 150,
align: 'center'
}, },
{ onBatchCallpay() {
title: '操作', // console.log(this.selectionRows)
dataIndex: 'action', let chooseIds = this.selectedRowKeys.join(',')
scopedSlots: { customRender: 'action' }, this.onCallPay(chooseIds)
align: 'center',
width: 150,
fixed: 'right'
}
]
export default {
name: 'PermissionListAsync',
mixins: [JeecgListMixin],
components: {NoticeModal},
data() {
return {
// 表头
columns: columns,
url: {
list: "/property-community/payment/communityPayment/list",
delete: '/property-community/payment/communityPayment/delete',
deleteBatch: '/property-community/payment/communityPayment/deleteBatch'
},
treeData: []
}
}, },
created () { onDetail(id) {
this.getBuildingList() this.$router.push({
// this.initDictData() path: '/property/living-detail?id=' + id,
})
}, },
methods: { onCallPay(chooseIds) {
onCheckboxProps(record) { let that = this
let props = { this.$confirm({
disabled: record.paymentStatus === 'paid', title: '催缴账单',
name: record.chargeTypeName content: '是否催缴当前选择的账单发送给对应业主?',
} onOk: function () {
return props that.loading = true
}, callPayMentApi({ chooseIds })
async getBuildingList() { .then((res) => {
let {result} = await getBuildingListApi()
this.treeData = result.map(item=> {
return {
title: item.buildingName,
key: item.id
}
})
},
onClickTree(value, optios) {
console.log(value, optios)
},
onLoadData(treeNode) {
return new Promise(async resolve => {
if (treeNode.dataRef.children) {
resolve();
return;
}
if(treeNode.pos.split('-').length === 2) {
let {result} = await getUnitListApi({id: treeNode.eventKey})
treeNode.dataRef.children = result.map(item=> {
return {
title: item.unitName,
key: item.id
}
})
this.treeData = [...this.treeData];
resolve();
} else {
let {result} = await getRoomListApi({id: treeNode.eventKey})
treeNode.dataRef.children = result.map(item=> {
return {
title: item.roomNum,
key: item.id,
isLeaf: true
}
})
this.treeData = [...this.treeData];
resolve();
}
});
},
onMeterReading() {
this.$refs.modalForm.add();
this.$refs.modalForm.title = "抄表";
this.$refs.modalForm.disableSubmit = false;
},
onBatchCallpay() {
// console.log(this.selectionRows)
let chooseIds = this.selectedRowKeys.join(',')
this.onCallPay(chooseIds)
},
onDetail(id) {
this.$router.push({
path: '/property/living-detail?id=' + id
});
},
onCallPay(chooseIds) {
let that = this
this.$confirm({
title: "催缴账单",
content: "是否催缴当前选择的账单发送给对应业主?",
onOk: function () {
that.loading = true;
callPayMentApi({chooseIds}).then((res) => {
if (res.success) { if (res.success) {
//重新计算分页问题 //重新计算分页问题
that.$message.success(res.message); that.$message.success(res.message)
// that.searchQuery(); // that.searchQuery();
that.onClearSelected(); that.onClearSelected()
} else { } else {
that.$message.warning(res.message); that.$message.warning(res.message)
} }
}).finally(() => { })
that.loading = false; .finally(() => {
}); that.loading = false
} })
}); },
} })
} },
} downloadExportXls() {
let fileName = '生活缴费模板'
downFile(this.url.downloadExcelUrl, '').then((data) => {
if (!data) {
this.$message.warning('文件下载失败')
return
}
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
} else {
let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', fileName + '.xls')
document.body.appendChild(link)
link.click()
document.body.removeChild(link) //下载完成移除元素
window.URL.revokeObjectURL(url) //释放掉blob对象
}
})
},
},
}
</script> </script>
<style scoped> <style scoped>
@import '~@assets/less/common.less'; @import '~@assets/less/common.less';
</style> </style>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论