Files
gzth/yuthon_will_task/models/yuthon_will_task.py
T
2025-04-14 20:32:25 +08:00

146 lines
7.9 KiB
Python

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='创建时间', default=fields.Date.today())
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='用户', store=True)
user_role_ids = fields.Many2many('soong.user.role', string='角色')
task_time_ids = fields.Many2many('yuthon.task.time', 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)
@api.onchange('employee_ids')
def _onchange_employee_ids(self):
user_ids = []
for employee in self.employee_ids:
if employee.user_id:
user_ids.append(employee.user_id.id)
self.users_ids = [(6, 0, user_ids)]
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.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))
menu_id = self.env['ir.ui.menu'].search([('name', '=', '我的日程')])
url = f'https://oa.thtzjt.com/web?oauth_access_token={employee_id.user_id.oauth_access_token}&oauth_uid={employee_id.user_id.oauth_uid}#action={menu_id.action.id}&model=yuthon.will.task&view_type=list&menu_id={menu_id.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))
menu_id = self.env['ir.ui.menu'].search([('name', '=', '我的日程')])
url = f'https://oa.thtzjt.com/web?oauth_access_token={employee_id.user_id.oauth_access_token}&oauth_uid={employee_id.user_id.oauth_uid}#action={menu_id.action.id}&model=yuthon.will.task&view_type=list&menu_id={menu_id.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,
}
}