Merge pull request !234 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2024-09-29 11:09:30 +00:00
committed by Gitee
29 changed files with 347 additions and 97 deletions
+1
View File
@@ -21,6 +21,7 @@
'views/inherit_hr_employee_views.xml',
'views/hr_attendance_views.xml',
'views/resource_calendar_leaves_views.xml',
'views/attendance_iot_datas.xml',
'views/attendance_iot_manager_views.xml',
'views/overtime_approval.xml',
'views/go_approval.xml',
@@ -76,3 +76,23 @@ class BusController(Controller):
})
print("---------------------------------------------测试成功---------------------------------------")
return {"Result": 0, "Msg": "添加成功"}
@route('/api/v1/record/face', methods=['POST'], type='json', auth='none', csrf=False)
def get_model_identify(self):
"""
获取上传识别成功记录
:return:
"""
data = request.httprequest.json
user_name = data.get('logs').get('user_id')
employee_id = request.env(user=SUPERUSER_ID)["hr.employee"].search([('user_id', '=', user_name.id)])
attendance_iot = request.env(user=SUPERUSER_ID)["attendance.iot.datas"]
if not attendance_iot.search(
[('employee_id', '=', employee_id.id), ('attendance_number', '=', data.get('sn'))]):
attendance_iot.create({
'attendance_number': data.get('sn'),
'attendance_date': data.get('logs').get('recog_time'),
'employee_id': employee_id.id,
})
print("---------------------------------------------测试成功---------------------------------------")
return {"Result": 0, "Msg": "添加成功"}
+1
View File
@@ -13,4 +13,5 @@ from . import card_approval
from . import holiday_manage
from . import holiday_manage_balance
from . import attendance_iot_manager
from . import attendance_iot_datas
@@ -0,0 +1,12 @@
from odoo import api, fields, models, tools
from odoo.exceptions import ValidationError
class AttendanceIotDatas(models.Model):
_name = 'attendance.iot.datas'
_description = '上传识别记录'
employee_id = fields.Many2one('hr.employee', string='人员')
attendance_date = fields.Datetime(string='打卡时间')
attendance_number = fields.Char(string="设备号")
@@ -11,5 +11,6 @@ access_card_approval,card.approval,model_card_approval,base.group_user,1,1,1,1
access_holiday_manage,holiday_manage,model_holiday_manage,base.group_user,1,1,1,1
access_attendance_iot_manager,attendance_iot_manager,model_attendance_iot_manager,base.group_user,1,1,1,1
access_holiday_manage_balance,holiday_manage_balance,model_holiday_manage_balance,base.group_user,1,1,1,1
access_attendance_iot_datas,attendance_iot_datas,model_attendance_iot_datas,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
11 access_holiday_manage holiday_manage model_holiday_manage base.group_user 1 1 1 1
12 access_attendance_iot_manager attendance_iot_manager model_attendance_iot_manager base.group_user 1 1 1 1
13 access_holiday_manage_balance holiday_manage_balance model_holiday_manage_balance base.group_user 1 1 1 1
14 access_attendance_iot_datas attendance_iot_datas model_attendance_iot_datas base.group_user 1 1 1 1
15
16
@@ -30,4 +30,6 @@
sequence="15" action="attendance_iot_manager_action"/>
<menuitem id="menu_hr_attendance_work" name="考勤时间表配置" parent="hr_attendance.menu_hr_attendance_root"
sequence="18" action="resource.action_resource_calendar_form"/>
</odoo>
<menuitem id="menu_hr_attendance_lot_datas" name="上传识别记录" parent="hr_attendance.menu_hr_attendance_root"
sequence="21" action="attendance_iot_datas_action"/>
</odoo>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="attendance_iot_datas_tree" model="ir.ui.view">
<field name="name">attendance.iot.datas.tree</field>
<field name="model">attendance.iot.datas</field>
<field name="arch" type="xml">
<tree string="上传记录">
<field name="name"/>
<field name="attendance_date"/>
<field name="employee_id"/>
</tree>
</field>
</record>
<record id="attendance_iot_datas_action" model="ir.actions.act_window">
<field name="name">上传记录</field>
<field name="res_model">attendance.iot.datas</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>
@@ -18,11 +18,21 @@ class YuthonHrDepartment(models.Model):
expiration_date = fields.Date(string="失效日期", default=fields.Date.today())
end_date = fields.Date(string="结束时间")
department_code = fields.Char(string="部门序号", store=True)
lower_ids = fields.One2many('hr.department', 'parent_id', string="下级部门")
@api.onchange('department_code', 'parent_id')
def _onchange_department_code(self):
for code in self:
if code.parent_id.department_code:
code.department_code = code.parent_id.department_code + code.department_code if code.department_code else ''
code.department_code = code.parent_id.department_code + ('.' + code.department_code.split('.')[-1] if code.department_code else '')
else:
code.department_code = code.department_code
code.department_code = code.department_code
code.update_code()
def update_code(self):
def cycle_code(parent,parent_code):
for child in parent.lower_ids:
new_code = parent_code +('.' + child.department_code.split('.')[-1] if child.department_code else '')
self.env['hr.department'].search([('id', '=', child.id.origin)]).write({'department_code': new_code})
cycle_code(child,new_code)
cycle_code(self, self.department_code)
@@ -10,6 +10,7 @@
<div class="col-12 text-center">
<h1>
<field name="full_title" required="1"/>
<field name="name" invisible="1"/>
</h1>
</div>
<group col="4" string="基本信息">
@@ -9,6 +9,7 @@ class HrApplicant(models.Model):
room_id = fields.Many2one('room.room',string='地点')
interview_results = fields.Selection([('pass', '通过'), ('fail', '不通过')], string="面试结果")
def buttn_applicant_ids(self):
self.ensure_one()
return {
@@ -19,32 +20,41 @@ class HrApplicant(models.Model):
'target': 'current',
}
def pub_interview_approval(self):
for applicant in self:
if not applicant.is_interview_status:
applicant.is_interview_status = True
else:
raise UserError('已提交面试申请')
raise UserError(_('该申请已提交,请勿重复提交!'))
hr_applicant_ids = self.env["hr.applicant"].browse(self._context.get('active_ids', self._context.get('active_id')))
hr_applicant_data = [(6, 0, hr_applicant_ids.ids)]
stage_list = [stage.name for stage in self.env['hr.recruitment.stage'].search([])] # 便利出所有的阶段
for sta in self:
stage_self = stage_list.index(sta.stage_id.name)
if stage_self == 0:
sta.stage_id = self.env['hr.recruitment.stage'].search([('name', '=', stage_list[stage_self + 1])]).id
form_id = self.env.ref("yuthon_hr_employee_approval.view_yuthon_interview_approval_form").id
return {
'type': 'ir.actions.act_window',
'name': '提交面试申请',
'res_model': 'yuthon.interview.approval',
"views": [[form_id, "form"]],
"context": {
'default_name': '面试申请表',
'default_job_id': self.job_id.id,
'default_department_id': self.department_id.id,
'default_applicant_ids': hr_applicant_data
form_id = self.env.ref("yuthon_hr_employee_approval.view_yuthon_interview_approval_form").id
return {
'type': 'ir.actions.act_window',
'name': '提交面试申请',
'res_model': 'yuthon.interview.approval',
"views": [[form_id, "form"]],
"context": {
'default_name': '面试申请表',
'default_job_id': self.job_id.id,
'default_department_id': self.department_id.id,
'default_applicant_ids': hr_applicant_data
}
}
}
def write(self, vals):
# 调用父类的 write 方法更新记录
res = super(HrApplicant, self).write(vals)
# 检查是否修改了 'stage_id' 字段
if 'stage_id' in vals:
self.is_interview_status = False
return res
@@ -18,26 +18,19 @@ class YuthonInterviewApproval(models.Model):
applicant_ids = fields.One2many('hr.applicant', 'interview_approval_id', string='应聘面试信息')
def test_submissions(self):
# 得到标签顺序列表,用来判断下一个阶段
stage_list = [stage.name for stage in self.env['hr.recruitment.stage'].search([])]
for applicant in self.applicant_ids:
failed_stage = self.env['hr.recruitment.stage'].search([('name', '=', '未通过')], limit=1)
if applicant.interview_results == 'pass':
current_stage_index = stage_list.index(applicant.stage_id.name)
next_stage_index = current_stage_index + 1
# 检查是否已经是最后一个阶段
if next_stage_index < len(stage_list):
next_stage_name = stage_list[next_stage_index]
next_stage = self.env['hr.recruitment.stage'].search([('name', '=', next_stage_name)], limit=1)
applicant.stage_id = next_stage
else:
# 已经是最后一个阶段,可以进行其他操作,例如发送通知等
raise UserError('已经是最后一个阶段')
elif applicant.interview_results == 'fail':
applicant.stage_id = failed_stage
def scheduling_of_meetings(self):
form_id = self.env.ref("room.room_booking_view_form").id
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': '会议安排',
'res_model': 'room.booking',
"views": [[form_id, "form"]],
"context": {
'default_name': self.name,
'default_employee_ids': [(6, 0, self.employee_ids.ids)]
}
}
@@ -29,6 +29,8 @@ class YuthonLeavingApproval(models.Model):
is_leaving = fields.Boolean(string="同意离职", default=False)
leaving_date = fields.Date(string="工作期限")
handover_person = fields.Many2one("hr.employee", string="交接人")
class HrJobType(models.Model):
_name = "hr.job.type"
@@ -33,6 +33,7 @@ class YuthonOnboardApproval(models.Model):
probation_period = fields.Selection([('zero', '0个月'), ('one', '1个月'),
('two', '2个月'), ('three', '3个月'), ('year', '1年')], string='试用期结束时间')
duration_employment = fields.Date(string='劳动合同期限')
duration_employment_end = fields.Date(string='劳动合同结束时间')
salary = fields.Float(string='基本工资')
oter = fields.Text(string='其他约定')
social_security = fields.Char(string='社保时长')
@@ -27,6 +27,11 @@
parent="hr_process_work_job"
action="yuthon_message_login_action"
sequence="7"/>
<menuitem id="hr_menu_prepare_approval"
name="编制调整申请表"
parent="hr_process_work_job"
action="yuthon_prepare_approval_action"
sequence="5"/>
<!--人事管理 -->
@@ -44,11 +49,6 @@
parent="hr_set_process_menu"
action="yuthon_leaving_approval_action"
sequence="3"/>
<menuitem id="hr_menu_prepare_approval"
name="编制调整申请表"
parent="hr_set_process_menu"
action="yuthon_prepare_approval_action"
sequence="5"/>
<menuitem id="hr_menu_rank_approval"
name="职级调整申请表"
parent="hr_set_process_menu"
@@ -18,9 +18,9 @@
<field name="arch" type="xml">
<form>
<sheet>
<!-- <header>-->
<!-- <button name="test_submissions" string="测试提交" type="object"/>-->
<!-- </header>-->
<header>
<button name="scheduling_of_meetings" string="会议安排" type="object"/>
</header>
<div class="col-12 text-center">
<h1>
<field name="name" required="1"/>
@@ -48,6 +48,7 @@
<field name="interview_time"/>
<field name="room_id"/>
<field name="interview_results"/>
<field name="stage_id"/>
<button name="buttn_applicant_ids" type="object" string="详细信息"/>
</tree>
</field>
@@ -56,7 +56,7 @@
<label for="duration_employment"/>
<div>
<field name="duration_employment" class="oe_inline"/>至
<field name="duration_employment" class="oe_inline"/>
<field name="duration_employment_end" class="oe_inline"/>
</div>
</group>
<group col="2">
+23 -16
View File
@@ -18,19 +18,26 @@ class IssueApprovalDecision(models.Model):
district_bureau = fields.Char(string='区政府、区财政局')
remarks = fields.Char(string='备注')
# @api.onchange('sequence', 'decision_id')
# def _onchange_department_code(self):
# for code in self:
# if code.decision_id.sequence:
# code.sequence = code.decision_id.sequence + '.' + code.sequence
# else:
# code.sequence = code.sequence
# for child in code.child_ids:
# if code.sequence:
# if '.' in child.sequence:
# number = code.sequence + '.' + child.sequence.split('.')[-1]
# child.write({'sequence': number})
# else:
# child.sequence = code.sequence + '.' + (child.sequence or '')
# else:
# child.sequence = child.sequence or ''
@api.onchange('sequence', 'decision_id')
def _onchange_department_code(self):
for code in self:
if code.sequence and code.decision_id:
code.sequence = code.decision_id.sequence + ('.' + code.sequence if code.sequence else '')
else:
code.sequence = code.sequence
code._update_child_sequences()
def _update_child_sequences(self):
def recursive_update(parent, parent_sequence):
# 遍历每个子记录
for child in parent.child_ids:
# 使用父级的 sequence 更新子级的 sequence
new_sequence = parent_sequence + ('.' + child.sequence.split('.')[-1] if child.sequence else '')
self.env['issue.approval.decision'].search([('id', '=', child.id.origin)]).write({'sequence': new_sequence})
# 递归处理孙级
recursive_update(child, new_sequence)
# 从当前记录开始递归更新所有子孙级别
recursive_update(self, self.sequence)
@@ -33,6 +33,7 @@
<group col="2">
<group>
<field name="decision_id"/>
<field name="child_ids" force_save="1" invisible="1"/>
<field name="sequence"/>
<field name="council"/>
</group>
@@ -55,19 +56,6 @@
</field>
</record>
<record id="view_issue_approval_decision_search" model="ir.ui.view">
<field name="name">issue.approval.decision.form</field>
<field name="model">issue.approval.decision</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<searchpanel>
<field name="decision_id"/>
</searchpanel>
</search>
</field>
</record>
<record id="issue_approval_decision_action" model="ir.actions.act_window">
<field name="name">决策清单</field>
<field name="res_model">issue.approval.decision</field>
+1
View File
@@ -36,6 +36,7 @@
'views/property_move_views.xml',
'views/property_assess_views.xml',
'views/property_record_views.xml',
'views/property_approval_views.xml',
'views/property_menu_all.xml',
],
'demo': [],
@@ -181,4 +181,11 @@
<field name="prefix">PG%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
<record id="property_approval_code_sequence" model="ir.sequence">
<field name="name">新增物业审批编号</field>
<field name="code">property_approval_code</field>
<field name="prefix">XZ%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
</odoo>
@@ -1,5 +1,6 @@
from . import property_billing_confirmation
from . import property_business_confirm
from . import property_approval
from . import property_capacity
from . import property_collection_confirm
from . import property_early_quitting
@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
class PropertyApproval(models.Model):
_name = 'property.approval'
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_description = '新增物业审批'
name = fields.Char(string='标题')
tip_description = fields.Html('正文')
code = fields.Char(string="编号", default=lambda self: self.env['ir.sequence'].next_by_code('property_approval_code'))
property_documents_ids = fields.Many2many('documents.document', string="附件")
source = fields.Char(string="来源")
property_massage_ids = fields.One2many('property.approval.line', 'property_approval_id', string="审批信息")
class PropertyApprovalLine(models.Model):
_name = 'property.approval.line'
_description = '新增物业审批信息'
property_approval_id = fields.Many2one('property.approval', string="审批信息")
property_address = fields.Char(string="物业地址")
is_affirmation = fields.Boolean(string="是否确权")
owner = fields.Char(string="权属人")
title_number = fields.Char(string="产权编号")
area = fields.Float(string="面积")
purposes = fields.Char(string="用途")
state = fields.Selection([('rental','出租中'), ('vacant', '空置中'), ('rented', '待出租')], string="状态")
@@ -14,3 +14,14 @@ class PropertyInformation(models.Model):
code = fields.Char(string="编号",
default=lambda self: self.env['ir.sequence'].next_by_code('property_information_code'))
property_documents_ids = fields.Many2many('documents.document', string="物业信息文件")
original_property_id = fields.Many2one('property.information', string="关联物业管理变更审批")
property_name = fields.Char(string="物业名称")
company_id = fields.Many2one('res.company', string="所属公司")
admin_id = fields.Many2one('res.users', string="管理员")
precinct = fields.Char(string="片区")
management_type = fields.Char(string="管理类型")
property_id = fields.Char(string="物业ID")
@@ -6,11 +6,30 @@ from odoo import models, fields, api, exceptions, _
class PropertyManagement(models.Model):
_name = 'property.management'
_description = '物业管理审批'
_description = '物业管理变更申请表'
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_rec_name = 'name'
name = fields.Char(string='标题')
code = fields.Char(string="编号",
default=lambda self: self.env['ir.sequence'].next_by_code('property_management_code'))
property_documents_ids = fields.Many2many('documents.document', string="物业管理文件")
effective_start_date = fields.Date(string="生效开始日期")
effective_end_date = fields.Date(string="生效结束日期")
reason_change = fields.Char(string="变更事由")
handling_opinions = fields.Text(string="经办意见")
original_property_ids = fields.One2many('property.information', 'original_property_id', string="原物业信息")
new_property_ids = fields.One2many('property.information.detail.lines', 'new_property_id', string="新物业信息")
class PropertyInformationDetailLines(models.Model):
_name = 'property.information.detail.lines'
_description = '新物业信息'
new_property_id = fields.Many2one('property.management', string="新物业信息")
new_company = fields.Char(string="新公司")
new_admin = fields.Char(string="新管理员")
new_precincts = fields.Char(string="新片区")
new_management_type = fields.Char(string="新管理类型")
@@ -25,4 +25,7 @@ access_property_confirm,property_confirm,model_property_confirm,base.group_user,
access_property_move,property_move,model_property_move,base.group_user,1,1,1,1
access_property_assess,property_assess,model_property_assess,base.group_user,1,1,1,1
access_property_assess_line,property_assess_line,model_property_assess_line,base.group_user,1,1,1,1
access_property_record,property_record,model_property_record,base.group_user,1,1,1,1
access_property_record,property_record,model_property_record,base.group_user,1,1,1,1
access_property_approval,property_approval,model_property_approval,base.group_user,1,1,1,1
access_property_approval_line,property_approval_line,model_property_approval_line,base.group_user,1,1,1,1
access_property_information_detail_lines,property_information_detail_lines,model_property_information_detail_lines,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
25 access_property_move property_move model_property_move base.group_user 1 1 1 1
26 access_property_assess property_assess model_property_assess base.group_user 1 1 1 1
27 access_property_assess_line property_assess_line model_property_assess_line base.group_user 1 1 1 1
28 access_property_record property_record model_property_record base.group_user 1 1 1 1
29 access_property_approval property_approval model_property_approval base.group_user 1 1 1 1
30 access_property_approval_line property_approval_line model_property_approval_line base.group_user 1 1 1 1
31 access_property_information_detail_lines property_information_detail_lines model_property_information_detail_lines base.group_user 1 1 1 1
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_property_approval_tree" model="ir.ui.view">
<field name="name">property.approval.tree</field>
<field name="model">property.approval</field>
<field name="arch" type="xml">
<tree string="新增物业审批">
<field name="name"/>
<field name="code"/>
<field name="source"/>
</tree>
</field>
</record>
<record id="view_property_approval_form" model="ir.ui.view">
<field name="name">property.approval.form</field>
<field name="model">property.approval</field>
<field name="arch" type="xml">
<form string="新增物业审批">
<sheet>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" required="1"/>
</h1>
</div>
<group col="2">
<group>
<field name="property_documents_ids" widget="many2many_tags"/>
</group>
<group>
<field name="source"/>
</group>
</group>
<group>
<field name="tip_description" type="html"/>
</group>
<group>
<field name="property_massage_ids">
<tree editable="bottom">
<field name="property_approval_id" column_invisible="1"/>
<field name="property_address"/>
<field name="is_affirmation"/>
<field name="owner"/>
<field name="title_number"/>
<field name="area"/>
<field name="purposes"/>
<field name="state"/>
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="property_approval_action" model="ir.actions.act_window">
<field name="name">新增物业审批</field>
<field name="res_model">property.approval</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>
@@ -4,7 +4,7 @@
<field name="name">property.management.tree</field>
<field name="model">property.management</field>
<field name="arch" type="xml">
<tree string="物业管理审批">
<tree string="物业管理变更申请表">
<field name="name"/>
<field name="code"/>
</tree>
@@ -15,7 +15,7 @@
<field name="name">property.management.form</field>
<field name="model">property.management</field>
<field name="arch" type="xml">
<form string="物业管理审批">
<form string="物业管理变更申请表">
<sheet>
<div class="oe_title">
<label for="name"/>
@@ -23,23 +23,49 @@
<field name="name" required="1"/>
</h1>
</div>
<group>
<group col="2">
<group>
<field name="code"/>
<field name="property_documents_ids">
<tree>
<field name="name"/>
</tree>
</field>
<field name="effective_start_date"/>
</group>
<group>
<field name="reason_change"/>
<field name="effective_end_date"/>
</group>
</group>
<group>
<field name="handling_opinions"/>
</group>
<group string="原物业信息">
<field name="original_property_ids" string=" ">
<tree editable="bottom">
<field name="original_property_id" column_invisible="1"/>
<field name="property_name"/>
<field name="company_id"/>
<field name="admin_id"/>
<field name="precinct"/>
<field name="management_type"/>
<field name="property_id"/>
</tree>
</field>
</group>
<group string="新物业信息">
<field name="new_property_ids" string=" ">
<tree editable="bottom">
<field name="new_property_id" column_invisible="1"/>
<field name="new_company"/>
<field name="new_admin"/>
<field name="new_precincts"/>
<field name="new_management_type"/>
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="property_management_action" model="ir.actions.act_window">
<field name="name">物业管理审批</field>
<field name="name">物业管理变更审批</field>
<field name="res_model">property.management</field>
<field name="view_mode">tree,form</field>
</record>
@@ -1,5 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<menuitem
id="property_approval_menu"
parent="yuthon_property.property_approval_menu"
name="新增物业审批"
action="property_approval_action"
sequence="19"/>
<menuitem
id="property_billing_confirmation_menu"
parent="yuthon_property.property_approval_menu"
@@ -94,7 +102,7 @@
<menuitem
id="property_management_menu"
parent="yuthon_property.property_approval_menu"
name="物业管理审批"
name="物业管理变更申请表"
action="property_management_action"
sequence="33"/>
+9 -7
View File
@@ -93,6 +93,11 @@
parent="hr_process_work_job_menu_board"
action="yuthon_hr_employee_approval.yuthon_message_login_action"
sequence="9"/>
<menuitem id="hr_menu_prepare_approval_root_board"
name="编制调整申请表"
parent="hr_process_work_job_menu_board"
action="yuthon_hr_employee_approval.yuthon_prepare_approval_action"
sequence="11"/>
<menuitem id="hr_recruitment_app2_menu_board"
name="应用"
parent="hr_recruitment_setting_menu_board"
@@ -137,6 +142,8 @@
parent="hr_recruitment_setting_menu_board"
action="hr_recruitment.hr_applicant_category_action"
sequence="15"/>
<!-- 人事 -->
<menuitem id="hr_menu_root_board"
name="人事管理"
@@ -189,21 +196,16 @@
parent="hr_set_process_menu_root_board"
action="yuthon_hr_employee_approval.yuthon_leaving_approval_action"
sequence="3"/>
<menuitem id="hr_menu_prepare_approval_root_board"
name="编制调整申请表"
parent="hr_set_process_menu_root_board"
action="yuthon_hr_employee_approval.yuthon_prepare_approval_action"
sequence="5"/>
<menuitem id="hr_menu_rank_approval_root_board"
name="职级调整申请表"
parent="hr_set_process_menu_root_board"
action="yuthon_none_action"
sequence="7"/>
sequence="5"/>
<menuitem id="hr_menu_reassignment_approval_root_board"
name="调岗申请"
parent="hr_set_process_menu_root_board"
action="yuthon_hr_employee_approval.yuthon_reassignment_approval_action"
sequence="9"/>
sequence="7"/>
<menuitem id="hr_menu_reward_approval_root_board"
name="员工奖罚"
parent="hr_set_process_menu_root_board"