Files
OpticalSystem/admin-front/src/views/jysystem/feeSettlement/index.vue
一休哥哥6666 e186d45bec Initial commit
2026-06-14 14:39:51 +08:00

350 lines
13 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>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="应收应付" prop="settlementType">
<el-select v-model="queryParams.settlementType" placeholder="请选择" clearable>
<el-option
v-for="dict in dict.type.jy_settlement_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="租户" prop="tenantId">
<el-select v-model="queryParams.tenantId" placeholder="请选择租户" clearable filterable>
<el-option v-for="item in tenantOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="结算年月" prop="settleYearMonth">
<el-date-picker
v-model="queryParams.settleYearMonth"
type="month"
value-format="yyyy-MM"
placeholder="选择年月"
clearable
/>
</el-form-item>
<el-form-item label="是否结算" prop="settleStatus">
<el-select v-model="queryParams.settleStatus" placeholder="请选择" clearable>
<el-option
v-for="dict in dict.type.jy_purchase_settle_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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="primary"
plain
icon="el-icon-download"
size="mini"
:disabled="multiple"
@click="handleBatchExportPdf"
v-hasPermi="['jysystem:feeSettlement:exportPdf']"
>批量导出PDF</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-download"
size="mini"
:disabled="multiple"
@click="handleBatchExportExcel"
v-hasPermi="['jysystem:feeSettlement:exportExcel']"
>批量导出Excel</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['jysystem:feeSettlement:remove']"
>删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="settlementList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="结算单号" align="center" prop="settlementNo" width="200" show-overflow-tooltip />
<el-table-column label="应收应付" align="center" prop="settlementType" width="90">
<template slot-scope="scope">
<dict-tag :options="dict.type.jy_settlement_type" :value="scope.row.settlementType" />
</template>
</el-table-column>
<el-table-column label="租户" align="center" prop="tenantName" min-width="140" show-overflow-tooltip />
<el-table-column label="结算年月" align="center" prop="settleYearMonth" width="90" />
<el-table-column label="制单日期" align="center" prop="settleDate" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.settleDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="合计金额" align="center" prop="totalAmount" width="100">
<template slot-scope="scope">
<span>{{ formatAmount(scope.row.totalAmount) }}</span>
</template>
</el-table-column>
<el-table-column label="是否已结算" align="center" prop="settleStatus" width="90">
<template slot-scope="scope">
<dict-tag :options="dict.type.jy_purchase_settle_status" :value="scope.row.settleStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="320" fixed="right">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleDetail(scope.row)"
v-hasPermi="['jysystem:feeSettlement:query']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-download"
@click="handleExportPdf(scope.row)"
v-hasPermi="['jysystem:feeSettlement:exportPdf']"
>导出PDF</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-download"
@click="handleExportExcel(scope.row)"
v-hasPermi="['jysystem:feeSettlement:exportExcel']"
>导出Excel</el-button>
<el-button
v-if="scope.row.settleStatus === '0'"
size="mini"
type="text"
icon="el-icon-check"
@click="handleSettle(scope.row)"
v-hasPermi="['jysystem:feeSettlement:settle']"
>已结算</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="费用结算单详情" :visible.sync="detailOpen" width="960px" append-to-body>
<el-descriptions v-if="detail" :column="3" border size="small" class="mb16">
<el-descriptions-item label="结算单号">{{ detail.settlementNo }}</el-descriptions-item>
<el-descriptions-item label="类型">
<dict-tag :options="dict.type.jy_settlement_type" :value="detail.settlementType" />
</el-descriptions-item>
<el-descriptions-item label="租户">{{ detail.tenantName || '-' }}</el-descriptions-item>
<el-descriptions-item label="结算年月">{{ detail.settleYearMonth }}</el-descriptions-item>
<el-descriptions-item label="制单日期">{{ parseTime(detail.settleDate, '{y}-{m}-{d}') }}</el-descriptions-item>
<el-descriptions-item label="合计">{{ formatAmount(detail.totalAmount) }}</el-descriptions-item>
</el-descriptions>
<el-table v-if="detail && detail.itemList" :data="detail.itemList" size="small" border>
<el-table-column type="expand" width="48">
<template slot-scope="props">
<el-table :data="props.row.logisticsList || []" size="mini" border>
<el-table-column label="状态日志ID" prop="statusLogId" width="140" align="center" />
<el-table-column label="物流费用" prop="logisticsFee" width="120" align="center">
<template slot-scope="scope">{{ formatAmount(scope.row.logisticsFee) }}</template>
</el-table-column>
</el-table>
<div v-if="!(props.row.logisticsList && props.row.logisticsList.length)" class="detail-empty-tip">无物流明细</div>
</template>
</el-table-column>
<el-table-column label="订单号" prop="orderNo" min-width="160" show-overflow-tooltip />
<el-table-column label="镜片价格" prop="lensPrice" width="100" align="center">
<template slot-scope="scope">{{ formatAmount(scope.row.lensPrice) }}</template>
</el-table-column>
<el-table-column label="渐进多焦点价格" prop="progressivePrice" width="130" align="center">
<template slot-scope="scope">{{ formatAmount(scope.row.progressivePrice) }}</template>
</el-table-column>
<el-table-column label="物流价格" prop="logisticsPrice" width="130" align="center">
<template slot-scope="scope">
{{ formatAmount(scope.row.logisticsPrice) }}
<span v-if="scope.row.logisticsCount">{{ scope.row.logisticsCount }}</span>
</template>
</el-table-column>
<el-table-column label="合计" prop="totalAmount" width="100" align="center">
<template slot-scope="scope">{{ formatAmount(scope.row.totalAmount) }}</template>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button
v-if="detail"
type="primary"
icon="el-icon-download"
@click="handleExportPdf(detail)"
v-hasPermi="['jysystem:feeSettlement:exportPdf']"
>导出PDF</el-button>
<el-button
v-if="detail"
type="success"
icon="el-icon-download"
@click="handleExportExcel(detail)"
v-hasPermi="['jysystem:feeSettlement:exportExcel']"
>导出Excel</el-button>
<el-button @click="detailOpen = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listFeeSettlement, getFeeSettlement, delFeeSettlement, settleFeeSettlement } from '@/api/jysystem/feeSettlement'
import { listTenant } from '@/api/jysystem/tenant'
export default {
name: 'FeeSettlement',
dicts: ['jy_settlement_type', 'jy_purchase_settle_status'],
data() {
return {
loading: false,
showSearch: true,
ids: [],
multiple: true,
total: 0,
settlementList: [],
tenantOptions: [],
selectedRows: [],
detailOpen: false,
detail: null,
queryParams: {
pageNum: 1,
pageSize: 10,
settlementType: undefined,
tenantId: undefined,
settleYearMonth: undefined,
settleStatus: undefined
}
}
},
created() {
this.getList()
this.loadTenants()
},
methods: {
getList() {
this.loading = true
listFeeSettlement(this.queryParams).then(response => {
this.settlementList = response.rows
this.total = response.total
this.loading = false
})
},
loadTenants() {
listTenant({ pageNum: 1, pageSize: 1000 }).then(response => {
this.tenantOptions = response.rows || []
})
},
formatAmount(value) {
if (value == null || value === '') return '-'
const num = Number(value)
return Number.isNaN(num) ? value : num.toFixed(2)
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.selectedRows = selection
this.multiple = !selection.length
},
handleDetail(row) {
getFeeSettlement(row.id).then(response => {
this.detail = response.data
this.detailOpen = true
})
},
handleSettle(row) {
this.$modal.confirm(`确认将结算单【${row.settlementNo}】标记为已结算?`).then(() => {
return settleFeeSettlement(row.id)
}).then(() => {
this.getList()
this.$modal.msgSuccess('操作成功')
}).catch(() => {})
},
handleExportPdf(row) {
if (!row || !row.id) {
return
}
const fileName = (row.settlementNo || 'fee-settlement') + '.pdf'
this.download('jysystem/feeSettlement/exportPdf/' + row.id, {}, fileName)
},
handleExportExcel(row) {
if (!row || !row.id) {
return
}
const fileName = (row.settlementNo || 'fee-settlement') + '.xlsx'
this.download('jysystem/feeSettlement/exportExcel/' + row.id, {}, fileName)
},
handleBatchExportPdf() {
if (!this.ids.length) {
this.$modal.msgWarning('请先选择要导出的结算单')
return
}
const fileName = this.buildBatchFileName('pdf')
this.download('jysystem/feeSettlement/exportPdf/batch/' + this.ids.join(','), {}, fileName)
},
handleBatchExportExcel() {
if (!this.ids.length) {
this.$modal.msgWarning('请先选择要导出的结算单')
return
}
const fileName = this.buildBatchFileName('excel')
this.download('jysystem/feeSettlement/exportExcel/batch/' + this.ids.join(','), {}, fileName)
},
buildBatchFileName(type) {
if (this.ids.length === 1) {
const row = this.selectedRows[0] || {}
const baseName = row.settlementNo || 'fee-settlement'
return type === 'pdf' ? `${baseName}.pdf` : `${baseName}.xlsx`
}
return `fee-settlements-${new Date().getTime()}.zip`
},
handleDelete(row) {
const ids = row && row.id ? row.id : this.ids
this.$modal.confirm('删除结算单将恢复关联订单物流费用的未结算状态,是否继续?').then(() => {
return delFeeSettlement(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {})
}
}
}
</script>
<style scoped>
.mb16 {
margin-bottom: 16px;
}
.detail-empty-tip {
padding: 8px 0;
color: #909399;
font-size: 12px;
}
</style>