!6910 添加功能

Merge pull request !6910 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2025-12-06 10:53:46 +00:00
committed by Gitee
4 changed files with 247 additions and 9 deletions
@@ -267,6 +267,7 @@ class SoongWorkflowMixin(models.AbstractModel):
}
}
else:
btn_rec.with_context(cx).log()
return btn_rec.with_context(cx).run()
def _add_comment(self, logs, btn_rec):
@@ -555,6 +555,242 @@ class SoongWorkflowNodeButton(models.Model):
if res:
rec.btn_key = self._generate_key()
def log(self):
cx = self.env.context.copy() or {}
query_user_id = self.env.user.id
is_admin = self.env.user.has_group('soong_workflow.group_soong_workflow_manager')
res_model = cx.get("active_model", False)
res_id = cx.get("active_id", 0)
record_id = self.env[res_model].search([('id', '=', res_id)])
log = self.env['soong.workflow.log'].search([("model", "=", res_model),
("res_id", "=", res_id)])
employee_user_role_ids = self._get_approvers_for_link(record_id)
if is_admin and record_id:
if hasattr(record_id, 'user_id') and record_id.user_id:
query_user_id = record_id.user_id.id
elif hasattr(record_id, 'users_id') and record_id.users_id:
query_user_id = record_id.users_id.id
if len(log) > 1 and is_admin:
current_node_log = self.sudo().env["soong.workflow.log"].search(
[("model", "=", res_model),
("res_id", "=", res_id),
("node_id", "=", self.node_id.id)])
else:
current_node_log = self.sudo().env["soong.workflow.log"].search(
[("model", "=", res_model),
("res_id", "=", res_id),
("done_by", "=", query_user_id),
("node_id", "=", self.node_id.id)])
# 创建或更新当前用户的审批记录
if not current_node_log:
self.sudo().env["soong.workflow.log"].create({
"model": res_model,
"res_id": res_id,
"node_id": self.node_id.id,
"workflow_id": self.workflow_id.id,
"done_by": query_user_id,
"node_btn_name": "0",
"node_btn_id": self.id,
"lase_click_date": fields.Datetime.now(),
"approval_state": "2", # 已完成
})
else:
current_node_log.write({
"approval_state": "2", # 已完成
"lase_click_date": fields.Datetime.now()
})
expected_employees = employee_user_role_ids
# 查找下一个节点
next_node_id = record_id.workflow_id.node_ids.search([
('name', '=', self.link_id.node_to.name),
('workflow_id', '=', self.workflow_id.id)
])
completed_logs = self.sudo().env["soong.workflow.log"].search([
("model", "=", res_model),
("res_id", "=", res_id),
("node_id", "=", self.node_id.id),
("node_btn_name", "=", "4"),
("approval_state", "!=", "2")
])
all_completed = len(completed_logs) == 0
if all_completed:
for employee in expected_employees:
# 检查该员工在下一节点是否已有记录
next_node_employee_log = self.sudo().env["soong.workflow.log"].search([
("model", "=", res_model),
("res_id", "=",res_id),
("node_id", "=", next_node_id.id),
('node_btn_name', '!=', '1'),
("done_by", "=", employee.user_id.id)
])
if not next_node_employee_log:
# 创建初步记录,状态为"待审批"
self.sudo().env["soong.workflow.log"].create({
"model": res_model,
"res_id":res_id,
"node_id": next_node_id.id,
"workflow_id": self.workflow_id.id,
"done_by": employee.user_id.id,
"node_btn_name": "4",
"approval_state": "0", # 待审批
})
workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)])
if employee_user_role_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in employee_user_role_ids if
employee.user_id]
workflow_record_id.employee_ids = employee_user_role_ids
workflow_record_id.approve_state = "pending" # 待审批
related_record = self.env[res_model].browse(res_id)
if hasattr(related_record, 'self_users_ids'):
user_ids = [employee.user_id.id for employee in employee_user_role_ids if employee.user_id]
related_record.self_users_ids = [(6, 0, user_ids)] if user_ids else [(5,)]
record_id.write({'state': self.link_id.node_to.name})
for employee in employee_user_role_ids:
action_id = self.env['ir.actions.act_window'].search([('res_model', '=', res_model)])[0]
url = f'https://oa.thtzjt.com/web?login={employee.user_id.login}&oauth_uid={employee.wecom_userid}#id={record_id.id}&cids=2&action={action_id.id}&model={record_id._name}&view_type=form&menu_id=10104'
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title=record_id._description,
description="标题: {}\n".format(
record_id.name) + self.env.user.name + ' ' + str(
fields.Datetime.now() + timedelta(
hours=8)),
url=url, btntxt="查看详情")
def _get_approvers_for_link(self, record_id=None):
node = self.workflow_id.node_ids.search([
('name', '=', self.link_id.node_to.name),
('workflow_id', '=', self.workflow_id.id)
])
button = False
if node.button_ids:
# 1. 优先找“分发”按钮
distribute_btn = next((btn for btn in node.button_ids if btn.name == '分发'), None)
if distribute_btn:
button = distribute_btn
else:
# 2. 找不到“分发”再找“转交”
transfer_btn = next((btn for btn in node.button_ids if btn.name == '转交'), None)
if transfer_btn:
button = transfer_btn
else:
# 3. 最后找“结束”
button = next((btn for btn in node.button_ids if btn.name == '结束'), None)
if not button:
return self.env['hr.employee']
link_users_id = button.users_role_id
link_users_group_ids = button.users_role_group_ids
is_automatic = button.is_automatic
is_automatic_company = button.is_automatic_company
is_automatic_group = button.is_automatic_group
is_logged_by = button.is_logged_by
is_logged_company = button.is_logged_company
is_logged_group = button.is_logged_group
is_dep = button.is_dep
is_field = button.specify_field_id
if button.reviewer_id:
employee = self.env['hr.employee'].search([
('user_id', '=', button.reviewer_id.id),
], limit=1)
return employee
# 部门和公司筛选条件
department_domain = []
company_domain = []
user_role_domain = []
if record_id:
# 获取当前用户和申请人的相关信息
current_user = self.env.user
applicant = None
# 获取申请人的用户对象
for field_name in ['user_id', 'users_id']:
if hasattr(record_id, field_name):
applicant = getattr(record_id, field_name)
if applicant:
break
# 根据勾选的条件设置域条件(只勾选一个)
if is_automatic and record_id.department_id:
# 按当前申请人自动匹配-本部门(保留部门和公司条件)
department_domain = ['|', ('department_id', '=', record_id.department_id.id),
('department_ids', 'in', record_id.department_id.id)]
company_domain = [('company_id', '=', applicant.company_id.id)]
elif is_automatic_company and applicant and hasattr(applicant, 'company_id'):
# 按当前申请人自动匹配-本公司(仅保留公司条件)
company_id = applicant.company_id.id
company_domain = [('company_id', '=', company_id)]
elif is_automatic_group and applicant and hasattr(applicant, 'company_id'):
# 按当前申请人自动匹配-本集团(仅保留公司条件)
parent_company = applicant.company_id.parent_id
if parent_company:
group_company_ids = self.env['res.company'].search([('id', 'child_of', parent_company.id)]).ids
company_domain = [('company_id', 'in', group_company_ids)]
elif is_dep and hasattr(record_id, 'department_id1') and record_id.department_id1:
department_id1 = record_id.department_id1.id
department_domain = ['|', ('department_id', '=', department_id1),
('department_ids', 'in', department_id1)]
user_role_domain = ['|', ('user_role_id', '=', button.role_id.user_role_ids.ids),
('user_role_ids', 'in', button.role_id.user_role_ids.ids)]
elif is_logged_by and current_user.department_id:
# 按当前登录人自动匹配-本部门(保留部门和公司条件)
department_domain = ['|', ('department_id', '=', current_user.department_id.id),
('department_ids', 'in', current_user.department_id.id)]
company_domain = [('company_id', '=', current_user.company_id.id)]
elif is_logged_company:
# 按当前登录人自动匹配-本公司(仅保留公司条件)
company_id = current_user.company_id.id
company_domain = [('company_id', '=', company_id)]
elif is_logged_group:
# 按当前登录人自动匹配-本集团(仅保留公司条件)
parent_company = current_user.company_id.parent_id
if parent_company:
group_company_ids = self.env['res.company'].search([('id', 'child_of', parent_company.id)]).ids
company_domain = [('company_id', 'in', group_company_ids)]
elif is_field:
field_name = button.specify_field_id.name
# 目前只会有入职
field_value = record_id[field_name]
department_domain = ['|', ('department_id', '=', field_value.id),
('department_ids', 'in', field_value.id)]
if link_users_id:
role_domain = ['|', ('user_role_id', '=', link_users_id.id), ('user_role_ids', 'in', link_users_id.id)]
if user_role_domain:
role_domain = ['|'] + role_domain + user_role_domain
domain = role_domain + company_domain + department_domain
return self.env['hr.employee'].sudo().search(domain)
elif link_users_group_ids:
role_domain = ['|', ('user_role_id', 'in', link_users_group_ids.user_role_ids.ids),
('user_role_ids', 'in', link_users_group_ids.user_role_ids.ids)]
if user_role_domain:
role_domain = ['|'] + role_domain + user_role_domain
domain = role_domain + company_domain + department_domain
return self.env['hr.employee'].sudo().search(domain)
# 特殊分发按钮
if '分发' in link.name and record_id and hasattr(record_id, 'users_id'):
return record_id.users_id.employee_id
return self.env['hr.employee']
def run(self):
for rec in self:
# Check Condition Before Executing Action
@@ -627,6 +863,7 @@ class SoongWorkflowNodeButton(models.Model):
# # 发送信息提醒
# partner_ids = self.sudo().env['res.users'].search([('id', 'in', user_ids)]).mapped('partner_id').ids
# self.sudo().with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'soong_workflow.message_yuthon_workflow_btn_approval_data')
except Exception as e:
pass
return func_result
+4 -5
View File
@@ -964,14 +964,13 @@ class HrAttendance(models.Model):
method_name='executive_day_remind_out', is_executive=True)
def card_in_comment(self, employee_id, planning_name):
date = (f"<div class=\"normal\">您的班次是{planning_name}还有5分钟</div>"
f"<div class=\"normal\">上班,记得打卡</div>")
data = "您的班次是{}\n还有5分钟上班,记得打卡".format(planning_name)
url = '#小程序://天投云/XttsPpKg3MEpY7h'
try:
self.sudo().env["wecom.apps"].sync_send_message_textcard(
category='att',
user_id='18562027762',
description=date,
user_id=employee_id.wecom_userid,
description=data,
title="打卡提醒",
url=url,
btntxt="详细信息"
@@ -980,7 +979,7 @@ class HrAttendance(models.Model):
_logger.error(f"上班打卡提醒发送失败:员工={employee_id.name}, 错误={e}")
def card_out_comment(self, employee_id, planning_name):
data = f"您的班次是{planning_name}您该下班了,记得打卡"
data = f"您的班次是{planning_name}\n您该下班了,记得打卡"
url = '#小程序://天投云/XttsPpKg3MEpY7h'
try:
self.sudo().env["wecom.apps"].sync_send_message_textcard(
+5 -4
View File
@@ -150,12 +150,13 @@ class WeComApps(models.Model):
elif category == 'att':
data = {
"touser": user_id,
"msgtype": "miniprogram_notice",
"miniprogram_notice": {
"appid": "wxda530cb253dec90d",
"page": "pages/clock_in/clock_in",
"msgtype": "textcard",
'agentid': wecom_app.agent_id,
"textcard": {
"title": "打卡提醒",
"description": description,
"url": url,
"btntxt": btntxt,
},
}
else: