from odoo import api, fields, models, modules import datetime from datetime import datetime, timedelta, time from odoo.exceptions import UserError import logging _logger = logging.getLogger(__name__) class YuthonWillTask(models.Model): _name = 'yuthon.will.task' _description = '日程' _rec_name = 'task_content' _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin'] priority = fields.Selection([('general', '不紧急不重要'), ('important', '重要不紧急'), ('urgent', '紧急不重要'), ('very_urgent', '重要且紧急')], string='优先级') task_type = fields.Many2one('task.type.setting', string='任务类型') task_content = fields.Text(string='任务内容') remarks = fields.Text(string='备注') creation_time = fields.Date(string='创建时间') employee_ids = fields.Many2many('hr.employee', 'will_task_employee_rel', 'custom_id', 'employee_id', string='人员', default=lambda self: self.env.user.employee_id) employee_ids2 = fields.Many2many('hr.employee', 'will_task_employee_rel2', 'custom_id', 'employee_id', string='司机', store=True) users_ids = fields.Many2many('res.users', string='用户') user_role_ids = fields.Many2many('soong.user.role', string='角色') task_time_ids = fields.Many2many('yuthon.task.time', string='提醒') yuthon_company = fields.Selection([('thtz', '集团本部'), ('thwg', '天河物管'), ('thlc', '天河粮储')], string='所属公司') start_time = fields.Datetime(string='开始时间', default=fields.Datetime.now) end_time = fields.Datetime(string='结束时间', default=lambda self: datetime.combine(datetime.now().date(), time(11, 0, 0))) state = fields.Selection([('will', '待办'), ('done', '已办'), ('cancel', '取消')], default='will', string='状态', store=True) def read_number(self): current_time = datetime.now() return self.search_count([ ('state', '=', 'will'), ('users_ids', 'in', self.env.user.id), ('end_time', '>', current_time) ]) @api.onchange('employee_ids') def onchange_employee_ids(self): for task in self: users = task.employee_ids.mapped('user_id') roles = task.employee_ids.mapped('user_role_id') task.yuthon_company = task.employee_ids[0].yuthon_company task.users_ids = users task.user_role_ids = roles def will_task_time(self): for i in self.search([('state', '=', 'will')]): if datetime.now() + timedelta(hours=8) > i.start_time: i.write({'state': 'done'}) for task in self.search([('state', '=', 'will')]): now = datetime.now() + timedelta(hours=8) start_time = task.start_time + timedelta(hours=8) _logger.info("定时任务执行中") _logger.info("判断前now:{}---start:{}".format(now, start_time)) if now <= start_time: _logger.info("判断后now:{}---start:{}".format(now, start_time)) if task.task_time_ids: for task_time in task.task_time_ids: duration = self._compute_duration(task_time) day_now = (now + duration).day day_start = start_time.day hour_now = (now + duration).hour hour_start = start_time.hour min_now = (now + duration).minute min_start = start_time.minute if day_now == day_start and hour_now == hour_start and min_now == min_start: task.add_comment() def _compute_duration(self, task_time): if task_time.task_unit == 'min': return timedelta(minutes=task_time.number) elif task_time.task_unit == 'hour': return timedelta(hours=task_time.number) elif task_time.task_unit == 'day': return timedelta(days=task_time.number) else: return timedelta.max def add_comment(self): self.ensure_one() employee_list = [i.id for i in self.employee_ids] + [i.id for i in self.employee_ids2] for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]): if not employee_id.wecom_userid: raise UserError("请同步{}的企业微信".format(employee_id.name)) url = "https://oa.thtzjt.com/mail/view?model={}&res_id={}".format(self._name, self.id) data_name = "事项名称: " + self.task_content + '\n' data_start_time = '开始时间:' + str(self.start_time + timedelta(hours=8)) + '\n' data_user_ids = '参与人: ' + ', '.join(self.employee_ids.mapped('name')) + '\n' data_employee_id = ('司机:' + ', '.join(self.employee_ids2.mapped('name')) + '\n') if self.employee_ids2 else '' data_nota = ('备注:' + self.remarks) if self.remarks else ('') + '\n' data = data_name + data_start_time + data_user_ids + data_nota + data_employee_id self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid, title="日程事项提醒", description=data, url=url, btntxt="详细信息") for record in self: partner_ids = record.employee_ids.user_id.partner_id.ids record.with_context(lang=record.env.lang)._message_auto_subscribe_notify(partner_ids,'yuthon_will_task.mail_action_yuthon_will_task_add_comment') def button_add_comment(self): self.add_comment() return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'type': 'success', 'message': '已发送提醒消息', 'sticky': False, } } def button_add_comment_cancel(self): self.write({'state': 'cancel'}) employee_list = [i.id for i in self.employee_ids] + [i.id for i in self.employee_ids2] for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]): if not employee_id.wecom_userid: raise UserError("请同步{}的企业微信".format(employee_id.name)) url = "https://oa.thtzjt.com/mail/view?model={}&res_id={}".format(self._name, self.id) self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid, title="日程事项提醒", description="事项名称: " + self.task_content + '\t' + '该事项已取消', url=url, btntxt="详细信息") for record in self: partner_ids = record.employee_ids.user_id.partner_id.ids record.with_context(lang=record.env.lang)._message_auto_subscribe_notify(partner_ids, 'yuthon_will_task.mail_action_yuthon_will_task_add_comment') return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'type': 'success', 'message': '已发送取消提醒消息', 'sticky': False, } }