From 9068135f2613723346c5500c1c2ceb8fb89010ca Mon Sep 17 00:00:00 2001 From: zengqiyang <492393100@qq.com> Date: Wed, 23 Apr 2025 09:10:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E8=B4=A2=E5=8A=A1=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=A1=B5=E9=9D=A2=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc/.env.development | 2 +- pc/src/api/asset/label.js | 2 +- pc/src/api/finance.js | 109 + pc/src/router/modules/finance.js | 6 + pc/src/utils/request.js | 4 +- pc/src/views/asset/classification/index.vue | 19 +- .../inventory/components/AssetDetail.vue | 7 +- .../asset/inventory/components/AssetForm.vue | 1 - .../inventory/components/AssetLabelPrint.vue | 3 +- pc/src/views/asset/inventory/index.vue | 17 +- pc/src/views/asset/labelPage/index.vue | 7 +- pc/src/views/asset/location/index.vue | 21 +- .../finance/billList/components/AddBill.vue | 758 +++++++ .../billList/components/BillDetail.vue | 256 +++ pc/src/views/finance/billList/index.vue | 409 ++++ pc/src/views/finance/chargeStandard/index.vue | 1805 +++++++++++++++-- pc/src/views/finance/feeType/index.vue | 20 +- .../finance/receiptSetting/PayeeInfo.vue | 58 +- pc/vue.config.js | 18 +- 19 files changed, 3318 insertions(+), 204 deletions(-) create mode 100644 pc/src/views/finance/billList/components/AddBill.vue create mode 100644 pc/src/views/finance/billList/components/BillDetail.vue create mode 100644 pc/src/views/finance/billList/index.vue diff --git a/pc/.env.development b/pc/.env.development index 6a0355f..fb777cf 100644 --- a/pc/.env.development +++ b/pc/.env.development @@ -1,4 +1,4 @@ NODE_ENV = 'development' # 开发环境API地址 -VUE_APP_BASE_API = http://192.168.137.3:8080/api \ No newline at end of file +VUE_APP_BASE_API = http://192.168.137.3:8080/api/api \ No newline at end of file diff --git a/pc/src/api/asset/label.js b/pc/src/api/asset/label.js index 65fd535..25d257b 100644 --- a/pc/src/api/asset/label.js +++ b/pc/src/api/asset/label.js @@ -68,7 +68,7 @@ export function getLabelFields() { ]; return Promise.resolve({ - code: '000000', + code: '0000000000000000', msg: 'success', data: fieldData }); diff --git a/pc/src/api/finance.js b/pc/src/api/finance.js index 877f7ec..11a2f25 100644 --- a/pc/src/api/finance.js +++ b/pc/src/api/finance.js @@ -337,4 +337,113 @@ export function getFeeTypeTree(params) { method: 'get', params }) +} + +// 预览账单 +export function previewBill(data) { + return request({ + url: '/finance/charging-standard/bill/preview', + method: 'post', + headers: { + 'Content-Type': 'application/json' + }, + data + }) +} + +// 生成账单 +export function generateBill(data) { + return request({ + url: '/finance/charging-standard/bill/generate', + method: 'post', + headers: { + 'Content-Type': 'application/json' + }, + data + }) +} + +/** + * 分页查询账单-收费标准关联表数据 + * @param {Object} data - 查询参数 + * @returns {Promise} - 返回Promise对象 + */ +export function getBillChargingStandardRelPage(data) { + return request({ + url: '/finance/bill-charging-standard-rel/page', + method: 'post', + data + }) +} + +/** + * 获取特定标准ID的绑定房间账单列表 + * @param {string} standardId 收费标准ID + */ +export function getBillsByStandardId(standardId) { + return request({ + url: `/finance/bill-charging-standard-rel/${standardId}/bills`, + method: 'get' + }) +} + +// 账单管理接口 +export function addBill(data) { + return request({ + url: '/bill/add', + method: 'post', + data + }) +} + +export function getBillList(data) { + return request({ + url: '/bill/list', + method: 'post', + data + }) +} + +export function getBillDetail(billId) { + return request({ + url: `/bill/detail/${billId}`, + method: 'get' + }) +} + +export function uploadBillAttachment(billId, file) { + const formData = new FormData() + formData.append('billId', billId) + formData.append('file', file) + return request({ + url: '/bill/attachment/upload', + method: 'post', + data: formData, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +export function deleteBillAttachment(attachmentId) { + return request({ + url: `/bill/attachment/${attachmentId}`, + method: 'delete' + }) +} + +export function getBillAttachmentList(billId) { + return request({ + url: `/bill/attachment/list/${billId}`, + method: 'get' + }) +} + +export function exportBillList(data) { + return request({ + url: '/bill/export', + method: 'post', + data, + responseType: 'blob' + }) } \ No newline at end of file diff --git a/pc/src/router/modules/finance.js b/pc/src/router/modules/finance.js index 7b569d3..c20f28b 100644 --- a/pc/src/router/modules/finance.js +++ b/pc/src/router/modules/finance.js @@ -24,6 +24,12 @@ export default { component: () => import('@/views/finance/chargeStandard/index.vue'), name: 'ChargeStandard', meta: { title: '收费标准', icon: 'el-icon-price-tag' } + }, + { + path: 'billList', + component: () => import('@/views/finance/billList/index.vue'), + name: 'BillList', + meta: { title: '所有账单', icon: 'el-icon-notebook-2' } } ] } \ No newline at end of file diff --git a/pc/src/utils/request.js b/pc/src/utils/request.js index 654f76d..29134d3 100644 --- a/pc/src/utils/request.js +++ b/pc/src/utils/request.js @@ -4,8 +4,8 @@ import { API_SUCCESS_CODE } from './constants' // 创建axios实例 const service = axios.create({ - baseURL: '/', // 修改为相对路径,使用代理 - // baseURL: process.env.VUE_APP_BASE_API, // 使用环境变量中的接口地址 + // baseURL: '/', // 修改为相对路径,使用代理 + baseURL: process.env.VUE_APP_BASE_API, // 使用环境变量中的接口地址 timeout: 10000 // 请求超时时间 }) diff --git a/pc/src/views/asset/classification/index.vue b/pc/src/views/asset/classification/index.vue index fbc49c6..091e931 100644 --- a/pc/src/views/asset/classification/index.vue +++ b/pc/src/views/asset/classification/index.vue @@ -169,6 +169,7 @@ + + \ No newline at end of file diff --git a/pc/src/views/finance/billList/components/BillDetail.vue b/pc/src/views/finance/billList/components/BillDetail.vue new file mode 100644 index 0000000..cc56d22 --- /dev/null +++ b/pc/src/views/finance/billList/components/BillDetail.vue @@ -0,0 +1,256 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/finance/billList/index.vue b/pc/src/views/finance/billList/index.vue new file mode 100644 index 0000000..4a9bbef --- /dev/null +++ b/pc/src/views/finance/billList/index.vue @@ -0,0 +1,409 @@ + + + + + \ No newline at end of file diff --git a/pc/src/views/finance/chargeStandard/index.vue b/pc/src/views/finance/chargeStandard/index.vue index 487f0cb..ddfc255 100644 --- a/pc/src/views/finance/chargeStandard/index.vue +++ b/pc/src/views/finance/chargeStandard/index.vue @@ -16,15 +16,11 @@ 搜索 重置 + + 新增 - - - - 新增 - - @@ -96,7 +92,7 @@ {{ detailForm.chargeMode === '1' ? '周期性费用' : '一次性费用' }} - {{ detailForm.feeTypeName }} + {{ detailForm.feTpName }} {{ detailForm.effectiveDate }} {{ detailForm.expiryDate }} {{ detailForm.price }} @@ -110,14 +106,9 @@ {{ detailForm.dayPriceConversionRule === '1' ? '按自然月换算' : '按年换算' }} {{ detailForm.decimalPrecisionPrice }} - {{ detailForm.calculationPrecision }} - - {{ detailForm.calculationPrecisionMethod === '1' ? '每步计算结果按计算精度保留' : '最终计算结果按照计算精度保留' }} - + {{ detailForm.receivableAmountPrecision }} - - {{ detailForm.calculationOrder === '1' ? '单价*面积*时间' : '单价*时间*面积' }} - + {{ formatPaymentTimeRule(detailForm) }} @@ -135,14 +126,14 @@ {{ formatBillDivisionMethod(detailForm.billDivisionMethod) }} - - {{ detailForm.lateFeeStartDays }} + + {{ detailForm.ovdueStartDays }} - - {{ formatPercentage(detailForm.ovdueFeeRate) }} + + {{ formatPercentage(detailForm.ovdueIntRate) }} - - {{ formatPercentage(detailForm.lateFeeUpperLimit) }} + + {{ formatPercentage(detailForm.ovdueLimitRate) }} {{ getStatusName(detailForm.status) }} @@ -196,7 +187,7 @@ - + @@ -285,6 +276,21 @@ + + + + + + + + + + + + + + + @@ -295,42 +301,23 @@ - - - - - - - + + + + % + - - - - - - - - - - - - - - - - - - @@ -341,14 +328,7 @@ - - - - - - - - + @@ -363,7 +343,6 @@ - @@ -418,21 +397,21 @@ 滞纳金设置 - - + - - + % - - + % @@ -446,6 +425,451 @@ + + +
+ + {{ bindDataForm.standardName }} + {{ bindDataForm.effectiveDate }} + {{ bindDataForm.price }} + + {{ formatPriceUnit(bindDataForm.priceU, bindDataForm.chargeMode) }} + + + {{ getStatusName(bindDataForm.status) }} + + + {{ bindDataForm.bindingObjectType === '1' ? '房间' : '车位' }} + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 生成账单+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + +
+ 收费标准信息 +
+ + {{ billForm.standardName }} + {{ billForm.effectiveDate }} + {{ billForm.expiryDate }} + + {{ getStatusName(billForm.status) }} + + + {{ billForm.bindingObjectType === '1' ? '房间' : '车位' }} + + {{ billForm.projectName }} + {{ billForm.companyName }} + {{ billForm.accountName }} + + {{ billForm.chargeMode === '1' ? '周期性费用' : '一次性费用' }} + + {{ billForm.ovdueStartDays }} + + {{ formatPercentage(billForm.ovdueIntRate) }} + + + {{ formatPercentage(billForm.ovdueLimitRate) }} + + +
+ + + +
+ 生成账单基本信息 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ 绑定房源 +
+ + +
+ + + +
+ 账单预览 + 刷新预览 +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ 账单总金额: + ¥ {{ previewBillTotal.toFixed(2) }} +
+
+
+ + +
+ + + +
+
+
+ 房间名称: {{ bills[0].roomNumber }} + 楼层: {{ bills[0].floorName }} + 楼栋: {{ bills[0].buildingName }} +
+ + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ @@ -457,7 +881,11 @@ import { updateChargingStandardStatus, addChargingStandard, checkChargingStandardName, - getFeeTypeTree + getFeeTypeTree, + previewBill, + generateBill, + getBillChargingStandardRelPage, + getBillsByStandardId } from '@/api/finance' import { getAllAccounts } from '@/api/building' import { API_SUCCESS_CODE } from '@/utils/constants' @@ -497,14 +925,13 @@ export default { effectiveDate: undefined, expiryDate: undefined, price: undefined, + currCode: '156', priceU: '1', taxInclusiveRule: '1', // 默认含税 - dayPriceConversionRule: '1', // 默认按自然月换算 + taxRate: 0, + dayPriceConversionRule: '2', // 默认按自然月换算 decimalPrecisionPrice: 2, - calculationPrecision: 2, - calculationPrecisionMethod: '1', // 默认每步计算结果按计算精度保留 receivableAmountPrecision: 2, - calculationOrder: '1', // 默认单价*面积*时间 paymentTimeRuleType: '1', // 默认按开始延后 delayPaymDaynum: 0, dateCalculationMethod: '1', // 默认自然日 @@ -512,9 +939,9 @@ export default { chrgingUnitVal: 365, // 默认年天数 remitCycleVal: 1, // 默认1个月一付 billDivisionMethod: '1', // 默认按起始日划分 - lateFeeStartDays: 0, - ovdueFeeRate: 0, - lateFeeUpperLimit: 0 + ovdueStartDays: 0, + ovdueIntRate: 0, + ovdueLimitRate: 0 }, // 表单校验规则 rules: { @@ -526,6 +953,7 @@ export default { effectiveDate: [{ required: true, message: '请选择标准生效时间', trigger: 'change' }], expiryDate: [{ required: true, message: '请选择标准失效时间', trigger: 'change' }], price: [{ required: true, message: '请输入单价', trigger: 'blur' }], + currCode: [{ required: true, message: '请选择币种', trigger: 'blur' }], priceU: [{ required: true, message: '请选择单价单位', trigger: 'change' }], paymentTimeRuleType: [{ required: true, message: '请选择付款时间计算方式', trigger: 'change' }], delayPaymDaynum: [{ required: true, message: '请输入付款天数', trigger: 'blur' }], @@ -537,13 +965,13 @@ export default { }, // 项目选项 projectOptions: [ - { id: 'P001', projectName: '智慧园区示范项目' }, - { id: 'P002', projectName: '创新园区项目' } + { id: 1, projectName: '智慧园区示范项目' }, + { id: 2, projectName: '创新园区项目' } ], // 公司选项 companyOptions: [ - { id: 'C001', companyName: '智慧园区物业公司' }, - { id: 'C002', companyName: '创新物业管理有限公司' } + { id: 1, companyName: '智慧园区物业公司' }, + { id: 2, companyName: '创新物业管理有限公司' } ], // 账户选项 accountOptions: [], @@ -556,7 +984,93 @@ export default { // 费用类型选项(级联选择器的数据) feeTypeOptions: [], // 价格单位选项(根据收费模式动态变化) - priceUnitOptions: [] + priceUnitOptions: [], + // 绑定数据源对话框 + bindDataOpen: false, + bindDataLoading: false, + bindDataList: [], + bindDataTotal: 0, + bindDataForm: { + standardId: null, + standardName: '', + effectiveDate: '', + expiryDate: '', + status: '', + bindingObjectType: '', + // 添加新字段以适配API请求 + payerId: '', + projectId: '', + companyId: '', + feeTypeId: null, + beginDate: '', + endDate: '', + billDivisionMethod: '', + roomId: '' + }, + bindDataQueryParams: { + pageNum: 1, + pageSize: 10 + }, + + // 生成账单对话框 + generateBillOpen: false, + billForm: { + standardId: '', + standardName: '', + effectiveDate: '', + expiryDate: '', + status: '', + bindingObjectType: '', + projectId: '', + projectName: '', + companyId: '', + companyName: '', + accountId: '', + accountName: '', + chargeMode: '', + ovdueStartDays: '', + ovdueIntRate: '', + ovdueLimitRate: '', + decimalPrecisionPrice: '', + receivableAmountPrecision: '', + price: '', + currCode: '156', + priceU: '', + taxInclusiveRule: '', + taxRate: '', + paymentDate: '', + quantity: '', + startDate: '', + endDate: '', + dateRange: [this.getCurrentDate(), this.calculateEndDate(this.getCurrentDate(), 1)], + chggBgnDt: this.getCurrentDate(), // 设置为当前日期 + chggEndDt: this.calculateEndDate(this.getCurrentDate(), 1), // 设置为当前日期加一年 + feeTypeId: '', + paymentTimeRuleType: '', + delayPaymDaynum: '', + dateCalculationMethod: '', + billingType: '', + chrgingUnitVal: '', + remitCycleVal: '', + billDivisionMethod: '', + billRemark: '', + roomIds: [] + }, + // 表单原始值,用于检测变更 + originalBillForm: {}, + roomTreeData: [], + previewBillList: [], + previewBillTotal: 0, + previewBillLoading: false, + // 记录用户是否修改过表单 + formChanged: false, + dateRangeValue: [], + dateRange: [], + // 添加账单列表相关数据 + bindRoomDialogVisible: false, + roomBillsLoading: false, + roomBillsData: {}, + viewRoomData: null, } }, created() { @@ -573,6 +1087,38 @@ export default { showDayPriceRule() { if (this.form.chargeMode !== '1') return false return ['3', '4', '7', '8'].includes(this.form.priceU) + }, + // 是否显示账单中的天单价换算规则 + showBillDayPriceRule() { + if (this.billForm.chargeMode !== '1') return false + return ['3', '4', '7', '8'].includes(this.billForm.priceU) + }, + // 处理日期范围值 + dateRangeValue: { + get() { + // 如果两个日期都有值,返回数组 + if (this.billForm.chggBgnDt && this.billForm.chggEndDt) { + return [this.billForm.chggBgnDt, this.billForm.chggEndDt] + } + return [] + }, + set(val) { + if (val && val.length === 2) { + this.billForm.chggBgnDt = val[0] + this.billForm.chggEndDt = val[1] + this.billForm.startDate = val[0] + this.billForm.endDate = val[1] + } else { + this.billForm.chggBgnDt = '' + this.billForm.chggEndDt = '' + this.billForm.startDate = '' + this.billForm.endDate = '' + } + // 标记表单已修改 + this.formChanged = true + // 清空预览数据 + this.clearPreviewData() + } } }, methods: { @@ -707,14 +1253,13 @@ export default { effectiveDate: undefined, expiryDate: undefined, price: undefined, + currCode: '156', priceU: '1', taxInclusiveRule: '1', // 默认含税 - dayPriceConversionRule: '1', // 默认按自然月换算 + taxRate: 0, + dayPriceConversionRule: '2', // 默认按自然月换算 decimalPrecisionPrice: 2, - calculationPrecision: 2, - calculationPrecisionMethod: '1', // 默认每步计算结果按计算精度保留 receivableAmountPrecision: 2, - calculationOrder: '1', // 默认单价*面积*时间 paymentTimeRuleType: '1', // 默认按开始延后 delayPaymDaynum: 0, dateCalculationMethod: '1', // 默认自然日 @@ -722,9 +1267,9 @@ export default { chrgingUnitVal: 365, // 默认年天数 remitCycleVal: 1, // 默认1个月一付 billDivisionMethod: '1', // 默认按起始日划分 - lateFeeStartDays: 0, - ovdueFeeRate: 0, - lateFeeUpperLimit: 0 + ovdueStartDays: 0, + ovdueIntRate: 0, + ovdueLimitRate: 0 } // 重置选中的账户信息 this.selectedAccount = { @@ -759,7 +1304,7 @@ export default { // 一次性费用 this.priceUnitOptions = [ { value: '1', label: '元' }, - { value: '2', label: '元/㎡' } + { value: '5', label: '元/㎡' } ] } // 清空已选择的单价单位 @@ -802,8 +1347,8 @@ export default { // 转换数字类型的字段 const formData = { ...this.form } const numericFields = [ - 'decimalPrecisionPrice', 'calculationPrecision', 'receivableAmountPrecision', - 'delayPaymDaynum', 'chrgingUnitVal', 'remitCycleVal', 'lateFeeStartDays' + 'decimalPrecisionPrice', 'receivableAmountPrecision', + 'delayPaymDaynum', 'chrgingUnitVal', 'remitCycleVal', 'ovdueStartDays' ] numericFields.forEach(field => { @@ -846,10 +1391,702 @@ export default { }, /** 绑定数据源按钮操作 */ handleBindData(row) { - this.$router.push({ - path: '/finance/chargeStandard/bindData', - query: { id: row.id } + this.openBindDataDialog(row) + }, + + /** 打开绑定数据源弹窗 */ + openBindDataDialog(row) { + this.bindDataOpen = true + this.bindDataForm.standardId = row.id + this.bindDataForm.standardName = row.standardName + this.bindDataForm.effectiveDate = row.effectiveDate + this.bindDataForm.expiryDate = row.expiryDate + this.bindDataForm.price = row.price + this.bindDataForm.priceU = row.priceU + this.bindDataForm.status = row.status + this.bindDataForm.bindingObjectType = row.bindingObjectType + this.getBindDataList() + }, + + /** 获取绑定数据源列表 */ + getBindDataList() { + this.bindDataLoading = true + // 构建完整查询参数 + const queryParams = { + standardId: this.bindDataForm.standardId, + payerId: this.bindDataForm.payerId || undefined, + projectId: this.bindDataForm.projectId || undefined, + companyId: this.bindDataForm.companyId || undefined, + feeTypeId: this.bindDataForm.feeTypeId || undefined, + beginDate: this.bindDataForm.beginDate || undefined, + endDate: this.bindDataForm.endDate || undefined, + billDivisionMethod: this.bindDataForm.billDivisionMethod || undefined, + roomId: this.bindDataForm.roomId || undefined, + pageNum: this.bindDataQueryParams.pageNum, + pageSize: this.bindDataQueryParams.pageSize + } + + // 移除空值参数 + Object.keys(queryParams).forEach(key => { + if (queryParams[key] === undefined || queryParams[key] === null || queryParams[key] === '') { + delete queryParams[key] + } }) + + getBillChargingStandardRelPage(queryParams).then(response => { + if (response.code === API_SUCCESS_CODE) { + this.bindDataList = response.data.list + this.bindDataTotal = response.data.total + } else { + this.$message.error('获取绑定数据列表失败') + } + this.bindDataLoading = false + }).catch(() => { + this.bindDataLoading = false + }) + }, + + /** 查询绑定房间 */ + handleViewBindRooms(row) { + this.viewRoomData = row + this.roomBillsLoading = true + this.bindRoomDialogVisible = true + + // 调用API查询绑定房间账单 + getBillsByStandardId(row.id).then(response => { + if (response.code === API_SUCCESS_CODE) { + this.roomBillsData = response.data + this.roomBillsLoading = false + } else { + this.$message.error('查询绑定房间账单失败') + this.roomBillsLoading = false + } + }).catch(() => { + this.$message.error('查询绑定房间账单失败') + this.roomBillsLoading = false + }) + }, + + /** 打开生成账单弹窗 */ + openGenerateBillDialog() { + if (this.bindDataForm.status !== '1') { + return this.$message.warning('只有生效中的收费标准才能生成账单') + } + + // 清空预览数据 + this.previewBillList = [] + this.previewBillTotal = 0 + this.formChanged = false + + this.generateBillOpen = true + + // 根据收费标准ID获取详细信息 + getChargingStandardById(this.bindDataForm.standardId).then(response => { + if (response.code === API_SUCCESS_CODE) { + const standardData = response.data + + // 设置基本信息 + this.billForm = { + standardId: standardData.id, + standardName: standardData.standardName, + effectiveDate: standardData.effectiveDate, + expiryDate: standardData.expiryDate, + status: standardData.status, + bindingObjectType: standardData.bindingObjectType, + projectId: '', + projectName: standardData.projectName, + companyId: standardData.companyId, + companyName: standardData.companyName, + accountId: standardData.accountId, + accountName: standardData.accountName, + chargeMode: standardData.chargeMode, + ovdueStartDays: standardData.ovdueStartDays, + ovdueIntRate: standardData.ovdueIntRate, + ovdueLimitRate: standardData.ovdueLimitRate, + + // 可修改的字段 + decimalPrecisionPrice: standardData.decimalPrecisionPrice, + receivableAmountPrecision: standardData.receivableAmountPrecision, + price: standardData.price, + priceU: standardData.priceU, + currCode:'156', + taxInclusiveRule: standardData.taxInclusiveRule, + taxRate: standardData.taxRate, + dayPriceConversionRule: standardData.dayPriceConversionRule, // 添加天单价换算规则字段 + + // 一次性费用字段 + paymentDate: standardData.effectiveDate, + quantity: 1, + + // 周期性费用字段 + startDate: standardData.effectiveDate, + endDate: this.calculateEndDate(standardData.effectiveDate, 1), // 默认一年 + dateRange: [this.getCurrentDate(), this.calculateEndDate(this.getCurrentDate(), 1)], + chggBgnDt: this.getCurrentDate(), // 设置为当前日期 + chggEndDt: this.calculateEndDate(this.getCurrentDate(), 1), // 设置为当前日期加一年 + feeTypeId: standardData.feeTypeId, + paymentTimeRuleType: standardData.paymentTimeRuleType, + delayPaymDaynum: standardData.delayPaymDaynum, + dateCalculationMethod: standardData.dateCalculationMethod, + billingType: standardData.billingType, + chrgingUnitVal: standardData.chrgingUnitVal, + remitCycleVal: standardData.remitCycleVal, + billDivisionMethod: standardData.billDivisionMethod, + + billRemark: '', + roomIds: [] + } + + // 保存表单初始值,用于检测变更 + this.originalBillForm = JSON.parse(JSON.stringify(this.billForm)) + + // 设置日期范围值,使UI显示正确的日期 + this.dateRangeValue = [this.getCurrentDate(), this.calculateEndDate(this.getCurrentDate(), 1)] + + // 获取房源列表 + this.getRoomTreeData() + } else { + this.$message.error('获取收费标准信息失败') + } + }) + }, + + /** 计算结束日期 */ + calculateEndDate(startDate, yearCount) { + if (!startDate) return '' + const date = new Date(startDate) + date.setFullYear(date.getFullYear() + yearCount) + date.setDate(date.getDate() - 1) // 减一天,例如从2023-01-01到2023-12-31 + + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + + return `${year}-${month}-${day}` + }, + + /** 获取房源树形数据 */ + getRoomTreeData() { + // 使用静态数据 + // 模拟房源数据 + const roomData = [ + { + "id": "3", + "projectName": "智慧产业园", + "projectType": "产业园区", + "buildings": [] + }, + { + "id": "2", + "projectName": "智慧产业园-修改", + "projectType": "产业园区", + "buildings": [ + { + "id": 1, + "buildingName": "1号智能办公楼-测试", + "buildingCode": "B01", + "floors": [ + { + "id": 3, + "floorName": "2层-1", + "floorNumber": 2, + "rooms": [ + { + "id": 24, + "roomNumber": "441", + "roomType": "2", + "roomStatus": "1", + "buildingArea": 123.00, + "rentalArea": 2231.00 + }, + { + "id": 22, + "roomNumber": "1302", + "roomType": "4", + "roomStatus": "1", + "buildingArea": 113.00, + "rentalArea": 112.00 + } + ] + } + ] + } + ] + }, + { + "id": "4", + "projectName": "智慧产业园-9", + "projectType": "产业园区", + "buildings": [ + { + "id": 14, + "buildingName": "3331", + "buildingCode": "23", + "floors": [] + } + ] + }, + { + "id": "5", + "projectName": "测试", + "projectType": "产业园区", + "buildings": [ + { + "id": 3, + "buildingName": "1号楼", + "buildingCode": "B01", + "floors": [] + }, + { + "id": 4, + "buildingName": "2号楼", + "buildingCode": "B02", + "floors": [ + { + "id": 4, + "floorName": "2层-1", + "floorNumber": 2, + "rooms": [ + { + "id": 23, + "roomNumber": "202", + "roomType": "3", + "roomStatus": "2", + "buildingArea": 44111.00, + "rentalArea": 444233.00 + } + ] + } + ] + }, + { + "id": 12, + "buildingName": "22", + "buildingCode": "22", + "floors": [] + }, + { + "id": 15, + "buildingName": "融入1", + "buildingCode": "5531", + "floors": [] + } + ] + }, + { + "id": "8", + "projectName": "测试-1", + "projectType": "产业园区", + "buildings": [ + { + "id": 7, + "buildingName": "4121", + "buildingCode": "1234", + "floors": [ + { + "id": 7, + "floorName": "123", + "floorNumber": 11, + "rooms": [ + { + "id": 31, + "roomNumber": "504", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 30, + "roomNumber": "504", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 32, + "roomNumber": "505", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 33, + "roomNumber": "506", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 34, + "roomNumber": "507", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 35, + "roomNumber": "511", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 36, + "roomNumber": "512", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 37, + "roomNumber": "512", + "roomType": null, + "roomStatus": "1", + "buildingArea": 122.00, + "rentalArea": 20.99 + }, + { + "id": 20, + "roomNumber": "503", + "roomType": "3", + "roomStatus": "1", + "buildingArea": 92.00, + "rentalArea": 92.00 + } + ] + } + ] + }, + { + "id": 8, + "buildingName": "22222", + "buildingCode": "22", + "floors": [] + }, + { + "id": 9, + "buildingName": "22222", + "buildingCode": "22", + "floors": [] + }, + { + "id": 10, + "buildingName": "22222", + "buildingCode": "22", + "floors": [] + }, + { + "id": 13, + "buildingName": "41", + "buildingCode": "23", + "floors": [] + } + ] + }, + { + "id": "10", + "projectName": "111", + "projectType": "产业园区", + "buildings": [ + { + "id": 11, + "buildingName": "11", + "buildingCode": "114", + "floors": [] + } + ] + }, + { + "id": "13", + "projectName": "智慧产业园", + "projectType": "产业园区", + "buildings": [] + }, + { + "id": "14", + "projectName": "智慧产业园2", + "projectType": "产业园区", + "buildings": [] + } + ]; + + // 转换为树形结构 + this.roomTreeData = roomData.map(project => { + return { + id: project.id, + label: project.projectName, + children: project.buildings.map(building => { + return { + id: building.id, + label: building.buildingName, + children: building.floors.map(floor => { + return { + id: floor.id, + label: floor.floorName, + children: floor.rooms.map(room => { + return { + id: room.id, + label: `${room.roomNumber}(${room.rentalArea}㎡)`, + isRoom: true, + // 保存原始数据供选择 + roomData: room + } + }) + } + }) + } + }) + } + }); + }, + + /** 处理日期范围选择变更 */ + handleDateRangeChange(val) { + if (val && val.length === 2) { + this.billForm.startDate = val[0] + this.billForm.endDate = val[1] + this.billForm.chggBgnDt = val[0] + this.billForm.chggEndDt = val[1] + } else { + this.billForm.startDate = '' + this.billForm.endDate = '' + this.billForm.chggBgnDt = '' + this.billForm.chggEndDt = '' + } + // 清空预览数据 + this.clearPreviewData() + }, + + /** 处理表单字段变更 */ + handleFormFieldChange() { + // 标记表单已修改 + this.formChanged = true + // 清空预览数据 + this.clearPreviewData() + }, + + /** 清空预览数据 */ + clearPreviewData() { + this.previewBillList = [] + this.previewBillTotal = 0 + }, + + /** 预览账单 */ + previewBill() { + if (!this.billForm.roomIds || this.billForm.roomIds.length === 0) { + return this.$message.warning('请选择绑定房源') + } + + if (this.billForm.chargeMode === '1' && (!this.billForm.chggBgnDt || !this.billForm.chggEndDt)) { + return this.$message.warning('请选择缴费时间范围') + } + + if (this.billForm.chargeMode === '2' && !this.billForm.paymentDate) { + return this.$message.warning('请选择缴费时间') + } + + this.previewBillLoading = true + + // 构建请求参数,包含收费标准的相关字段 + const params = { + // 收费标准基础信息 + standardId: this.billForm.standardId, + standardName: this.billForm.standardName, + projectId: this.billForm.projectId, + projectName: this.billForm.projectName, + companyId: this.billForm.companyId, + companyName: this.billForm.companyName, + accountId: this.billForm.accountId, + accountName: this.billForm.accountName, + bindingObjectType: this.billForm.bindingObjectType, + chargeMode: this.billForm.chargeMode, + + // 滞纳金信息 + ovdueStartDays: this.billForm.ovdueStartDays, + ovdueIntRate: this.billForm.ovdueIntRate, + ovdueLimitRate: this.billForm.ovdueLimitRate, + + // 房间信息 - 直接使用新的树形结构数据 + roomIds: this.billForm.roomIds, + + // 根据收费模式设置不同的参数 + ...(this.billForm.chargeMode === '1' ? { + chggBgnDt: this.billForm.chggBgnDt, + chggEndDt: this.billForm.chggEndDt + } : { + startDate: this.billForm.paymentDate, + endDate: this.billForm.paymentDate, + quantity: this.billForm.quantity + }), + + // 可修改的计算参数 + feeTypeId: this.billForm.feeTypeId, + calculationOrder: this.billForm.calculationOrder, + receivableAmountPrecision: this.billForm.receivableAmountPrecision, + taxInclusiveRule: this.billForm.taxInclusiveRule, + taxRate: this.billForm.taxRate, + decimalPrecisionPrice: this.billForm.decimalPrecisionPrice, + price: this.billForm.price, + priceU: this.billForm.priceU, + billRemark: this.billForm.billRemark + } + + // 周期性费用特有参数 + if (this.billForm.chargeMode === '1') { + Object.assign(params, { + dayPriceConversionRule: this.billForm.dayPriceConversionRule, + billingType: this.billForm.billingType, + chrgingUnitVal: this.billForm.chrgingUnitVal, + remitCycleVal: this.billForm.remitCycleVal, + billDivisionMethod: this.billForm.billDivisionMethod, + paymentTimeRuleType: this.billForm.paymentTimeRuleType, + delayPaymDaynum: this.billForm.delayPaymDaynum, + dateCalculationMethod: this.billForm.dateCalculationMethod + }) + } + + // 调用预览账单API + previewBill(params).then(response => { + this.previewBillLoading = false + if (response.code === API_SUCCESS_CODE) { + const billList = response.data + this.previewBillTotal = 0 + this.previewBillList = billList || [] + this.previewBillList.forEach(item => { + this.previewBillTotal += item.accigRcvAmt + }) + + // 记录表单当前状态 + this.originalBillForm = JSON.parse(JSON.stringify(this.billForm)) + this.formChanged = false + + if (this.previewBillList.length === 0) { + this.$message.warning('未生成任何账单,请检查参数设置') + } + } else { + this.$message.error(response.message || '预览账单失败') + } + }).catch(() => { + this.previewBillLoading = false + this.$message.error('预览账单失败,请稍后重试') + }) + }, + + /** 提交生成账单 */ + submitGenerateBill() { + if (!this.previewBillList || this.previewBillList.length === 0) { + return this.$message.warning('请先预览账单') + } + + // 如果表单有变动,提示用户先预览 + if (this.formChanged) { + return this.$message.warning('表单已修改,请先点击"刷新预览"按钮查看最新账单') + } + + this.$confirm('确定要生成这些账单吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + const loading = this.$loading({ + lock: true, + text: '生成账单中...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }) + + // 构建请求参数,包含收费标准的相关字段 + const params = { + // 收费标准基础信息 + standardId: this.billForm.standardId, + standardName: this.billForm.standardName, + projectId: this.billForm.projectId, + projectName: this.billForm.projectName, + companyId: this.billForm.companyId, + companyName: this.billForm.companyName, + accountId: this.billForm.accountId, + accountName: this.billForm.accountName, + bindingObjectType: this.billForm.bindingObjectType, + chargeMode: this.billForm.chargeMode, + + // 滞纳金信息 + ovdueStartDays: this.billForm.ovdueStartDays, + ovdueIntRate: this.billForm.ovdueIntRate, + ovdueLimitRate: this.billForm.ovdueLimitRate, + + // 房间信息 - 直接使用新的树形结构数据 + roomIds: this.billForm.roomIds, + + // 根据收费模式设置不同的参数 + ...(this.billForm.chargeMode === '1' ? { + chggBgnDt: this.billForm.chggBgnDt, + chggEndDt: this.billForm.chggEndDt + } : { + startDate: this.billForm.paymentDate, + endDate: this.billForm.paymentDate, + quantity: this.billForm.quantity + }), + + // 可修改的计算参数 + feeTypeId: this.billForm.feeTypeId, + calculationOrder: this.billForm.calculationOrder, + receivableAmountPrecision: this.billForm.receivableAmountPrecision, + taxInclusiveRule: this.billForm.taxInclusiveRule, + taxRate: this.billForm.taxRate, + decimalPrecisionPrice: this.billForm.decimalPrecisionPrice, + price: this.billForm.price, + priceU: this.billForm.priceU, + billRemark: this.billForm.billRemark, + //默认账单类型写死 + billType:'1', //1-收款账单,2-付款账单 + billSource:'2' //合同账单/收费标准账单/自建全部账单/自建关联合同账单/自建未关联合同账单 + + } + + // 周期性费用特有参数 + if (this.billForm.chargeMode === '1') { + Object.assign(params, { + dayPriceConversionRule: this.billForm.dayPriceConversionRule, + billingType: this.billForm.billingType, + chrgingUnitVal: this.billForm.chrgingUnitVal, + remitCycleVal: this.billForm.remitCycleVal, + billDivisionMethod: this.billForm.billDivisionMethod, + paymentTimeRuleType: this.billForm.paymentTimeRuleType, + delayPaymDaynum: this.billForm.delayPaymDaynum, + dateCalculationMethod: this.billForm.dateCalculationMethod + }) + } + + // 调用生成账单API + generateBill(params).then(response => { + loading.close() + if (response.code === API_SUCCESS_CODE) { + this.$message.success('账单生成成功') + this.generateBillOpen = false + // 刷新绑定数据源列表 + this.getBindDataList() + } else { + this.$message.error(response.message || '生成账单失败') + } + }).catch(() => { + loading.close() + this.$message.error('生成账单失败,请稍后重试') + }) + }).catch(() => { }) + }, + + /** 关闭生成账单对话框 */ + cancelGenerateBill() { + this.generateBillOpen = false + this.previewBillList = [] + this.previewBillTotal = 0 }, /** 删除按钮操作 */ handleDelete(row) { @@ -916,28 +2153,15 @@ export default { return chargeMode === '1' ? periodicUnits[priceU] : oneTimeUnits[priceU] }, /** 格式化付款时间规则 */ - formatPaymentTimeRule(data) { - if (!data.paymentTimeRuleType) return '' - - const typeMap = { - '1': '按开始延后', - '2': '按结束延后', - '3': '按开始提前', - '4': '按结束提前', - '5': '指定日期' + formatPaymentTimeRule(row) { + const ruleTypeMap = { + '1': '开始日期后延迟', + '2': '结束日期后延迟', + '3': '开始日期前提前', + '4': '结束日期前提前' } - - const methodMap = { - '1': '自然日', - '2': '工作日' - } - - let result = typeMap[data.paymentTimeRuleType] - if (['1', '2', '3', '4'].includes(data.paymentTimeRuleType)) { - result += ` ${data.delayPaymDaynum} 个${methodMap[data.dateCalculationMethod]}` - } - - return result + const ruleType = ruleTypeMap[row.paymentTimeRuleType] || '未知规则' + return `${ruleType} ${row.delayPaymDaynum || 0} 天` }, /** 获取费用类型树 */ getFeeTypes() { @@ -974,10 +2198,10 @@ export default { children = category.financeFeeTypes.map(feeType => { return { id: feeType.id || Math.random().toString(36).substr(2, 9), - label: feeType.feeTypeName || '未命名费用', + label: feeType.feTpName || '未命名费用', categoryId: categoryId, // 存储原始数据以便后续使用 - feeTypeName: feeType.feeTypeName || '未命名费用', + feTpName: feeType.feTpName || '未命名费用', // 确保没有更多的子节点 children: null } @@ -1022,12 +2246,295 @@ export default { /** 格式化百分比 */ formatPercentage(value) { return (value * 100).toFixed(2) + '%' - } + }, + + /** 绑定数据源查询参数重置 */ + resetBindDataQuery() { + this.bindDataQueryParams.pageNum = 1 + // 重置额外查询字段,但保留必要的standardId等基本信息 + this.bindDataForm.payerId = '' + this.bindDataForm.projectId = '' + this.bindDataForm.companyId = '' + this.bindDataForm.feeTypeId = null + this.bindDataForm.beginDate = '' + this.bindDataForm.endDate = '' + this.bindDataForm.billDivisionMethod = '' + this.bindDataForm.roomId = '' + this.getBindDataList() + }, + + /** 处理绑定数据源分页大小改变 */ + handleBindDataSizeChange(val) { + this.bindDataQueryParams.pageSize = val + this.getBindDataList() + }, + + /** 处理绑定数据源页码改变 */ + handleBindDataCurrentChange(val) { + this.bindDataQueryParams.pageNum = val + this.getBindDataList() + }, + + /** 处理日期范围选择变更 */ + handleDateRangeChange(val) { + if (val && val.length === 2) { + this.billForm.startDate = val[0] + this.billForm.endDate = val[1] + this.billForm.chggBgnDt = val[0] + this.billForm.chggEndDt = val[1] + } else { + this.billForm.startDate = '' + this.billForm.endDate = '' + this.billForm.chggBgnDt = '' + this.billForm.chggEndDt = '' + } + // 清空预览数据 + this.clearPreviewData() + }, + + /** 处理房源树选择 */ + handleRoomTreeCheck(node, data) { + // 只选择叶子节点(房间) + const checkedNodes = this.$refs.roomTree.getCheckedNodes(true) + // 过滤出所有房间节点 + const roomNodes = checkedNodes.filter(node => node.isRoom) + + // 创建一个Map用于收集项目信息 + const projectMap = new Map() + + // 处理每个房间节点 + roomNodes.forEach(roomNode => { + // 查找节点路径 + let currentNode = this.$refs.roomTree.getNode(roomNode.id) + let roomInfo = roomNode.roomData + let floorNode, buildingNode, projectNode + + // 向上遍历找到楼层、楼宇和项目节点 + while (currentNode && currentNode.parent) { + const parent = currentNode.parent + if (parent.level === 3) { // 楼层级别 + floorNode = parent.data + } else if (parent.level === 2) { // 楼宇级别 + buildingNode = parent.data + } else if (parent.level === 1) { // 项目级别 + projectNode = parent.data + } + currentNode = parent + } + + // 只有完整路径的房间才处理 + if (roomInfo && floorNode && buildingNode && projectNode) { + // 确认项目是否已在Map中 + if (!projectMap.has(projectNode.id)) { + projectMap.set(projectNode.id, { + id: projectNode.id, + projectName: projectNode.label, + projectType: '产业园区', // 如果有projectType属性,应该使用projectNode中的值 + buildings: [] + }) + } + + // 获取当前项目 + const project = projectMap.get(projectNode.id) + + // 查找楼宇 + let building = project.buildings.find(b => b.id === buildingNode.id) + if (!building) { + building = { + id: buildingNode.id, + buildingName: buildingNode.label, + buildingCode: '', // 如果有buildingCode属性,应该使用buildingNode中的值 + floors: [] + } + project.buildings.push(building) + } + + // 查找楼层 + let floor = building.floors.find(f => f.id === floorNode.id) + if (!floor) { + floor = { + id: floorNode.id, + floorName: floorNode.label, + floorNumber: 0, // 如果有floorNumber属性,应该使用floorNode中的值 + rooms: [] + } + building.floors.push(floor) + } + + // 添加房间 + const room = { + id: roomInfo.id, + roomNumber: roomInfo.roomNumber || roomNode.label.split('(')[0], + roomType: roomInfo.roomType || '', + roomStatus: roomInfo.roomStatus || '1', + buildingArea: roomInfo.buildingArea || 0, + rentalArea: roomInfo.rentalArea || 0 + } + + // 检查该房间是否已经存在 + const roomExists = floor.rooms.some(r => r.id === room.id) + if (!roomExists) { + floor.rooms.push(room) + } + } + }) + + // 将Map转换为数组 + this.billForm.roomIds = Array.from(projectMap.values()) + + // 清空预览数据 + this.clearPreviewData() + }, + getCurrentDate() { + return new Date().toISOString().split('T')[0]; + }, + /** 处理日期范围变更 */ + handleDateRangeChange(dateRange) { + if (dateRange) { + this.bindDataForm.beginDate = dateRange[0] + this.bindDataForm.endDate = dateRange[1] + } else { + this.bindDataForm.beginDate = '' + this.bindDataForm.endDate = '' + } + }, + + /** 打开绑定数据查询弹窗 */ + handleViewBindData(row) { + this.bindDataOpen = true + this.bindDataForm.standardId = row.id + this.bindDataForm.standardName = row.standardName + this.bindDataForm.effectiveDate = row.effectiveDate + this.bindDataForm.expiryDate = row.expiryDate + this.bindDataForm.status = row.status + this.bindDataForm.bindingObjectType = row.bindingObjectType + // 重置其他查询字段 + this.bindDataForm.payerId = '' + this.bindDataForm.projectId = '' + this.bindDataForm.companyId = '' + this.bindDataForm.feeTypeId = null + this.bindDataForm.beginDate = '' + this.bindDataForm.endDate = '' + this.bindDataForm.billDivisionMethod = '' + this.bindDataForm.roomId = '' + this.dateRange = [] + + // 加载项目列表(如果还没有) + if (this.projectOptions.length === 0) { + this.getProjectOptions() + } + + // 加载费用类型(如果还没有) + if (this.feeTypeOptions.length === 0) { + this.getFeeTypeOptions() + } + + this.getBindDataList() + }, + + /** 获取项目选项 */ + getProjectOptions() { + // 这里应该调用项目接口获取项目列表 + // 示例数据 + this.projectOptions = [ + { projectId: 'P001', projectName: '智慧园区A区' }, + { projectId: 'P002', projectName: '智慧园区B区' }, + { projectId: 'P003', projectName: '智慧产业园' } + ] + }, + + /** 根据房间ID获取房间信息 */ + getRoomInfoByRoomId(roomId) { + // 默认返回的房间信息 + const defaultInfo = { + roomNumber: roomId, + floorName: '-', + buildingName: '-' + } + + // 从房源树中查找房间信息 + for (const project of this.roomTreeData || []) { + for (const building of project.buildings || []) { + for (const floor of building.floors || []) { + for (const room of floor.rooms || []) { + if (room.id.toString() === roomId.toString()) { + return { + roomNumber: room.roomNumber, + floorName: floor.floorName, + buildingName: building.buildingName + } + } + } + } + } + } + + return defaultInfo + }, + + /** 格式化日期时间 */ + formatDateTime(dateTimeStr) { + if (!dateTimeStr) return '-' + // 处理后端返回的ISO格式日期 + const date = new Date(dateTimeStr) + return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` + }, + + /** 获取清算状态类型 */ + getClearStatusType(status) { + const statusMap = { + '1': 'info', // 未开始 + '2': 'warning', // 进行中 + '3': 'success', // 已完成 + '4': 'danger', // 已逾期 + '5': '' // 默认 + } + return statusMap[status] || '' + }, + + /** 获取清算状态名称 */ + getClearStatusName(status) { + const statusMap = { + '1': '未开始', + '2': '进行中', + '3': '已完成', + '4': '已逾期', + '5': '待处理' + } + return statusMap[status] || '未知' + }, + }, + watch: { + 'billForm.decimalPrecisionPrice': 'handleFormFieldChange', + 'billForm.receivableAmountPrecision': 'handleFormFieldChange', + 'billForm.price': 'handleFormFieldChange', + 'billForm.priceU': 'handleFormFieldChange', + 'billForm.taxInclusiveRule': 'handleFormFieldChange', + 'billForm.taxRate': 'handleFormFieldChange', + 'billForm.dayPriceConversionRule': 'handleFormFieldChange', + 'billForm.paymentDate': 'handleFormFieldChange', + 'billForm.quantity': 'handleFormFieldChange', + 'billForm.feeTypeId': 'handleFormFieldChange', + 'billForm.paymentTimeRuleType': 'handleFormFieldChange', + 'billForm.delayPaymDaynum': 'handleFormFieldChange', + 'billForm.dateCalculationMethod': 'handleFormFieldChange', + 'billForm.billingType': 'handleFormFieldChange', + 'billForm.chrgingUnitVal': 'handleFormFieldChange', + 'billForm.remitCycleVal': 'handleFormFieldChange', + 'billForm.billDivisionMethod': 'handleFormFieldChange', + 'billForm.billRemark': 'handleFormFieldChange', + 'billForm.chggBgnDt': 'handleFormFieldChange', + 'billForm.chggEndDt': 'handleFormFieldChange' } } \ No newline at end of file + +/* 绑定房间列表对话框相关样式 */ +.room-bills-container { + margin-bottom: 20px; +} + +.room-info { + background-color: #f5f7fa; + padding: 12px 15px; + border-radius: 4px; + margin-bottom: 10px; + font-weight: bold; + font-size: 14px; + display: flex; + align-items: center; + + span { + margin-right: 20px; + display: inline-flex; + align-items: center; + + &:last-child { + margin-right: 0; + } + } +} + +.empty-data { + padding: 40px 0; +} + diff --git a/pc/src/views/finance/feeType/index.vue b/pc/src/views/finance/feeType/index.vue index 083e8f7..9ae0efd 100644 --- a/pc/src/views/finance/feeType/index.vue +++ b/pc/src/views/finance/feeType/index.vue @@ -50,7 +50,7 @@