From 4cbb422f42d762d27f4034b7c8711d3d629b1a2a 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: Wed, 3 Dec 2025 11:56:57 +0800 Subject: [PATCH 1/2] =?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 --- .../models/yuthon_regularization_approval.py | 74 ++++++++------ .../yuthon_regularization_approval_views.xml | 99 ++++--------------- .../models/processing_order_approval.py | 53 ++++++---- .../models/property_device_repair.py | 6 +- .../models/property_report_repair.py | 6 +- .../views/processing_order_approval_views.xml | 1 + .../views/property_device_repair_views.xml | 1 - .../views/property_report_repair.xml | 1 - 8 files changed, 109 insertions(+), 132 deletions(-) diff --git a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py index 87e8a7024..ac91b1c06 100644 --- a/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py +++ b/yuthon_hr_employee_approval/models/yuthon_regularization_approval.py @@ -1,5 +1,6 @@ from odoo import models, fields, api from odoo.exceptions import UserError +from dateutil.relativedelta import relativedelta class YuthonRegularizationPrepareApproval(models.Model): @@ -8,40 +9,25 @@ class YuthonRegularizationPrepareApproval(models.Model): _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin'] name = fields.Char(string="名称") - department_id = fields.Many2one(related='employee_id.department_id', string="部门") + department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门") users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id) - employee_id = fields.Many2one('hr.employee', string="员工姓名") code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('yuthon_regularization_approval_code')) - job_id = fields.Many2one(related='employee_id.job_id', string="主岗") - phone = fields.Char(related='employee_id.mobile_phone', string='手机号') - onboarding_time = fields.Date(related='employee_id.entry_date', string="入职日期") - trial_end_date = fields.Date(related='employee_id.open_start_time', string="试用期结束日期") - parent_id = fields.Many2one(related='employee_id.parent_id',string="直线上级") - business_leader = fields.Char(string="业务线上级") + structure_type_id = fields.Many2one('hr.payroll.structure.type', string="转正前职级") + end_date = fields.Date(string="转正日期", compute="_compute_end_date") + + documents_id = fields.Many2one('ir.attachment', string="转正申请书") + documents_id1 = fields.Many2one('ir.attachment', string="转正考核表") + assessment_rating = fields.Char(string="考核评级") + structure_type_id1 = fields.Many2one('hr.payroll.structure.type', string="转正后职级") + is_adjust = fields.Boolean(string='是否调整') + adjust_reason = fields.Text(string="调整原因") + remake = fields.Text(string="备注") + is_issues = fields.Boolean(string='是否上会') issues_result = fields.Html(string="会议结果") related_issues_id = fields.Many2one('issue.library', string="关联议题") work_end = fields.Boolean(string="结束") - # 转正考核 - job_coach = fields.Char(string="工作指导人一") - job_coach2 = fields.Char(string="工作指导人二") - scoring_system = fields.Char(string="评分分制") - appraisal_total = fields.Char(string="考核权重合计") - trial_scores = fields.Char(string="试用考核得分") - assessment_date = fields.Date(string="自评日期") - self_evaluation = fields.Text(string="自我评价") - employee_pros = fields.Text(string="员工优点") - improvements = fields.Text(string="需改进事项") - documents_ids = fields.Many2many('ir.attachment', string="考核文档") - #转正结果 - positive_results = fields.Char(string="转正结果") - positive_date = fields.Date(string="转正日期") - is_salary_adjustments = fields.Boolean(string="是否调整薪资") - related_notes = fields.Text(string="转正相关说明") - approval_regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='转正审批状态', default='none') - regularization = fields.Selection([('none', '未发起'), ('done', '已发起')], string='试用期考核状态', default='none') - regularization_rules = fields.Char(string="转正规则") urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal') active = fields.Boolean('Active', default=True, tracking=True) @@ -52,8 +38,38 @@ class YuthonRegularizationPrepareApproval(models.Model): name_title = fields.Char(default=_get_default_name_title) self_users_ids = fields.Many2many('res.users', string="当前经办人", default=lambda self: [(6, 0, [self.env.user.id])]) - #试用信息明细行 - trial_assessment_ids = fields.One2many('yuthon.trial.scenario.detail.line', 'regularization_login_id', string="试用期考核方案",help='请选择适用本人主岗的试用考核方案,或直接在下方填写') + @api.onchange('structure_type_id1') + def _onchange_is_adjust(self): + if self.structure_type_id1 and self.structure_type_id1 != self.structure_type_id: + self.is_adjust = True + else: + self.is_adjust = False + + @api.depends('users_id') + def _compute_end_date(self): + for rec in self: + if rec.users_id: + rec.end_date = rec.users_id.employee_ids.contract_id.end_date + relativedelta(days=1) + + def end_approval(self): + for rec in self: + version_str = rec.users_id.employee_ids.contract_id.version.lstrip('V') + main_version = version_str.split('.')[0] + new_main_version = int(main_version) + 1 + new_version = f"V{new_main_version}.0" + original_contract = rec.employee_ids.contract_id + original_contract.write({ + 'state': 'close', + }) + new_contract_vals = { + 'structure_type_id': rec.structure_type_id1.id, + 'new_version': new_version, + } + new_contract = original_contract.with_context(skip_contract_code_check=True).copy(new_contract_vals) + rec.employee_id.write({ + 'contract_id': new_contract.id, + }) + @api.onchange('is_issues') def _onchange_is_issues(self): diff --git a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml index 569e5c74c..798d1ec6a 100644 --- a/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml +++ b/yuthon_hr_employee_approval/views/yuthon_regularization_approval_views.xml @@ -5,16 +5,10 @@ yuthon.regularization.approval - - - - - - - - - - + + + + @@ -52,87 +46,30 @@ - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - 转正申请表 yuthon.regularization.approval tree,form - diff --git a/yuthon_maintain/models/processing_order_approval.py b/yuthon_maintain/models/processing_order_approval.py index da7ba2e26..cfaa0c67b 100644 --- a/yuthon_maintain/models/processing_order_approval.py +++ b/yuthon_maintain/models/processing_order_approval.py @@ -9,12 +9,15 @@ from odoo.exceptions import UserError, ValidationError class ProcessingOrderApproval(models.Model): _name = 'processing.order.approval' _description = '处理单审批' + _rec_name = 'display_name' _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin'] - name = fields.Char(string='标题', compute='_compute_name', store=True) + name = fields.Char(string='标题', store=True) + display_name = fields.Char(string='名称', compute='_compute_name',) code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('processing_order_approval_code')) - users_id = fields.Many2one('res.users', string="申请人", default=lambda self: self.env.user.id) + applicant_id = fields.Many2one('res.users', string="申请人") + users_id = fields.Many2one('res.users', string="处理人", default=lambda self: self.env.user.id) department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门") company_id = fields.Many2one(related='users_id.employee_id.company_id', string="公司") documents_ids = fields.Many2many('ir.attachment', string="维修图片") @@ -51,7 +54,7 @@ class ProcessingOrderApproval(models.Model): ], string='故障原因', ) - processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='done') + processing_results = fields.Selection([('done', '已解决 '), ('undone', '未解决'), ('part', '部分解决')], string="处理结果", default='undone') is_fee = fields.Boolean(string="是否产生费用") labor_costs = fields.Float(string="人工费") @@ -67,18 +70,6 @@ class ProcessingOrderApproval(models.Model): name_title = fields.Char(default=_get_default_name_title) - @api.depends('property_id') - def _compute_contract_id(self): - for record in self: - if record.property_id: - contract_id = self.env["property.lease.contract.line"].search( - [('address_id', '=', record.property_id.id)], - limit=1 - ) - else: - contract_id = False - record.contract_id = contract_id.lease_id.id if contract_id else False - @api.depends("company_id") def _compute_name(self): self.name = False @@ -87,6 +78,22 @@ class ProcessingOrderApproval(models.Model): if self.device_id: self.name = self.device_id.name + '-处理单' + @api.depends('property_id') + def _compute_contract_id(self): + for record in self: + contract_id = self.env["property.lease.contract.line"].browse() + if record.property_id: + contract_id = self.env["property.lease.contract.line"].search( + [ + ('address_id', '=', record.property_id.id), + ], + limit=1 + ) + if contract_id and contract_id.lease_id: + record.contract_id = contract_id.lease_id.id + else: + record.contract_id = None + @api.onchange('repair_id') def _onchange_repair_id(self): if self.repair_id: @@ -132,8 +139,18 @@ class ProcessingOrderApproval(models.Model): 'remark': remark }) - - - + def end_approval(self): + for rec in self: + menu_id = self.env['ir.ui.menu'].search([('name', '=', '处理单')]) + url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=processing.order.approval&view_type=list&menu_id={menu_id.id}' + self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', + user_id=rec.applicant_id.employee_id.wecom_userid, + title="处理单", + description="你有一份已处理的报时报修", + url=url, btntxt="详细信息") + if rec.device_id: + rec.device_id.report_state = 'done' + else: + rec.repair_id.report_state = 'done' diff --git a/yuthon_maintain/models/property_device_repair.py b/yuthon_maintain/models/property_device_repair.py index 19f9521e8..8e15aaf7a 100644 --- a/yuthon_maintain/models/property_device_repair.py +++ b/yuthon_maintain/models/property_device_repair.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models, fields, api, exceptions, _ +from odoo.exceptions import UserError, ValidationError class PropertyDeviceRelief(models.Model): @@ -42,9 +43,12 @@ class PropertyDeviceRelief(models.Model): def pull_order(self): soong_workflow_line_list = [] - self.report_state = 'done' + if self.env['processing.order.approval'].search([('device_id', '=', self.id)]): + raise UserError('该设备已生成处理单') order_id = self.env['processing.order.approval'].create({ 'device_id': self.id, + 'applicant_id': self.users_id.id, + 'name': self.problem_description, 'code': self.env['ir.sequence'].next_by_code('property_device_repair_code'), }) workflow_record_id = self.env['soong.workflow.record'].search([ diff --git a/yuthon_maintain/models/property_report_repair.py b/yuthon_maintain/models/property_report_repair.py index fc6e3c8bf..f229bc25c 100644 --- a/yuthon_maintain/models/property_report_repair.py +++ b/yuthon_maintain/models/property_report_repair.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import models, fields, api, exceptions, _ +from odoo.exceptions import UserError class PropertyRentRelief(models.Model): @@ -65,10 +66,13 @@ class PropertyRentRelief(models.Model): self.phone = False def pull_order(self): - self.report_state = 'done' soong_workflow_line_list = [] + if self.env['processing.order.approval'].search([('repair_id', '=', self.id)]): + raise UserError('该设备已生成处理单') order_id = self.env['processing.order.approval'].create({ 'repair_id': self.id, + 'applicant_id': self.users_id.id, + 'name': self.problem_description, 'code': self.env['ir.sequence'].next_by_code('property_report_repair_code'), }) workflow_record_id = self.env['soong.workflow.record'].search([ diff --git a/yuthon_maintain/views/processing_order_approval_views.xml b/yuthon_maintain/views/processing_order_approval_views.xml index 1d298162d..ac5c066f9 100644 --- a/yuthon_maintain/views/processing_order_approval_views.xml +++ b/yuthon_maintain/views/processing_order_approval_views.xml @@ -9,6 +9,7 @@