# -*- coding: utf-8 -*- from odoo import api, fields, models, _ from datetime import datetime import pytz class SoongNote(models.Model): _name = 'soong.note' name = fields.Char(string="审批意见") sequence = fields.Char(string='序号', store=True) note_setting_id = fields.Many2one('soong.note.setting', string="意见类型") create_note = fields.Text(string="创建信息", readonly=True) write_note = fields.Text(string="修改信息", readonly=True) use_info = fields.Text(string="使用信息", readonly=True) use_count = fields.Integer(string="使用次数", default=0, readonly=True) def _get_tz_now(self): """返回东八区当前时间字符串""" tz = pytz.timezone('Asia/Shanghai') return datetime.now(pytz.utc).astimezone(tz).strftime('%Y-%m-%d %H:%M:%S') @api.model_create_multi def create(self, vals_list): now = self._get_tz_now() user_name = self.env.user.name for vals in vals_list: note_name = vals.get('name', '') line = f"{user_name} {now} {note_name}" vals['create_note'] = line vals['write_note'] = line vals['use_count'] = 1 return super().create(vals_list) def write(self, vals): now = self._get_tz_now() user_name = self.env.user.name _TRACK_FIELDS = {'create_note', 'write_note', 'use_info'} for rec in self: vals_copy = dict(vals) # 有信息字段变化时追加 write_note 并计数 if 'name' in vals or not (_TRACK_FIELDS & set(vals)): note_name = vals.get('name', rec.name or '') line = f"{user_name} {now} {note_name}" old = rec.write_note or '' vals_copy['write_note'] = (old + '\n' + line) if old else line # 统计本次写入中有多少跟踪字段发生变化 changed = len(_TRACK_FIELDS & set(vals_copy)) if changed > 0: vals_copy['use_count'] = (rec.use_count or 0) + changed super(SoongNote, rec).write(vals_copy) return True def action_open_form(self): """详情按钮:以 target=new 方式打开 form""" self.ensure_one() return { 'type': 'ir.actions.act_window', 'name': '审批意见详情', 'res_model': 'soong.note', 'res_id': self.id, 'view_mode': 'form', 'target': 'new', } def action_reset(self): """重置按钮:清空使用次数、创建信息、修改信息、使用信息""" for rec in self: super(SoongNote, rec).write({ 'use_count': 0, 'create_note': False, 'write_note': False, 'use_info': False, }) return True # type = fields.Selection([('agree', '同意'), ('return', '退回'), ('refuse', '拒绝'), ('super', '督办')], # string="意见类型") # return_type = fields.Char(string="退回类型")