From fb7a9066c3292094debbe0a8d6404251c8d0ba45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 27 Feb 2026 18:16:33 +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=EF=BC=8C=E5=85=A5=E5=BA=93=E5=80=9F=E7=94=A8=E9=A2=86?= =?UTF-8?q?=E7=94=A8=E4=BB=93=E5=BA=93=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/inherit_maintenance_equipment.py | 89 ++++++++++++------ .../static/tmpl/gudingzichanpandianbiao.xlsx | Bin 9791 -> 12874 bytes yuthon_stock/models/inherit_stock_move.py | 2 + yuthon_stock/models/inherit_stock_picking.py | 41 +++++++- yuthon_stock/views/inherit_stock_picking.xml | 4 + 5 files changed, 103 insertions(+), 33 deletions(-) diff --git a/yuthon_maintain/models/inherit_maintenance_equipment.py b/yuthon_maintain/models/inherit_maintenance_equipment.py index f4e58720e..cd72e0355 100644 --- a/yuthon_maintain/models/inherit_maintenance_equipment.py +++ b/yuthon_maintain/models/inherit_maintenance_equipment.py @@ -100,19 +100,49 @@ class InheritMaintenanceEquipment(models.Model): workbook = load_workbook(template_path) sheet = workbook.active + # 统计导出数据中最常见的年月(用于标题) + year_month_list = [] + for record in equipment_records: + if record.purchase_date: + year_month_list.append((record.purchase_date.year, record.purchase_date.month)) + + if year_month_list: + # 取出现次数最多的年月 + from collections import Counter + most_common_ym = Counter(year_month_list).most_common(1)[0][0] + title_year, title_month = most_common_ym + else: + # 如果没有购入日期,使用当前年月 + now = datetime.datetime.now() + title_year, title_month = now.year, now.month + + # 修改A1单元格:生成动态标题 + title_text = f'{title_year}年{title_month}月固定资产盘点表' + sheet['A1'] = title_text + sheet['A1'].alignment = Alignment(horizontal='left', vertical='center') + + # 修改K1单元格:生成制表人信息(直接替换,不追加) + current_date = datetime.datetime.now().strftime('%Y-%m-%d') + k1_text = f'制表人:叶华锋 {current_date}' + sheet['K1'] = k1_text + sheet['K1'].alignment = Alignment(horizontal='left', vertical='center') + # 从第3行开始写入数据(第1-2行是表头) row = 3 - # 设置列宽(A列序号列设置为较窄,C列型号列也设置较窄) - sheet.column_dimensions['A'].width = 6 # 序号列宽度 - sheet.column_dimensions['C'].width = 12 # 型号列宽度 + # 设置列宽 + sheet.column_dimensions['A'].width = 6 # 序号列 + sheet.column_dimensions['B'].width = 20 # 资产编号列(加宽) + sheet.column_dimensions['C'].width = 30 # 设备名称列(加宽) + sheet.column_dimensions['D'].width = 12 # 型号列 + sheet.column_dimensions['K'].width = 25 # 制表人列(确保内容完整显示) # 获取模板样式行(使用第3行作为参考) template_row_idx = 3 if sheet.max_row >= template_row_idx: # 先保存第3行的样式 template_styles = {} - for col in range(1, 11): # A到J列(10列) + for col in range(1, 12): # A到K列(11列) cell = sheet.cell(row=template_row_idx, column=col) template_styles[col] = { 'font': copy(cell.font), @@ -132,54 +162,57 @@ class InheritMaintenanceEquipment(models.Model): for merged_range_str in merged_cells_to_unmerge: sheet.unmerge_cells(merged_range_str) - # 先为所有列应用模板样式 - for col in range(1, 11): # A到J列 + # 先为所有列应用模板样式并统一居中对齐 + for col in range(1, 12): # A到K列 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 = Alignment(horizontal='center', vertical='center') + # 统一设置居中对齐 + cell.alignment = Alignment(horizontal='center', vertical='center') # A列:序号(从1开始) sheet.cell(row=row, column=1, value=index) - # B列:设备名称 - sheet.cell(row=row, column=2, value=record.name or '') + # B列:资产编号 + sheet.cell(row=row, column=2, value=record.serial_no or '') - # C列:型号 - sheet.cell(row=row, column=3, value=record.model or '') + # C列:设备名称 + sheet.cell(row=row, column=3, value=record.name or '') - # D列:原值 - sheet.cell(row=row, column=4, value=record.cost or 0) + # D列:型号 + sheet.cell(row=row, column=4, value=record.model or '') - # E列:寿命 + # E列:原值 + sheet.cell(row=row, column=5, value=record.cost or 0) + + # F列:寿命 warranty_date = '' if record.warranty_date: warranty_date = record.warranty_date.strftime('%Y-%m-%d') - sheet.cell(row=row, column=5, value=warranty_date) + sheet.cell(row=row, column=6, value=warranty_date) - # F列:设备状态 + # G列:设备状态 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) + sheet.cell(row=row, column=7, 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.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.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.category_id.name if record.category_id else '') - # J列:公司(company 字段) + # K列:公司(company 字段) company = '' if record.company: company = dict(record._fields['company'].selection).get(record.company, '') - sheet.cell(row=row, column=10, value=company) + sheet.cell(row=row, column=11, value=company) # 设置最小行高,确保内容显示完整 if not sheet.row_dimensions[row].height or sheet.row_dimensions[row].height < 30: @@ -193,8 +226,8 @@ class InheritMaintenanceEquipment(models.Model): output.seek(0) excel_data = base64.b64encode(output.read()) - # 创建附件 - filename = f'固定资产盘点表_{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.xlsx' + # 创建附件(文件名只包含日期,不含时分秒) + filename = f'固定资产盘点表_{datetime.datetime.now().strftime("%Y%m%d")}.xlsx' attachment = self.env['ir.attachment'].create({ 'name': filename, 'type': 'binary', diff --git a/yuthon_property/static/tmpl/gudingzichanpandianbiao.xlsx b/yuthon_property/static/tmpl/gudingzichanpandianbiao.xlsx index 6a8a70b888cea7d56b8c8ab4992976d7e69807a8..5cf4559ef20d2c901cd5605b83ac40edc64da833 100644 GIT binary patch delta 9152 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', 0) # 只查询有库存的 ]) record.available_product_ids = quants.mapped('product_id') else: record.available_product_ids = False + + @api.depends('picking_type_code') + def _compute_available_location_ids(self): + """根据作业类型计算可用仓库列表""" + for record in self: + # 如果是入库单,不限制仓库选择 + if record.picking_type_code == 'incoming': + record.available_location_ids = self.env['stock.location'].search([]) + # 如果是借用/领用等,只显示有库存的仓库 + else: + quants = self.env['stock.quant'].search([ + ('quantity', '>', 0) + ]) + record.available_location_ids = quants.mapped('location_id') + + @api.onchange('user_id') def _onchange_user_id(self): if self.user_id: diff --git a/yuthon_stock/views/inherit_stock_picking.xml b/yuthon_stock/views/inherit_stock_picking.xml index 0892f669d..b29f956a6 100644 --- a/yuthon_stock/views/inherit_stock_picking.xml +++ b/yuthon_stock/views/inherit_stock_picking.xml @@ -8,6 +8,9 @@ + + [('id', 'in', available_location_ids)] + state != 'draft' and receipt_status in ['acceptance', 'certification'] @@ -18,6 +21,7 @@ +