From 76f61c419394e5c3a17a2917c56ad39dc979facb Mon Sep 17 00:00:00 2001 From: Admin Date: Thu, 4 Dec 2025 21:19:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=84=E5=85=AC=E5=8F=B8=E8=B4=A2=E5=8A=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=80=9A=E8=AE=AF=E5=9F=BA=E6=9C=AC=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/controllers.py | 77 --- .../models/financial_sheet_collection.py | 93 ++- .../static/src/js/financial.js | 606 +++++++----------- .../static/src/xml/financial.xml | 165 +---- yuthon_account_report/views/custom.xml | 11 + 5 files changed, 329 insertions(+), 623 deletions(-) diff --git a/yuthon_account_report/controllers/controllers.py b/yuthon_account_report/controllers/controllers.py index 233da80cb..0f735e8ff 100644 --- a/yuthon_account_report/controllers/controllers.py +++ b/yuthon_account_report/controllers/controllers.py @@ -7,83 +7,6 @@ import datetime class Statement(http.Controller): - @http.route('/get/account/title', auth='user', type='json', methods=['POST']) - def getAccountTitle(self, **kw): - data = kw.get('data', '') - companyGroups = [ - { - 'id': 1, - 'groupName': "天河投资", - 'items': [ - {'id': 101, 'name': "本期数", 'fieldType': "万元"}, - {'id': 102, 'name': "上年同期", 'fieldType': "万元"}, - {'id': 103, 'name': "增幅", 'fieldType': "%"}, - {'id': 104, 'name': "说明"} - ] - }, - { - 'id': 2, - 'groupName': "天投城建", - 'items': [ - {'id': 201, 'name': "本期数", 'fieldType': "万元"}, - {'id': 202, 'name': "上年同期", 'fieldType': "万元"}, - {'id': 203, 'name': "增幅", 'fieldType': "%"}, - {'id': 204, 'name': "说明"} - ] - }, - { - 'id': 3, - 'groupName': "物管公司", - 'items': [ - {'id': 201, 'name': "本期数", 'fieldType': "万元"}, - {'id': 202, 'name': "上年同期", 'fieldType': "万元"}, - {'id': 203, 'name': "增幅", 'fieldType': "%"}, - {'id': 204, 'name': "说明"} - ] - }, - { - 'id': 4, - 'groupName': "粮储公司", - 'items': [ - {'id': 201, 'name': "本期数", 'fieldType': "万元"}, - {'id': 202, 'name': "上年同期", 'fieldType': "万元"}, - {'id': 203, 'name': "增幅", 'fieldType': "%"}, - {'id': 204, 'name': "说明"} - ] - } - ] - return companyGroups - - @http.route('/get/account/project', auth='user', type='json', methods=['POST']) - def getAccountProject(self, **kw): - data = kw.get('data', '') - values = { - '101': "10000.00", - '102': "2000.00", - '103': "1500.00", - '104': "说明1", - '201': "8000.00", - '202': "1000.00", - '203': "800.00", - '204': "说明2" - } - rawRows = [] - cons = request.env['sheet.collection.setting'].search([]) - for con in cons: - result = con.check_today() - if isinstance(result, str): - raise ValidationError(result) - else: - if result: - one = { - 'id': con.sequence, - 'name': con.name, - 'values': values - } - rawRows.append(one) - rawRows.sort(key=lambda x: int(x['id'])) - return rawRows - @http.route('/financial/single/get/data', type='json', auth='user', methods=['POST']) def get_financial_data(self, filters=None, **kwargs): """获取财务数据""" diff --git a/yuthon_account_report/models/financial_sheet_collection.py b/yuthon_account_report/models/financial_sheet_collection.py index 7823277ce..36cac6102 100644 --- a/yuthon_account_report/models/financial_sheet_collection.py +++ b/yuthon_account_report/models/financial_sheet_collection.py @@ -1,4 +1,4 @@ -from datetime import datetime +import datetime from odoo import models, fields, api @@ -90,5 +90,96 @@ class FinancialSheetLine(models.Model): same_last_year = fields.Integer(string='上年同期数') remake = fields.Text(string='说明') + def compute_total(self, date, company=None, employee=None): + """ + 计算指定条件的财务数据汇总 + + Args: + date: 截止日期(只汇总与date同年同月的数据) + company: 公司列表,默认为None + employee: 员工列表,默认为None + Returns: + dict: 汇总结果字典,第一层key为财务项ID,第二层key为公司ID_数字的组合 + """ + # 使用None作为默认参数,避免可变默认参数的陷阱 + company = company or [] + if company == 0: + company = [] + employee = employee or [] + if employee == 0: + employee = [] + + # 构建查询条件 + domain = [('create_date', '<=', date)] + if company: + domain.append(('sheet_id.company_id', 'in', company)) + if employee: + domain.append(('employee_ids', 'in', employee)) + + # 执行查询 + cons = self.search(domain) + sum_total = {} + date_obj = datetime.datetime.strptime(date, "%Y-%m-%d").date() + # 获取目标年月 + target_year = date_obj.year or None + target_month = date_obj.month or None + + for con in cons: + # 只处理同年同月的数据 + if target_year and target_month: + if con.create_date.year != target_year or con.create_date.month != target_month: + continue + + collection_id = con.collection_id + company_id = con.sheet_id.company_id + + # 确保财务项字典存在 + collection_dict = sum_total.setdefault(collection_id, {}) + + # 定义新key的基础部分 + base_key = str(company_id) + + # 定义各个新key + key_101 = f"{base_key}101" # 本期数 + key_102 = f"{base_key}102" # 上年同期数 + key_103 = f"{base_key}103" # 同比增长率 + key_104 = f"{base_key}104" # 备注 + + # 初始化各个key的值(如果不存在) + if key_101 not in collection_dict: + collection_dict[key_101] = 0 # 本期数 + if key_102 not in collection_dict: + collection_dict[key_102] = 0 # 上年同期数 + if key_104 not in collection_dict: + collection_dict[key_104] = [] # 备注列表 + # key_103不初始化,将在计算后设置 + + # 累加数据 + collection_dict[key_101] += con.this_issue_number + collection_dict[key_102] += con.same_last_year + if con.remake: + collection_dict[key_104].append(con.remake) + + # 计算同比增长率(仅当上年同期数大于0时) + if collection_dict[key_102] > 0: + growth_rate = round(collection_dict[key_101] / collection_dict[key_102] * 100, 2) + collection_dict[key_103] = growth_rate + else: + # 如果上年同期数为0或负数,增长率为None + collection_dict[key_103] = None + + # 将备注列表转换为字符串 + for collection_dict in sum_total.values(): + keys_to_remove = [] + for key, value in collection_dict.items(): + if key.endswith("104") and isinstance(value, list): + # 去重并拼接备注 + unique_remarks = [] + for remark in value: + if remark and remark not in unique_remarks: + unique_remarks.append(remark) + collection_dict[key] = '/'.join(unique_remarks) if unique_remarks else '' + + return sum_total diff --git a/yuthon_account_report/static/src/js/financial.js b/yuthon_account_report/static/src/js/financial.js index e0c1dc34e..8ab7d5b2f 100644 --- a/yuthon_account_report/static/src/js/financial.js +++ b/yuthon_account_report/static/src/js/financial.js @@ -35,7 +35,9 @@ class FinancialPage extends Component { employeeName: "所有员工" }, pageTitle: "各公司主要财务数据", - setting: {type: 'default'}, + setting: { + type: 'default', + }, loading: false, demo: { companyGroups: [ @@ -43,10 +45,10 @@ class FinancialPage extends Component { 'id': 1, 'groupName': "天河投资", 'items': [ - {'id': 101, 'name': "本期数", 'fieldType': "万元"}, - {'id': 102, 'name': "上年同期", 'fieldType': "万元"}, - {'id': 103, 'name': "增幅", 'fieldType': "%"}, - {'id': 104, 'name': "说明"} + {'id': '101', 'name': "本期数", 'fieldType': "万元"}, + {'id': '102', 'name': "上年同期", 'fieldType': "万元"}, + {'id': '103', 'name': "增幅", 'fieldType': "%"}, + {'id': '104', 'name': "说明"} ] } ], @@ -55,56 +57,139 @@ class FinancialPage extends Component { id: 1, name: '资产总额', values: { - 101: "10000.00", - 102: "2000.00", - 103: "1500.00", - 104: "说明1", - 201: "8000.00", - 202: "1000.00", - 203: "800.00", - 204: "说明2" + '101': "10000.00", + '102': "2000.00", + '103': "1500.00", + '104': "说明1", } }, { id: 2, name: '本年营业收入', values: { - 101: "5000.00", - 102: "1200.00", - 103: "800.00", - 104: "说明3", - 201: "4000.00", - 202: "900.00", - 203: "600.00", - 204: "说明4" + '101': "5000.00", + '102': "1200.00", + '103': "800.00", + '104': "说明3", } }, { id: 3, name: '本年利润总额', values: { - 101: "3000.00", - 102: "800.00", - 103: "500.00", - 104: "说明5", - 201: "2000.00", - 202: "600.00", - 203: "400.00", - 204: "说明6" + '101': "3000.00", + '102': "800.00", + '103': "500.00", + '104': "说明5", } } ] - } + }, + companys : [ + {id:0, name:'所有公司'} + ], + staffs : [ + {id:0, name:'所有员工'} + ], + items : [ + {'id': '101', 'name': "本期数", 'fieldType': "万元"}, + {'id': '102', 'name': "上年同期", 'fieldType': "万元"}, + {'id': '103', 'name': "增幅", 'fieldType': "%"}, + {'id': '104', 'name': "说明"} + ], + fixedGroups : [ + { + id: this.FIXED_GROUP_IDS.TOTAL, + groupName: "合计", + items: [ + {id: 'A101', name: "本期数", fieldType: "万元"}, + {id: 'A102', name: "上年同期", fieldType: "万元"}, + {id: 'A103', name: "增幅", fieldType: "%"}, + {id: 'A104', name: "说明"} + ] + }, + { + id: this.FIXED_GROUP_IDS.BUDGET, + groupName: "本年度预算", + items: [ + {id: 'B101', name: "预测财局下达目标", fieldType: "万元"}, + {id: 'B102', name: "完成率", fieldType: "%"}, + {id: 'B103', name: "集团目标", fieldType: "%"}, + {id: 'B104', name: "完成率", fieldType: "%"} + ] + } + ], + companyGroups: [] }); onMounted(async () => { + }); onWillStart(async () => { + const companys = await this.orm.searchRead( + 'res.company', + [], + ['id', 'name'] + ); + this.gethearder(companys) + await this.getstaffs() await this.loadInitialData(); }); } + async getstaffs(){ + const staffs = await this.orm.searchRead( + 'financial.sheet.collection', + [], + ['id', 'employee_id'] + ); + staffs.forEach(re=>{ + if(re.employee_id){ + this.state.staffs.push({ + id: re.employee_id[0], + name: re.employee_id[1] + }) + } + }) + } + + gethearder(companys) { + if(this.state.filters.company != '所有公司' && this.state.filters.company){ + this.state.companyGroups = [] + } + this.state.companys = [{id:0, name:'所有公司'}] + companys.forEach(re => { + // 创建新的 items 数组,避免修改原始数据 + const coms = this.state.items.map(item => ({ + ...item, + id: `${re.id}${item.id}` // 创建新的 ID + })); + if(this.state.filters.company != '所有公司' && this.state.filters.company){ + if(re.id === this.state.filters.company * 1){ + this.state.pageTitle = re.name + '主要财务数据' + this.state.companyGroups.push({ + id: re.id, + groupName: re.name, + items: coms + }); + } + }else{ + this.state.pageTitle = '各公司主要财务数据' + this.state.companyGroups.push({ + id: re.id, + groupName: re.name, + items: coms + }); + } + this.state.companys.push({ + id: re.id, + name: re.name + }); + }); + this.state.tableData.displayHeaders = [...this.state.companyGroups, ...this.state.fixedGroups]; + } + getCurrentDate() { const today = new Date(); const year = today.getFullYear(); @@ -114,76 +199,22 @@ class FinancialPage extends Component { } async loadInitialData() { - try { - const settings = await this.orm.searchRead( + const settings = await this.orm.searchRead( 'sheet.collection.setting', [], - ['id', 'name', 'type'], - {limit: 1} + ['id', 'name'], + {order: 'sequence'} ); - - if (settings.length > 0) { - this.state.setting = settings[0]; - this.state.pageTitle = settings[0].name; - await this.loadTableData(settings[0].id); - } else { - await this.loadDefaultData(); - } - } catch (error) { + if (settings.length > 0) { + await this.loadTableData(settings); + } else { await this.loadDefaultData(); } } async loadDefaultData() { - this.state.pageTitle = "各公司主要财务数据"; - this.state.setting = {type: 'default'}; - - try { - // 通过RPC调用后端接口 - const companyGroups = await this.rpc('/get/account/title'); - - const rawRows = await this.rpc('/get/account/project'); - - if (companyGroups && rawRows && companyGroups.length > 0 && rawRows.length > 0) { - // 固定分组(合计和预算) - const fixedGroups = [ - { - id: this.FIXED_GROUP_IDS.TOTAL, - groupName: "合计", - items: [ - {id: 10001, name: "本期数", fieldType: "万元"}, - {id: 10002, name: "上年同期", fieldType: "万元"}, - {id: 10003, name: "增幅", fieldType: "%"}, - {id: 10004, name: "说明"} - ] - }, - { - id: this.FIXED_GROUP_IDS.BUDGET, - groupName: "本年度预算", - items: [ - {id: 20001, name: "预测财局下达目标", fieldType: "万元"}, - {id: 20002, name: "完成率", fieldType: "%"}, - {id: 20003, name: "集团目标", fieldType: "%"}, - {id: 20004, name: "完成率", fieldType: "%"} - ] - } - ]; - - // 合并分组,确保固定分组在最后 - this.state.tableData.displayHeaders = [...companyGroups, ...fixedGroups]; - - // 计算并添加合计数据 - const rowsWithTotals = this.calculateTotals(rawRows, companyGroups); - this.state.tableData.rows = rowsWithTotals; - } else { - // 如果后端没有返回数据,使用demo数据 - this.useDemoData(); - } - } catch (error) { - console.error("加载数据失败:", error); - // 如果RPC调用失败,使用demo数据 - this.useDemoData(); - } + // 如果后端没有返回数据,使用demo数据 + await this.useDemoData(); } // 添加一个使用demo数据的辅助方法 @@ -196,20 +227,20 @@ class FinancialPage extends Component { id: this.FIXED_GROUP_IDS.TOTAL, groupName: "合计", items: [ - {id: 10001, name: "本期数", fieldType: "万元"}, - {id: 10002, name: "上年同期", fieldType: "万元"}, - {id: 10003, name: "增幅", fieldType: "%"}, - {id: 10004, name: "说明"} + {id: 'A101', name: "本期数", fieldType: "万元"}, + {id: 'A102', name: "上年同期", fieldType: "万元"}, + {id: 'A103', name: "增幅", fieldType: "%"}, + {id: 'A104', name: "说明"} ] }, { id: this.FIXED_GROUP_IDS.BUDGET, groupName: "本年度预算", items: [ - {id: 20001, name: "预测财局下达目标", fieldType: "万元"}, - {id: 20002, name: "完成率", fieldType: "%"}, - {id: 20003, name: "集团目标", fieldType: "%"}, - {id: 20004, name: "完成率", fieldType: "%"} + {id: 'B101', name: "预测财局下达目标", fieldType: "万元"}, + {id: 'B102', name: "完成率", fieldType: "%"}, + {id: 'B103', name: "集团目标", fieldType: "%"}, + {id: 'B104', name: "完成率", fieldType: "%"} ] } ]; @@ -230,349 +261,152 @@ class FinancialPage extends Component { */ calculateTotals(rows, companyGroups) { return rows.map(row => { + // 确保 row.values 存在 + const rowValues = row.values || {}; const newRow = { id: row.id, name: row.name, - values: {...row.values} + values: { ...rowValues } // 浅拷贝原始值 }; - // 提取每个公司的本期数ID + // 计算固定分组的值 const currentPeriodIds = []; - companyGroups.forEach(group => { - const currentPeriodItem = group.items.find(item => item.name === "本期数"); - if (currentPeriodItem) { - currentPeriodIds.push(currentPeriodItem.id); - } - }); - - // 提取每个公司的上年同期ID const lastYearIds = []; + companyGroups.forEach(group => { - const lastYearItem = group.items.find(item => item.name === "上年同期"); - if (lastYearItem) { - lastYearIds.push(lastYearItem.id); - } + // 查找每个公司的本期数和上年同期数字段 + group.items.forEach(item => { + if (item.id.endsWith('101')) { + currentPeriodIds.push(item.id); + } else if (item.id.endsWith('102')) { + lastYearIds.push(item.id); + } + }); }); - // 计算本期数合计 + // 计算合计 let totalCurrentPeriod = 0; + let totalLastYear = 0; + currentPeriodIds.forEach(id => { const value = parseFloat(newRow.values[id]) || 0; totalCurrentPeriod += value; }); - // 计算上年同期合计 - let totalLastYear = 0; lastYearIds.forEach(id => { const value = parseFloat(newRow.values[id]) || 0; totalLastYear += value; }); - // 添加合计数据 - newRow.values[1001] = totalCurrentPeriod.toFixed(2); // 合计本期数 - newRow.values[1002] = totalLastYear.toFixed(2); // 合计上年同期 + // 设置合计值 + // 使用固定分组的字段 ID + newRow.values['A101'] = totalCurrentPeriod.toFixed(2); + newRow.values['A102'] = totalLastYear.toFixed(2); - // 计算增幅(本期数合计/上年同期合计 - 1) + // 计算增幅 let increaseRate = "0.00"; if (totalLastYear !== 0) { increaseRate = ((totalCurrentPeriod - totalLastYear) / totalLastYear * 100).toFixed(2); } - newRow.values[10003] = increaseRate; - newRow.values[10004] = "合计说明"; // 合计说明 + newRow.values['A103'] = increaseRate; + newRow.values['A104'] = rowValues['A104'] || "合计说明"; - // 预算相关数据可以留空或设置默认值 - newRow.values[20001] = ""; // 预测财局下达目标 - newRow.values[20002] = ""; // 完成率 - newRow.values[20003] = ""; // 集团目标 - newRow.values[20004] = ""; // 完成率 + // 设置预算相关字段 + newRow.values['B101'] = rowValues['B101'] || ""; + newRow.values['B102'] = rowValues['B102'] || ""; + newRow.values['B103'] = rowValues['B103'] || ""; + newRow.values['B104'] = rowValues['B104'] || ""; return newRow; }); } - async loadTableData(settingId) { + async loadTableData(settings) { try { this.state.loading = true; - const headers = await this.orm.searchRead( - 'sheet.collection.setting.header', - [['setting_id', '=', settingId]], - ['id', 'sequence', 'group_name', 'vertical_header_name'], - {order: 'sequence'} + // 获取数据 + const processedSettings = await this.consolidatedstatements(settings); + + // 计算并添加合计数据 + const rowsWithTotals = this.calculateTotals( + processedSettings, + this.state.companyGroups ); - const headerItems = await this.orm.searchRead( - 'sheet.collection.setting.header.item', - [['header_id.setting_id', '=', settingId]], - ['id', 'header_id', 'sequence', 'name', 'field_type'], - {order: 'sequence'} - ); - - const dataRows = await this.orm.searchRead( - 'sheet.collection.setting.data', - [['setting_id', '=', settingId]], - ['id', 'sequence', 'name'], - {order: 'sequence'} - ); - - const dataValues = await this.orm.searchRead( - 'sheet.collection.setting.data.value', - [['data_id.setting_id', '=', settingId]], - ['id', 'data_id', 'header_item_id', 'value'] - ); - - // 处理数据并确保合计和预算在最后 - await this.processAndCalculateData(headers, headerItems, dataRows, dataValues); - + this.state.tableData.rows = rowsWithTotals; } catch (error) { - await this.loadDefaultData(); + console.error('Error loading table data:', error); + // 出错时使用 demo 数据 + await this.useDemoData(); } finally { this.state.loading = false; } } - /** - * 处理数据并计算合计 - */ - async processAndCalculateData(headers, headerItems, dataRows, dataValues) { - const settingType = this.state.setting.type || 'default'; - - if (settingType === 'default') { - // 分离公司分组和固定分组 - const companyHeaders = headers.filter(header => - header.group_name !== "合计" && header.group_name !== "本年度预算" + async consolidatedstatements(settings) { + try { + let soup = {date: this.state.filters.date} + if(this.state.filters.company != '所有公司' && this.state.filters.company) { + soup['company'] = [this.state.displayInfo.companyId * 1] + } + if(this.state.filters.employee != '所有员工' && this.state.filters.employee){ + soup['employee'] = [this.state.displayInfo.employee * 1] + } + const result = await this.orm.call( + 'financial.sheet.line', + 'compute_total', + [[]], + { date: this.state.filters.date } ); + // result 是一个对象,不是数组 + if (result && Object.keys(result).length > 0) { + // 确保每个设置项都有 values 对象 - const totalHeader = headers.find(header => header.group_name === "合计"); - const budgetHeader = headers.find(header => header.group_name === "本年度预算"); - - // 处理公司分组 - const companyGroups = []; - companyHeaders.forEach(header => { - const items = headerItems.filter(item => item.header_id[0] === header.id); - if (items.length > 0) { - companyGroups.push({ - id: header.id, - groupName: header.group_name, - items: items.map(item => ({ - id: item.id, - name: item.name, - fieldType: item.field_type - })) - }); - } - }); - - // 处理固定分组 - const fixedGroups = []; - - // 处理合计分组 - if (totalHeader) { - const totalItems = headerItems.filter(item => item.header_id[0] === totalHeader.id); - if (totalItems.length > 0) { - fixedGroups.push({ - id: this.FIXED_GROUP_IDS.TOTAL, - groupName: totalHeader.group_name, - items: totalItems.map(item => ({ - id: item.id, - name: item.name, - fieldType: item.field_type - })) - }); - } + return settings.map(res => { + return { + ...res, + values: result[res.id] || {} // 如果 result 中没有对应 ID,返回空对象 + }; + }); } - // 处理预算分组 - if (budgetHeader) { - const budgetItems = headerItems.filter(item => item.header_id[0] === budgetHeader.id); - if (budgetItems.length > 0) { - fixedGroups.push({ - id: this.FIXED_GROUP_IDS.BUDGET, - groupName: budgetHeader.group_name, - items: budgetItems.map(item => ({ - id: item.id, - name: item.name, - fieldType: item.field_type - })) - }); - } - } - - // 如果没有固定分组,添加默认的 - if (fixedGroups.length === 0) { - fixedGroups.push(...[ - { - id: this.FIXED_GROUP_IDS.TOTAL, - groupName: "合计", - items: [ - {id: 10001, name: "本期数", fieldType: "万元"}, - {id: 10002, name: "上年同期", fieldType: "万元"}, - {id: 10003, name: "增幅", fieldType: "%"}, - {id: 10004, name: "说明"} - ] - }, - { - id: this.FIXED_GROUP_IDS.BUDGET, - groupName: "本年度预算", - items: [ - {id: 20001, name: "预测财局下达目标", fieldType: "万元"}, - {id: 20002, name: "完成率", fieldType: "%"}, - {id: 20003, name: "集团目标", fieldType: "%"}, - {id: 20004, name: "完成率", fieldType: "%"} - ] - } - ]); - } - - // 合并分组,确保固定分组在最后 - this.state.tableData.displayHeaders = [...companyGroups, ...fixedGroups]; - - // 处理行数据并计算合计 - this.processRowsWithTotals(dataRows, dataValues, companyGroups, fixedGroups); - - } else { - // 其他类型的处理逻辑 - this.processHeadersForOtherTypes(headers, headerItems); - this.processRows(dataRows, dataValues, headerItems); - } - - this.state.tableData.headers = headers; - } - - /** - * 处理行数据并计算合计 - */ - processRowsWithTotals(dataRows, dataValues, companyGroups, fixedGroups) { - const rows = []; - - // 首先获取原始数据 - dataRows.forEach(dataRow => { - const rowData = { - id: dataRow.id, - name: dataRow.name, + // 如果没有数据,返回带有空 values 的设置项 + return settings.map(res => ({ + ...res, values: {} - }; - - const rowValues = dataValues.filter(v => v.data_id[0] === dataRow.id); - - // 收集所有公司的数据 - companyGroups.forEach(group => { - group.items.forEach(item => { - const valueRecord = rowValues.find(v => v.header_item_id[0] === item.id); - rowData.values[item.id] = valueRecord ? valueRecord.value : '0.00'; - }); - }); - - // 收集固定分组的数据(如果后端提供了) - const totalGroup = fixedGroups.find(g => g.groupName === "合计"); - const budgetGroup = fixedGroups.find(g => g.groupName === "本年度预算"); - - if (totalGroup) { - totalGroup.items.forEach(item => { - const valueRecord = rowValues.find(v => v.header_item_id[0] === item.id); - if (valueRecord) { - rowData.values[item.id] = valueRecord.value; - } - }); - } - - if (budgetGroup) { - budgetGroup.items.forEach(item => { - const valueRecord = rowValues.find(v => v.header_item_id[0] === item.id); - if (valueRecord) { - rowData.values[item.id] = valueRecord.value; - } - }); - } - - rows.push(rowData); - }); - - // 计算合计并添加到行数据 - const rowsWithTotals = this.calculateTotals(rows, companyGroups); - this.state.tableData.rows = rowsWithTotals; - } - - /** - * 处理其他类型的表头 - */ - processHeadersForOtherTypes(headers, headerItems) { - const settingType = this.state.setting.type || 'default'; - - if (settingType === 'horizontal') { - // 横向表头:所有项平铺 - const flatHeaders = []; - - headers.forEach(header => { - const items = headerItems.filter(item => item.header_id[0] === header.id); - items.forEach(item => { - flatHeaders.push({ - id: item.id, - name: item.name, - fieldType: item.field_type, - groupName: header.group_name - }); - }); - }); - - this.state.tableData.displayHeaders = flatHeaders; - - } else if (settingType === 'vertical') { - // 竖向表头:表头在左侧 - const verticalHeaders = []; - - headers.forEach(header => { - verticalHeaders.push({ - id: header.id, - name: header.vertical_header_name || header.group_name, - type: 'vertical' - }); - }); - - this.state.tableData.displayHeaders = verticalHeaders; - } - } - - /** - * 处理行数据(用于非默认类型) - */ - processRows(dataRows, dataValues, headerItems) { - const rows = []; - - dataRows.forEach(dataRow => { - const rowData = { - id: dataRow.id, - name: dataRow.name, + })); + } catch (error) { + console.error('Error in consolidatedstatements:', error); + // 出错时返回带有空 values 的设置项 + return settings.map(res => ({ + ...res, values: {} - }; - - // 收集该行的所有数据值 - const rowValues = dataValues.filter(v => v.data_id[0] === dataRow.id); - - headerItems.forEach(item => { - const valueRecord = rowValues.find(v => v.header_item_id[0] === item.id); - rowData.values[item.id] = valueRecord ? valueRecord.value : '0.00'; - }); - - rows.push(rowData); - }); - - this.state.tableData.rows = rows; - } + })); + } +} // 查询按钮点击事件 async onSearch() { - // 更新显示信息 this.state.displayInfo.reportDate = this.state.filters.date || this.getCurrentDate(); - this.state.displayInfo.companyName = this.state.filters.company || "所有公司"; - this.state.displayInfo.employeeName = this.state.filters.employee || "所有员工"; - + this.state.displayInfo.companyId = this.state.filters.company || "所有公司"; + this.state.displayInfo.employeeId = this.state.filters.employee || "所有员工"; // 如果有筛选条件,可以重新加载数据 - if (this.state.filters.company || this.state.filters.employee) { - await this.loadTableData(this.state.setting.id); + if (this.state.filters.company != '所有公司' && this.state.filters.company) { + const companys = await this.orm.searchRead( + 'res.company', + [], + ['id', 'name'] + ); + await this.gethearder(companys) + await this.loadInitialData(); + }else if(this.state.filters.employee != '所有员工' && this.state.filters.employee){ + await this.loadInitialData(); } + + } // 重置筛选条件 diff --git a/yuthon_account_report/static/src/xml/financial.xml b/yuthon_account_report/static/src/xml/financial.xml index f584d86fd..3a923dbb7 100644 --- a/yuthon_account_report/static/src/xml/financial.xml +++ b/yuthon_account_report/static/src/xml/financial.xml @@ -27,10 +27,9 @@ id="company_filter" t-model="state.filters.company" > - - - - + + + @@ -42,10 +41,9 @@ id="employee_filter" t-model="state.filters.employee" > - - - - + + + @@ -144,121 +142,6 @@ - - - - - - - - - - - - - -
-
-
公司
-
项目
-
- - - - - - - - - - - -
- -
- - - -
- - - - - -
- - -
- () -
-
-
- -
- -
- - - - - -
-
-
公司
-
项目
-
- - - -
- - -
- () -
-
-
- -
- -
-
- - - - - -
-
-
公司
-
项目
-
- - - -
- -
- -
- -
- - - - - -
-
-
公司
-
项目
-
- - -
数据
- - -
@@ -283,42 +166,6 @@
- - - - - -
- -
- - - - - - - - -
- - - - - - -
- -
- - - - - - - - -
- diff --git a/yuthon_account_report/views/custom.xml b/yuthon_account_report/views/custom.xml index 5eeb9804d..fd9cf7032 100644 --- a/yuthon_account_report/views/custom.xml +++ b/yuthon_account_report/views/custom.xml @@ -11,6 +11,17 @@ + + + + + + + + + + +