Files
gzth/yuthon_wechat/models/hr_employee.py
T
2026-07-16 16:35:08 +08:00

123 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class HrDepartment(models.Model):
_inherit = "hr.department"
wecom_id = fields.Integer(string="企业微信部门id", readonly=True, default=0) # 部门id
wecom_name_en = fields.Char(string="企业微信英文名称", readonly=True, default="") # 英部门文名称
wecom_department_leader = fields.Char(string="企业微信部门负责人", readonly=True, default="[]")
wecom_order = fields.Integer(string="企业微信序号",readonly=True, default=0) # 在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)
wecom_parent_id = fields.Integer(string="企业微信部门父id", readonly=True, default=0) # 部门id
"""
name 否 部门名称。长度限制为1~64个UTF-8字符,字符不能包括\:*?"<>|
name_en 否 英文名称,需要在管理后台开启多语言支持才能生效。长度限制为1~64个字符,字符不能包括\:*?"<>|
parentid 否 父部门id
order 否 在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
"""
def send_wecom_employee(self):
sync_flag = True
sync_content = "同步失败:\n"
for record in self:
result_status, result_content = self.sudo().env["wecom.apps"].sync_department_update(
wecom_department_id=record.wecom_id,
name=record.name,
name_en=record.wecom_name_en,
parentid=record.wecom_parent_id if record.wecom_parent_id else record.parent_id.wecom_id,
)
if not result_status:
sync_flag = False
sync_content = sync_content + record.name + ":" + result_content + ";\n"
else:
record.wecom_id = result_content.get("id", 0)
if not sync_flag:
raise UserError(str(sync_content))
class HrEmployee(models.Model):
_inherit = "hr.employee"
wecom_userid = fields.Char(string="成员UserID", default="") # 成员UserID。对应管理端的帐号
bank_account = fields.Char(string="银行账号")
# todo 需要的字段整理到数据库
"""
errcode 返回码
errmsg 对返回码的文本描述内容
userlist 成员列表
userid 成员UserID。对应管理端的账号
name 成员名称;第三方不可获取,调用时返回userid以代替name;代开发自建应用需要管理员授权才返回;对于非第三方创建的成员,第三方通讯录应用也不可获取;未返回名称的情况需要通过通讯录展示组件来展示名字
mobile 手机号码,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
department 成员所属部门id列表,仅返回该应用有查看权限的部门id。对授权了“组织架构信息”的第三方应用或授权了“组织架构信息”-“部门及父部门ID、部门负责人”的代开发应用,返回成员所属的全部部门id列表
order 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32)
position 职务信息;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
gender 性别。0表示未定义,1表示男性,2表示女性。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段。注:不可获取指返回值为0
email 邮箱,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
biz_mail 企业邮箱,代开发自建应用不返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
is_leader_in_dept 表示在所在的部门内是否为部门负责人。0-否;1-是。是一个列表,数量必须与department一致。第三方通讯录应用或者授权了“组织架构信息-应用可获取企业的部门组织架构信息-部门负责人”权限的第三方应用和代开发应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
direct_leader 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有1个直属上级;第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用和代开发应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
avatar 头像url。 第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
thumb_avatar 头像缩略图url。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
telephone 座机。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
alias 别名;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
extattr 扩展属性,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
status 激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业。
已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
qr_code 员工个人二维码,扫描可添加为外部联系人(注意返回的是一个url,可在浏览器上打开该url以展示二维码);第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
external_profile 成员对外属性,字段详情见对外属性;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
external_position 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
address 地址。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
open_userid 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取
main_department
"""
def send_wecom_employee(self):
sync_flag = True
sync_content = "同步失败:\n"
employee_ids = self.env["hr.employee"].browse(self._context.get('active_ids', self._context.get('active_id')))
for record in employee_ids:
result_status, result_content = self.sudo().env["wecom.apps"].sync_user_update(
user_id=record.wecom_userid,
name=record.name,
mobile=record.mobile_phone,
biz_mail=record.work_email,
department=record.department_id.wecom_id,
)
if not result_status:
sync_flag = False
sync_content = sync_content + record.name + ":" + result_content + ";\n"
if not sync_flag:
raise UserError(str(sync_content))
# def action_create_user(self):
# 测试消息发送 -- success
# self.sudo().env["wecom.apps"].sync_send_message(category, self.wecom_userid, 1111)
# 传递参数给新创建的用户
# self._context["default_oauth_uid"] = self.wecom_userid
# return super().action_create_user()
def batch_action_create_user(self):
employee_ids = self.env["hr.employee"].browse(self._context.get('active_ids', self._context.get('active_id')))
for employee_id in employee_ids:
employee_id.create_user()
def create_user(self):
for record in self:
if not record.user_id:
user_obj = self.env["res.users"].sudo().create({
"login": record.wecom_userid if record.wecom_userid else record.mobile_phone,
"name": record.name,
"password": record.wecom_userid if record.wecom_userid else '',
"oauth_uid": record.wecom_userid if record.wecom_userid else record.mobile_phone,
"partner_id": record.work_contact_id.id if record.work_contact_id else None,
"mobile": record.mobile_phone if record.mobile_phone else None,
"phone": record.work_phone if record.work_phone else None,
"create_employee_id": record.id,
"state": "active",
"notification_type": 'inbox',
})
record.user_id = user_obj.id
if user_obj.partner_id:
user_obj.partner_id.email = record.mobile_phone