!2705 添加功能

Merge pull request !2705 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2025-05-12 09:16:58 +00:00
committed by Gitee
10 changed files with 85 additions and 33 deletions
@@ -8,6 +8,7 @@ class YuthonHrEmployee(models.Model):
user_role_id = fields.Many2one('soong.user.role', string="主角色")
user_role_ids = fields.Many2many('soong.user.role', string="辅助角色")
department_ids = fields.Many2many('hr.department', string="辅助部门")
bank_account = fields.Char()
@api.onchange('user_role_id')
def _onchange_user_role_id(self):
+9 -2
View File
@@ -41,8 +41,15 @@ class YuthonUserRole(models.Model):
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
domain = domain or []
if name:
input_pinyin = ''.join(lazy_pinyin(name))
search_domain = ['|', ('pinyin_name', operator, input_pinyin), ('name', operator, name)]
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
if has_chinese:
# 包含中文:使用模糊匹配
search_domain = [('name', operator, name)]
else:
# 纯字母/数字:使用精确匹配
search_domain = ['|',
('pinyin_name', operator, name),
('name', '=', name)]
domain = expression.AND([search_domain, domain])
return self._search(domain, limit=limit, order=order)
+30 -2
View File
@@ -22,7 +22,6 @@ class SoongWorkflowRecord(models.Model):
re.name = res_name
return super(SoongWorkflowRecord, self).read(fields=fields, load=load)
name = fields.Char(string="名称")
code = fields.Char(string="流水号")
write_date2 = fields.Datetime(string="最后更新日期", readoly="1")
@@ -37,8 +36,37 @@ class SoongWorkflowRecord(models.Model):
approvals_group_id = fields.Many2one(related='workflow_id.approvals_group_id', string="审批分组", store=True)
department_id = fields.Many2one("hr.department", string="部门", required=True)
done_by = fields.Many2one(comodel_name="res.users", string="发起人")
# is_department_record = fields.Boolean(string="是否是本部门数据", index=True)
active = fields.Boolean(string="归档", default=True)
member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department', search='_search_part_of_department')
@api.depends_context('uid', 'company')
@api.depends('department_id')
def _compute_part_of_department(self):
user_employee = self._get_valid_employee_for_user()
active_department = user_employee.department_id
for employee in self:
employee.member_of_department = employee.department_id == active_department
def _get_valid_employee_for_user(self):
user = self.env.user
employee = user.employee_ids
if not employee:
user_employees = user.employee_id.sudo().search([
('user_id', '=', user.id)
])
employee = user_employees.filtered(lambda r: r.company_id == user.company_id) or user_employees[:1]
return employee
#
def _search_part_of_department(self, operator, value):
if operator not in ('=', '!=') or not isinstance(value, bool):
raise UserError(_('Operation not supported'))
user_employee = self._get_valid_employee_for_user()
# Double negation
if not value:
operator = '!=' if operator == '=' else '='
if not user_employee.department_id:
return [('id', operator, user_employee.id)]
return (['!'] if operator == '!=' else []) + [('department_id', '=', user_employee.department_id.id)]
# def get_department_employees(self, department_id):
# valid_user_ids = set()
@@ -15,26 +15,26 @@
</field>
</record>
<record id="view_employee_inherit_tree_soong" model="ir.ui.view">
<field name="name">view.employee.inherit.tree.soong</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='work_email']" position="after">
<field name="user_role_id" optional="hide"/>
</xpath>
</field>
</record>
<!-- <record id="view_employee_inherit_tree_soong" model="ir.ui.view">-->
<!-- <field name="name">view.employee.inherit.tree.soong</field>-->
<!-- <field name="model">hr.employee</field>-->
<!-- <field name="inherit_id" ref="hr.view_employee_tree"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//field[@name='work_email']" position="after">-->
<!-- <field name="user_role_id" optional="hide"/>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
<record id="inherit_view_employee_filter_work" model="ir.ui.view">
<field name="name">inherit.view.employee.filter</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='department_id']" position="attributes">
<attribute name="groupby">parent_id</attribute>
<attribute name="select">multi</attribute>
</xpath>
</field>
</record>
<!-- <record id="inherit_view_employee_filter_work" model="ir.ui.view">-->
<!-- <field name="name">inherit.view.employee.filter</field>-->
<!-- <field name="model">hr.employee</field>-->
<!-- <field name="inherit_id" ref="hr.view_employee_filter"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//field[@name='department_id']" position="attributes">-->
<!-- <attribute name="groupby">parent_id</attribute>-->
<!-- <attribute name="select">multi</attribute>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
</odoo>
@@ -8,6 +8,7 @@
<search string="流程查询">
<field name="name"/>
<field name="workflow_id" string="审批类型"/>
<filter name="my_department_shifts" string="本部门" domain="[('member_of_department', '=', True)]"/>
<group expand="0" string="审批分组">
<filter string="审批类型分组" name='group_by_approvals_group_id' context="{'group_by':'approvals_group_id'}"/>
</group>
@@ -34,7 +35,7 @@
<field name="create_uid"/>
<field name="write_date2"/>
<field name="reclaim_state" column_invisible="1"/>
<!-- <field name="is_department_record" optional="hide"/>-->
<field name="member_of_department" optional="hide"/>
<button name="delete_record" type="object" string="删除" class="btn-primary" confirm="你确定要删除吗?"/>
<button name="reminders_record" type="object" string="催办" class="btn-primary"
groups="soong_workflow.group_soong_workflow_manager"/>
@@ -24,12 +24,12 @@ class AttendanceCorrectWizard(models.TransientModel):
min_hour_from = record.attendance_id.employee_id.resource_id.calendar_id.attendance_ids[0].hour_from
min_hour = int(min_hour_from)
min_minute = int(min_hour_from * 10 % min_hour_from)
will_datetime_start = current_date.replace(year=year, month=month, day=day, hour=min_hour, minute=min_minute) - timedelta(hours=8)
will_datetime_start = current_date.replace(year=year, month=month, day=day, hour=min_hour, minute=min_minute) - timedelta(hours=7)
record.attendance_id.write({'check_in': will_datetime_start, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False})
max_hour_to = record.attendance_id.employee_id.resource_id.calendar_id.attendance_ids[-1].hour_to
max_hour = int(max_hour_to)
max_minute = int(max_hour_to * 10 % max_hour_to)
will_datetime_end = current_date.replace(year=year, month=month, day=day, hour=max_hour, minute=max_minute) - timedelta(hours=8)
will_datetime_end = current_date.replace(year=year, month=month, day=day, hour=max_hour, minute=max_minute) - timedelta(hours=7)
record.attendance_id.write({'check_out': will_datetime_end, 'is_approval': True, 'is_abnormal':False, 'is_no_card':False, 'is_early_card':False, 'is_late_card':False, 'absenteeism_card':False})
else:
check_in_start = record.attendance_id.shift_id.template_id.check_in_start
@@ -58,13 +58,19 @@ class YuthonHrDepartment(models.Model):
for employee in self:
employee.pinyin_name = ''.join(lazy_pinyin(employee.name))
@api.model
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
domain = domain or []
if name:
input_pinyin = ''.join(lazy_pinyin(name))
search_domain = ['|', ('pinyin_name', operator, input_pinyin), ('name', operator, name)]
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
if has_chinese:
# 包含中文:使用模糊匹配
search_domain = [('name', operator, name)]
else:
# 纯字母/数字:使用精确匹配
search_domain = ['|',
('pinyin_name', operator, name),
('name', '=', name)]
domain = expression.AND([search_domain, domain])
return self._search(domain, limit=limit, order=order)
@@ -447,8 +447,15 @@ class YuthonHrEmployee(models.Model):
def _name_search(self, name, domain=None, operator='ilike', limit=None, order=None):
domain = domain or []
if name:
input_pinyin = ''.join(lazy_pinyin(name))
search_domain = ['|', '|', ('pinyin_name', operator, input_pinyin), ('name', operator, name), ('pinyin_min', operator, input_pinyin)]
has_chinese = any('\u4e00' <= char <= '\u9fff' for char in name)
if has_chinese:
# 包含中文:使用模糊匹配
search_domain = [('name', operator, name)]
else:
# 纯字母/数字:使用精确匹配
search_domain = ['|',
('pinyin_name', operator, name),
('name', '=', name)]
domain = expression.AND([search_domain, domain])
return self._search(domain, limit=limit, order=order)
@@ -16,6 +16,7 @@ class YuthonWillTask(models.Model):
priority = fields.Selection([('general', '不紧急不重要'), ('important', '重要不紧急'),
('urgent', '紧急不重要'), ('very_urgent', '重要且紧急')], string='优先级')
user_id = fields.Many2one('res.users', string="创建人", default=lambda self: self.env.user)
company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.company)
task_content = fields.Text(string='任务内容')
remarks = fields.Text(string='备注')
creation_time = fields.Date(string='创建时间', default=fields.Date.today())
@@ -136,6 +136,7 @@
</group>
<group>
<field name="user_id" domain="[('company_id', '=', company_id)]"/>
<field name="company_id" invisible="1"/>
<field name="employee_ids" widget="many2many_tags" options="{'no_create': True}"/>
<field name='employee_ids2' widget="many2many_tags" domain="[('user_role_ids.name', 'in', ['司机'])]"/>
<field name='users_ids' widget="many2many_tags" invisible="1"/>