From 5d14b3269976a1554453704871527ebc6f317cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Mon, 12 Jan 2026 16:10:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- attendance_iot/controllers/kaoqin_test.py | 2 +- soong_workflow/models/soong_workflow_node.py | 62 ++++++++----------- .../models/soong_workflow_record.py | 2 +- .../wizard/soong_workflow_comment_wizard.py | 55 +++++++++------- .../models/hr_attendance_detail_wechat.py | 4 ++ yuthon_official/models/yuthon_official.py | 1 + 6 files changed, 68 insertions(+), 58 deletions(-) diff --git a/attendance_iot/controllers/kaoqin_test.py b/attendance_iot/controllers/kaoqin_test.py index c588546ab..8b682236e 100644 --- a/attendance_iot/controllers/kaoqin_test.py +++ b/attendance_iot/controllers/kaoqin_test.py @@ -58,7 +58,7 @@ class BusController(Controller): if employee_id: request.env(user=SUPERUSER_ID)["hr.attendance.detail"].create({ 'employee_id': employee_id.id, # 员工 - 'checkin_time': fields.Datetime.now(), # 打卡时间 + 'checkin_time': fields.Datetime.now(), 'source': 'iot', # 打卡来源 'attendance_iot_id': attendance_iot_id.id, # 打卡设备 }) diff --git a/soong_workflow/models/soong_workflow_node.py b/soong_workflow/models/soong_workflow_node.py index 8b055bb93..b660918f7 100644 --- a/soong_workflow/models/soong_workflow_node.py +++ b/soong_workflow/models/soong_workflow_node.py @@ -126,49 +126,41 @@ class SoongWorkflowNode(models.Model): @api.onchange("is_end") def onchange_is_end(self): for record in self: + current_buttons = record.button_ids if record.is_end: record.use_custom_colors = True record.bg_color = END_BG_COLOR_1 record.res_bg_color = END_BG_COLOR_1 - sequence = max([r.sequence for r in record.button_ids] if record.button_ids else [1]) - record.button_ids = [ - (0, 0, { - "name": _("结束"), - # "workflow_id": record.workflow_id.ids[0] if record.workflow_id.ids else None, - "node_id": record.id, - "sequence": sequence + 1, - "action_type": "end", - "btn_hide": False, # 对所有人显示 - "has_comment": False, # 对所有人显示 - "review_type": "end", - }), - ] + end_btns = current_buttons.filtered(lambda r: r.name == _("结束")) + archive_btns = current_buttons.filtered(lambda r: r.name == _("归档")) + remove_commands = [(3, btn.id) for btn in end_btns + archive_btns] + sequence = max([r.sequence for r in current_buttons] if current_buttons else [1]) + add_end = (0, 0, { + "name": _("结束"), + "node_id": record.id, + "sequence": sequence + 1, + "action_type": "end", + "btn_hide": False, + "has_comment": False, + "review_type": "end", + }) + add_archive = (0, 0, { + "name": _("归档"), + "node_id": record.id, + "sequence": sequence + 2, + "action_type": "code", + "btn_hide": False, + "has_comment": False, + }) + record.button_ids = remove_commands + [add_end, add_archive] + else: record.use_custom_colors = True record.bg_color = DEFAULT_BG_COLOR record.res_bg_color = DEFAULT_BG_COLOR - remove_ids = record.button_ids.filtered(lambda r: r.name in ["结束"]) - record.button_ids = [(3, remove_id.id) for remove_id in remove_ids] - - @api.onchange("is_archive") - def onchange_is_archive(self): - for record in self: - if record.is_archive: - sequence = max([r.sequence for r in record.button_ids] if record.button_ids else [1]) - record.button_ids = [ - (0, 0, { - "name": _('归档'), - "node_id": record.id, - "sequence": sequence + 1, - "action_type": "code", - "btn_hide": False, - "has_comment": False, - }), - ] - else: - remove_ids = record.button_ids.filtered(lambda r: r.name in ["归档"]) - record.button_ids = [(3, remove_id.id) for remove_id in remove_ids] - + end_btns = current_buttons.filtered(lambda r: r.name == _("结束")) + archive_btns = current_buttons.filtered(lambda r: r.name == _("归档")) + record.button_ids = [(3, btn.id) for btn in end_btns + archive_btns] @api.onchange("is_confirm") def onchange_is_confirm(self): diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 3b1fce815..3896c1d14 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -67,7 +67,7 @@ class SoongWorkflowRecord(models.Model): done_by = fields.Many2one(comodel_name="res.users", string="发起人") active = fields.Boolean(string="归档", default=True) is_manager = fields.Boolean(string="是否管理员", compute='_compute_is_manager') - soong_state = fields.Selection([('to_do', '待办'), ('done', '已办'), ('active', '已归档')], string="流程状态", default="to_do") + soong_state = fields.Selection([('to_do', '待办'), ('done', '已办'),('to_active', '待归档'), ('active', '已归档')], string="流程状态", default="to_do") member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department', search='_search_part_of_department') diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 944da69be..4c88b1bde 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -25,7 +25,7 @@ class SoongWorkflowCommentWizard(models.TransientModel): node_link_len = fields.Char(string="转交2") is_supervising = fields.Boolean(string="是否督办") comment_note_id = fields.Many2one('soong.note', string="常用意见") - comment_note = fields.Char(string="意见") + comment_note = fields.Text(string="意见") comment = fields.Char(compute='_compute_comment', store=True) state_list = fields.Char(string="状态列表") record_id = fields.Integer() @@ -456,10 +456,10 @@ class SoongWorkflowCommentWizard(models.TransientModel): fields.Datetime.now() + timedelta( hours=8)), url=url, btntxt="查看详情") - msg_id = result_data[-1]['msgid'] - target_logs = next_node_log_records.filtered(lambda l: l.done_by.id == employee.user_id.id) - if target_logs: - target_logs.msg_id = msg_id + # msg_id = result_data[-1]['msgid'] + # target_logs = next_node_log_records.filtered(lambda l: l.done_by.id == employee.user_id.id) + # if target_logs: + # target_logs.msg_id = msg_id else: # 串审模式 (沿用原有逻辑) # 查找下一个节点 @@ -606,6 +606,12 @@ class SoongWorkflowCommentWizard(models.TransientModel): # if not record_id.log_ids2.search([('approval_state', '=', '0')]) or record_id.log_ids2: last_log = record_id.log_ids[-1] if record_id.log_ids else None if last_log: + 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 same_name_logs = record_id.log_ids.filtered( lambda log: log.name == last_log.name and log.node_btn_name == '4' and log.id != last_log.id ) @@ -622,19 +628,23 @@ class SoongWorkflowCommentWizard(models.TransientModel): if workflow_record: workflow_record.write({ 'approve_state': 'end', - 'employee_ids': False, + 'employee_ids': applicant.id, + 'soong_state': 'to_active', 'node_id': False, }) - record_id.work_end = True - else: - self.env['soong.workflow.record'].search([ - ('code', '=', record_id.code) - ]).write({ - 'approve_state': 'end', - 'employee_ids': False, - 'node_id': False, + self.sudo().env["soong.workflow.log"].create({ + "code": self.code, + "model": self.res_model, + "res_id": self.res_id, + "workflow_id": self.node_btn_id.workflow_id.id, + "lase_click_date": fields.Datetime.now(), + "done_by": applicant.id, + "approval_state": "0", + "commit":'待归档', + "node_btn_id": self.node_btn_id.id, }) record_id.work_end = True + # 给申请人发消息 biz_record = self.env[self.res_model].browse(self.res_id) if hasattr(biz_record, 'user_id') and biz_record.user_id: @@ -697,8 +707,8 @@ class SoongWorkflowCommentWizard(models.TransientModel): "node_btn_name": "0", }) result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description, description=description, url=url, btntxt="查看详情") - msg_id = result_data[-1]['msgid'] - log_id.msg_id = msg_id + # msg_id = result_data[-1]['msgid'] + # log_id.msg_id = msg_id for emp in self.dep_manager_employee_ids: workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.dep_manager_employee_ids if employee.user_id] next_node_id = record_id.workflow_id.node_ids.search([('name', '=', '承办'), ('workflow_id', '=', record_id.workflow_id.id)]) @@ -712,8 +722,8 @@ class SoongWorkflowCommentWizard(models.TransientModel): "node_btn_name": "4", }) result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description + "承办", description=description, url=url, btntxt="查看详情") - msg_id = result_data[-1]['msgid'] - log_id.msg_id = msg_id + # msg_id = result_data[-1]['msgid'] + # log_id.msg_id = msg_id for employee in self.circulated_employee_ids: workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.circulated_employee_ids if employee.user_id] record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) @@ -737,8 +747,8 @@ class SoongWorkflowCommentWizard(models.TransientModel): "approval_state": "0", }) result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description + "传阅/抄送",description=description, url=url, btntxt="查看详情") - msg_id = result_data[-1]['msgid'] - log2_id.msg_id = msg_id + # msg_id = result_data[-1]['msgid'] + # log2_id.msg_id = msg_id workflow_record_id.employee_ids = self.dep_manager_employee_ids + self.employee_ids + self.circulated_employee_ids record_id.log_ids[-1].write({"comment": self.comment, "approval_state": "2", "lase_click_date": fields.Datetime.now()}) if self.node_btn_name == "收回": @@ -767,7 +777,10 @@ class SoongWorkflowCommentWizard(models.TransientModel): if self.node_btn_name == '归档': workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)]) - workflow_record_id.write({'soong_state': 'active'}) + workflow_record_id.write({'soong_state': 'active', + 'employee_ids':False + } + ) if self.node_btn_name != "收回": diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index e56b5542b..b52e2a806 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -414,6 +414,10 @@ class HrAttendanceDetail(models.Model): start_datetime = datetime.combine(date, datetime.min.time()).replace( hour=start_hour, minute=start_minute, second=0, microsecond=0 ) - timedelta(hours=8) + if template.planning_name == '厨卫(集团本部)': + start_datetime = datetime.combine(date, datetime.min.time()).replace( + hour=start_hour, minute=start_minute, second=0, microsecond=0 + ) - timedelta(hours=6) if template.day2 == '次日': end_datetime = datetime.combine(date, datetime.min.time()).replace( hour=end_hour, minute=end_minute, second=0, microsecond=0 diff --git a/yuthon_official/models/yuthon_official.py b/yuthon_official/models/yuthon_official.py index eeda6443b..65a541346 100644 --- a/yuthon_official/models/yuthon_official.py +++ b/yuthon_official/models/yuthon_official.py @@ -81,6 +81,7 @@ class YuthonOfficial(models.Model): sub_id = self.env['yuthon.sub.enterprises'].create({ 'name': self.name, 'users_id': self.users_id.id, + 'state': '申请人', 'code': self.env['ir.sequence'].next_by_code('sub_enterprises_code'), 'official_partner_id': official_partner_id.id, 'issuance_process_id': self.id,