From 7315fccd847f11e379dfc6b764a16c47ba1b65ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Thu, 26 Feb 2026 21:20:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E8=B5=84=E4=BA=A7=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/inherit_maintenance_equipment.py | 129 ++++++++++++++++++ .../views/maintenance_equipment_views.xml | 9 ++ .../static/tmpl/gudingzichanpandianbiao.xlsx | Bin 0 -> 9791 bytes yuthon_stock/models/inherit_stock_picking.py | 7 +- 4 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 yuthon_property/static/tmpl/gudingzichanpandianbiao.xlsx diff --git a/yuthon_maintain/models/inherit_maintenance_equipment.py b/yuthon_maintain/models/inherit_maintenance_equipment.py index 8333d9f5d..b2aeab175 100644 --- a/yuthon_maintain/models/inherit_maintenance_equipment.py +++ b/yuthon_maintain/models/inherit_maintenance_equipment.py @@ -5,6 +5,10 @@ import datetime import qrcode from io import BytesIO import base64 +from openpyxl import load_workbook +from openpyxl.styles import Alignment +from copy import copy +from odoo.modules import get_module_resource def generate_qr(data): qr = qrcode.QRCode( @@ -74,6 +78,131 @@ class InheritMaintenanceEquipment(models.Model): 'is_fixed_assets': True, }) + def export_inventory_report(self): + """导出固定资产盘点表""" + equipment_ids = self._context.get('active_ids', []) + if not equipment_ids: + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'title': '警告', + 'message': '请至少选择一条设备记录', + 'type': 'warning', + 'sticky': False, + } + } + + equipment_records = self.env['maintenance.equipment'].browse(equipment_ids) + + # 加载模板文件(模板在 yuthon_property 模块的 static/tmpl 目录下) + template_path = get_module_resource('yuthon_property', 'static', 'tmpl', 'gudingzichanpandianbiao.xlsx') + workbook = load_workbook(template_path) + sheet = workbook.active + + # 从第3行开始写入数据(第1-2行是表头) + row = 3 + + # 获取模板样式行(使用第3行作为参考) + template_row_idx = 3 + if sheet.max_row >= template_row_idx: + # 先保存第3行的样式 + template_styles = {} + for col in range(1, 11): # A到J列(10列) + cell = sheet.cell(row=template_row_idx, column=col) + template_styles[col] = { + 'font': copy(cell.font), + 'fill': copy(cell.fill), + 'border': copy(cell.border), + 'alignment': copy(cell.alignment), + } + else: + template_styles = {} + + for index, record in enumerate(equipment_records, start=1): + # 先解除当前行的合并单元格(如果有) + merged_cells_to_unmerge = [] + for merged_range in sheet.merged_cells.ranges: + if merged_range.min_row <= row <= merged_range.max_row: + merged_cells_to_unmerge.append(str(merged_range)) + for merged_range_str in merged_cells_to_unmerge: + sheet.unmerge_cells(merged_range_str) + + # 先为所有列应用模板样式 + for col in range(1, 11): # A到J列 + cell = sheet.cell(row=row, column=col) + if col in template_styles: + cell.font = copy(template_styles[col]['font']) + cell.fill = copy(template_styles[col]['fill']) + cell.border = copy(template_styles[col]['border']) + cell.alignment = copy(template_styles[col]['alignment']) + + # A列:序号(从1开始) + sheet.cell(row=row, column=1, value=index) + + # B列:设备名称 + sheet.cell(row=row, column=2, value=record.name or '') + + # C列:型号 + sheet.cell(row=row, column=3, value=record.model or '') + + # D列:原值 + sheet.cell(row=row, column=4, value=record.cost or 0) + + # E列:寿命 + warranty_date = '' + if record.warranty_date: + warranty_date = record.warranty_date.strftime('%Y-%m-%d') + sheet.cell(row=row, column=5, value=warranty_date) + + # F列:设备状态 + mainten_state = '' + if record.mainten_state: + mainten_state = dict(record._fields['mainten_state'].selection).get(record.mainten_state, '') + sheet.cell(row=row, column=6, value=mainten_state) + + # G列:员工 + sheet.cell(row=row, column=7, value=record.employee_id.name if record.employee_id else '') + + # H列:部门 + sheet.cell(row=row, column=8, value=record.department_id1.name if record.department_id1 else '') + + # I列:设备类别 + sheet.cell(row=row, column=9, value=record.category_id.name if record.category_id else '') + + # J列:公司 + sheet.cell(row=row, column=10, value=record.company_id.name if record.company_id else '') + + # 设置最小行高,确保内容显示完整 + if not sheet.row_dimensions[row].height or sheet.row_dimensions[row].height < 30: + sheet.row_dimensions[row].height = 30 + + row += 1 + + # 保存到内存 + output = BytesIO() + workbook.save(output) + output.seek(0) + excel_data = base64.b64encode(output.read()) + + # 创建附件 + filename = f'固定资产盘点表_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.xlsx' + attachment = self.env['ir.attachment'].create({ + 'name': filename, + 'type': 'binary', + 'datas': excel_data, + 'res_model': 'maintenance.equipment', + 'res_id': equipment_records[0].id, + 'mimetype': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }) + + # 返回下载链接 + return { + 'type': 'ir.actions.act_url', + 'url': f'/web/content/{attachment.id}?download=true', + 'target': 'self', + } + class MaintenanceEquipmentLine(models.Model): _name = 'maintenance.equipment.line' diff --git a/yuthon_maintain/views/maintenance_equipment_views.xml b/yuthon_maintain/views/maintenance_equipment_views.xml index b223d5e21..84c373bba 100644 --- a/yuthon_maintain/views/maintenance_equipment_views.xml +++ b/yuthon_maintain/views/maintenance_equipment_views.xml @@ -186,4 +186,13 @@ code action = model.add_office_supplies() + + + 导出盘点表 + + + list + code + action = model.export_inventory_report() + \ No newline at end of file diff --git a/yuthon_property/static/tmpl/gudingzichanpandianbiao.xlsx b/yuthon_property/static/tmpl/gudingzichanpandianbiao.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6a8a70b888cea7d56b8c8ab4992976d7e69807a8 GIT binary patch literal 9791 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 X$Vf`WL literal 0 HcmV?d00001 diff --git a/yuthon_stock/models/inherit_stock_picking.py b/yuthon_stock/models/inherit_stock_picking.py index a6b95e3ec..d25969e31 100644 --- a/yuthon_stock/models/inherit_stock_picking.py +++ b/yuthon_stock/models/inherit_stock_picking.py @@ -64,7 +64,7 @@ class StockPicking(models.Model): record.can_certify = True def read(self, fields=None, load='_classic_read'): - """重写read方法,打开验收状态的入库单时自动更新验收时间""" + """重写read方法,打开验收/证明状态的入库单时自动更新时间""" result = super(StockPicking, self).read(fields, load) # 导入Fields模块 from odoo import fields as odoo_fields @@ -74,6 +74,11 @@ class StockPicking(models.Model): record.write({ 'acceptance_date': odoo_fields.Datetime.now() }) + elif record.receipt_status == 'certification': + # 使用write方法更新证明时间 + record.write({ + 'certification_date': odoo_fields.Datetime.now() + }) return result @api.depends('location_id')