132 lines
8.4 KiB
Python
132 lines
8.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
from odoo import api, fields, models, tools
|
|
from odoo.exceptions import UserError, ValidationError
|
|
|
|
|
|
class YuthonConfirmUsers(models.Model):
|
|
_name = "yuthon.confirm.users"
|
|
_description = "公告确认信息"
|
|
_order = "employee_number asc"
|
|
|
|
employee_id = fields.Many2one('hr.employee', string='员工')
|
|
notice_id = fields.Many2one('yuthon.notice', string="公告名称")
|
|
notice_code = fields.Char(string="公告编号")
|
|
notice_name = fields.Char(string="公告名称")
|
|
state = fields.Selection([('to_sent', '待发送'), ('no', '待确认'), ('yes', '已确认')], string="状态")
|
|
create_time = fields.Datetime(string='创建时间', default=fields.Datetime.now)
|
|
release_date = fields.Date(string="发布日期")
|
|
msg_id = fields.Char(string="Msg_id")
|
|
|
|
# 从员工带出的字段
|
|
company_id = fields.Many2one(related='employee_id.company_id', string='公司', store=True)
|
|
department_id = fields.Many2one(related='employee_id.department_id', string='部门', store=True)
|
|
employee_number = fields.Char(related='employee_id.number', string='序号', store=True)
|
|
|
|
def view_send_logs(self):
|
|
"""从确认信息列表跳转查看对应的发送日志"""
|
|
notice_ids = self.mapped('notice_id').ids
|
|
if not notice_ids:
|
|
ctx_notice = self.env.context.get('default_notice_id')
|
|
if ctx_notice:
|
|
notice_ids = [ctx_notice]
|
|
domain = [('notice_id', 'in', notice_ids)] if notice_ids else []
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': '发送日志',
|
|
'res_model': 'yuthon.notice.send.log',
|
|
'view_mode': 'tree,form',
|
|
'domain': domain,
|
|
'context': {'default_notice_id': notice_ids[0] if notice_ids else False},
|
|
}
|
|
|
|
def withdrawn(self):
|
|
if self.state == 'to_sent':
|
|
raise UserError('该通知还未发送,无法撤回')
|
|
if self.msg_id:
|
|
self.sudo().env["wecom.apps"].back_message(self.msg_id, category='notice')
|
|
self.state = 'to_sent'
|
|
self.msg_id = '已撤回'
|
|
|
|
def all_withdrawn(self):
|
|
confirm_noice_ids = self.env["yuthon.confirm.users"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
|
for record in confirm_noice_ids:
|
|
if record.state == 'state':
|
|
raise UserError(f'{record.notice_id.name}通知还未发送,无法撤回')
|
|
record.withdrawn()
|
|
|
|
def sync_confirm_users_notices(self):
|
|
SendLog = self.env['yuthon.notice.send.log']
|
|
for record in self.search([('state', '=', 'no')]):
|
|
partner_ids = record.employee_id.user_id.partner_id.id
|
|
record.with_context(lang=record.env.lang)._message_auto_subscribe_notify(partner_ids, 'yuthon_notice.message_yuthon_confirm_users_data')
|
|
url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={record.employee_id.id}'
|
|
try:
|
|
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=record.employee_id.wecom_userid, title="通知公告",
|
|
description=f"您有一条【{record.notice_id.name}】的通知公告请尽快确认", url=url, btntxt="详细信息")
|
|
success = bool(result_data and result_data[0])
|
|
msg_id = result_data[1].get('msgid') if (result_data and isinstance(result_data[1], dict)) else False
|
|
SendLog.log_send(record.notice_id, record.employee_id, 'sync', success, msg_id=msg_id, confirm_user=record)
|
|
except Exception:
|
|
SendLog.log_send(record.notice_id, record.employee_id, 'sync', False, note='接口调用异常', confirm_user=record)
|
|
|
|
|
|
def reminders_notice(self):
|
|
SendLog = self.env['yuthon.notice.send.log']
|
|
confirm_noice_ids = self.env["yuthon.confirm.users"].browse(self._context.get('active_ids', self._context.get('active_id')))
|
|
i = 0
|
|
for rec in confirm_noice_ids:
|
|
url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={rec.employee_id.id}'
|
|
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=rec.employee_id.wecom_userid,
|
|
title="通知公告(催办)", description=f"您有一条【{rec.notice_id.name}】的通知公告请尽快确认",
|
|
url=url, btntxt="详细信息")
|
|
# sync_send_message_textcard 返回 (success, res_dict),失败/地址异常时 success=False
|
|
if not result_data:
|
|
rec.write({'msg_id': 'ERROR: 接口未返回结果'})
|
|
SendLog.log_send(self.notice_id, rec.employee_id, 'reminder', False, note='接口未返回结果', confirm_user=rec)
|
|
continue
|
|
success, res_dict = result_data
|
|
res_dict = res_dict or {}
|
|
if success and res_dict.get('errmsg') == 'ok':
|
|
rec.write({'msg_id': res_dict.get('msgid')})
|
|
i += 1
|
|
SendLog.log_send(self.notice_id, rec.employee_id, 'reminder', True, msg_id=res_dict.get('msgid'), confirm_user=rec)
|
|
else:
|
|
errcode = res_dict.get('errcode')
|
|
errmsg = res_dict.get('errmsg') or res_dict.get('error') or '未知错误'
|
|
rec.write({'msg_id': f'ERROR {errcode}: {errmsg}'})
|
|
SendLog.log_send(self.notice_id, rec.employee_id, 'reminder', False, note=f'ERROR {errcode}: {errmsg}', confirm_user=rec)
|
|
url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id=298'
|
|
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice',
|
|
touser='18562027762',
|
|
title="通知公告",
|
|
description="成功发送消息通知" + str(i),
|
|
url=url, btntxt="详细信息")
|
|
|
|
def reminders_notice_send(self):
|
|
SendLog = self.env['yuthon.notice.send.log']
|
|
confirm_noice_ids = self.env["yuthon.confirm.users"].browse(
|
|
self._context.get('active_ids', self._context.get('active_id')))
|
|
i = 0
|
|
for rec in confirm_noice_ids:
|
|
url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={rec.employee_id.id}'
|
|
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice',
|
|
touser=rec.employee_id.wecom_userid,
|
|
title="通知公告",
|
|
description=f"您有一条【{rec.notice_id.name}】待确认的通知公告请尽快确认",
|
|
url=url, btntxt="详细信息")
|
|
if result_data:
|
|
res_dict = result_data[1] or {}
|
|
rec.write({'msg_id': res_dict.get('msgid')})
|
|
if res_dict.get('errmsg') == 'ok':
|
|
i = i + 1
|
|
SendLog.log_send(rec.notice_id, rec.employee_id, 'resend', True, msg_id=res_dict.get('msgid'), confirm_user=rec)
|
|
else:
|
|
errcode = res_dict.get('errcode')
|
|
errmsg = res_dict.get('errmsg') or res_dict.get('error') or '未知错误'
|
|
SendLog.log_send(rec.notice_id, rec.employee_id, 'resend', False, note=f'ERROR {errcode}: {errmsg}', confirm_user=rec)
|
|
url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id=298'
|
|
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice',
|
|
touser='18562027762',
|
|
title="通知公告",
|
|
description="成功发送消息通知" + str(i),
|
|
url=url, btntxt="详细信息") |