!9041 !9040 Merge branch 'dev' of <a href="https://gitee.com/jinan-pengyusen…

Merge pull request !9041 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-02-26 13:22:10 +00:00
committed by Gitee
4 changed files with 144 additions and 1 deletions
@@ -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'
@@ -186,4 +186,13 @@
<field name="state">code</field>
<field name="code">action = model.add_office_supplies()</field>
</record>
<record id="export_inventory_report_action" model="ir.actions.server">
<field name="name">导出盘点表</field>
<field name="model_id" ref="maintenance.model_maintenance_equipment"/>
<field name="binding_model_id" ref="maintenance.model_maintenance_equipment"/>
<field name="binding_view_types">list</field>
<field name="state">code</field>
<field name="code">action = model.export_inventory_report()</field>
</record>
</odoo>
+6 -1
View File
@@ -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')