pengyuthon

This commit is contained in:
李鹏宇
2024-10-07 18:09:31 +08:00
parent 3ab901b269
commit 854c9ce9a3
33 changed files with 386 additions and 46 deletions
+5 -1
View File
@@ -8,6 +8,7 @@
"depends": ["base", "crnd_web_diagram_plus", "hr"],
"data": [
"data/soong_workflow_note_data.xml",
"data/soong_workflow_inspector_code.xml",
"security/soong_workflow_security.xml",
"security/ir.model.access.csv",
"views/kklw_workflow_approval_views.xml",
@@ -22,10 +23,13 @@
"views/soong_approval_group.xml",
"views/trans_link_views.xml",
"views/soong_workflow_entrust_views.xml",
"views/menuitem.xml",
"views/soong_workflow_inspector_views.xml",
'wizard/approval_notice_wizard_views.xml',
"wizard/soong_workflow_comment_wizard_view.xml",
"templates/soong_workflow_templates.xml",
"views/menuitem.xml",
],
"installable": True,
"auto_install": False,
-2
View File
@@ -1,2 +0,0 @@
1. 预置审批分组
2. 我的请求要开发
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="inspector_code_data" model="ir.sequence">
<field name="name">督办编号</field>
<field name="code">inspector_code</field>
<field name="prefix">IC%(y)s%(month)s%(day)s</field>
<field name="padding">3</field>
</record>
</odoo>
+1
View File
@@ -14,3 +14,4 @@ from . import soong_workflow_log
from . import soong_approval_group
from . import trans_link
from . import soong_workflow_entrust
from . import soong_workflow_inspector
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
import logging
import datetime
from odoo import models, fields, api, _, modules
from odoo.exceptions import ValidationError, UserError
class SoongWorkflowInspector(models.Model):
_name = "soong.workflow.inspector"
_description = "督查督办"
name = fields.Char(string="督办主题")
start_data = fields.Date(string="开始日期")
end_data = fields.Date(string="结束日期")
code = fields.Char(string="督办编号", default=lambda self: self.env['ir.sequence'].next_by_code('inspector_code'))
department_id = fields.Many2one('hr.department', string="部门")
inspector_importance = fields.Selection([('normal', '正常'), ('urgent', '紧急')], string="重要程度")
inspector_html = fields.Html(string="督办内容")
inspector_text = fields.Text(string="督办要求")
document_id = fields.Binary(string="附件")
inspector_line_ids = fields.One2many('soong.workflow.inspector.line', 'workflow_inspector_id', string='任务进度')
inspector_line2_ids = fields.One2many('soong.workflow.inspector.line2', 'workflow_inspector_id', string='督办明细')
attachment_ids = fields.Many2many('ir.attachment', string='Attachments')
class SoongWorkflowInspectorLine(models.Model):
_name = "soong.workflow.inspector.line"
_description = "任务进度"
workflow_inspector_id = fields.Many2one('soong.workflow.inspector', string="督办标题")
department_id = fields.Many2one('hr.department', string="部门")
task_text = fields.Text(string="内容")
end_data = fields.Date(string="截止日期")
task_state = fields.Selection([('no', '未办结'), ('ing', '进行中'), ('ed', '已超时'), ('done', '已办结')], string="状态")
employee_id = fields.Many2one('hr.employee', string="上级负责人")
# 办结
def inspector_task_done(self):
pass
# 任务下发
def inspector_task_issued(self):
pass
# 延期
def long_end_data(self):
pass
class SoongWorkflowInspectorLine2(models.Model):
_name = "soong.workflow.inspector.line2"
_description = "督办事项明细"
workflow_inspector_id = fields.Many2one('soong.workflow.inspector', string="督办事项")
department_id = fields.Many2one('hr.department', string="部门")
employee_id = fields.Many2one('hr.employee', string="部门负责人")
end_data = fields.Date(string="截止日期")
inspector_line_text = fields.Text(string="工作内容")
+39 -5
View File
@@ -66,6 +66,7 @@ class SoongWorkflowMixin(models.AbstractModel):
approval_users_ids = fields.One2many("soong.approval.users", "res_id",
domain=lambda self: [('res_model', '=', self._name)], auto_join=True,
string="审批明细")
approval_sign_ids = fields.Many2many('res.users', string="加签人员")
@api.depends("state")
def _compute_workflow_id(self):
@@ -152,9 +153,11 @@ class SoongWorkflowMixin(models.AbstractModel):
def _add_comment(self, logs, btn_rec):
wizard = self.env.ref("soong_workflow.view_soong_workflow_comment_wizard")
# 状态列表
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.node_id.workflow_id.node_ids]
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.workflow_id.node_ids]
# 当前节点状态
self_state = state_list.index('拟办' if self.state == 'start' else self.state)
# 下一个节点
next_state = btn_rec.workflow_id.node_ids[self_state + 1].button_ids[0]
self.env['trans.link'].search([]).unlink()
if btn_rec.name == '转交' and len(btn_rec.node_id.out_link_ids) > 1:
for state in btn_rec.node_id.out_link_ids:
@@ -172,6 +175,13 @@ class SoongWorkflowMixin(models.AbstractModel):
'link_type': 'return',
'record_id': self.id,
})
# 不自动匹配
employee_user_role_ids = self.env['hr.employee'].search([('user_role_id', '=', next_state.users_role_id.id)])
# 自动匹配
employee_user_role_id = self.env['hr.employee'].search([('user_role_id', '=', next_state.users_role_id.id),
('department_id', '=', self.department_id.id)])
return {
"name": _("评论"),
"type": "ir.actions.act_window",
@@ -184,6 +194,8 @@ class SoongWorkflowMixin(models.AbstractModel):
"default_res_id": self.id,
"default_res_model": self._name,
"default_log_ids": logs.ids,
"default_is_automatic": next_state.is_automatic,
"default_employee_ids": employee_user_role_ids.ids if not next_state.is_automatic else employee_user_role_id.ids,
"default_node_btn_id": btn_rec.id,
"default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '',
},
@@ -262,6 +274,7 @@ class SoongWorkflowMixin(models.AbstractModel):
res = self._update_fields_view(view_type, res)
# res = self._add_state_tree_view(view_type, res)
res = self._add_soong_workflow_log(view_type, res, params)
res = self._load_sign_view(view_type, res)
return res
# 收回
@@ -564,10 +577,31 @@ class SoongWorkflowMixin(models.AbstractModel):
res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "")
return res
def create_field_element(self, field_name):
field_el = etree.Element("field")
field_el.set("name", field_name)
return field_el
def _load_sign_view(self, view_type, res):
arch = etree.fromstring(res["arch"])
if view_type == "form":
sheet_el = arch.xpath("//sheet")
if sheet_el:
sheet_el = sheet_el[0]
else:
sheet_el = etree.Element("sheet")
arch.insert(0, sheet_el)
notebook_el = sheet_el.xpath(".//notebook")
if notebook_el:
notebook_el = notebook_el[0]
else:
notebook_el = etree.Element("notebook")
sheet_el.append(notebook_el)
page_el = etree.Element("page")
page_el.set("string", "加签人员") # 设置页面标签
# page_el.set("invisible", "1") # todo domain
field_m2m_el = etree.Element("field")
field_m2m_el.set("name", "approval_sign_ids")
field_m2m_el.set("widget", "many2many_tags")
page_el.append(field_m2m_el)
notebook_el.append(page_el)
res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "")
return res
def _update_fields_view(self, view_type, res):
"""
+23 -11
View File
@@ -127,6 +127,23 @@ class SoongWorkflowNode(models.Model):
"action_type": "code",
"code": "obj.action_withdraw()",
},),
(0, 0, {
"name": _("加签"),
"workflow_id": val['workflow_id'],
"sequence": 3,
"action_type": "code",
"has_comment": True,
},),
(0, 0, {
"name": _("加签确认"),
"workflow_id": val['workflow_id'],
"sequence": 3,
"action_type": "code",
"btn_hide": True,
"review_type": 'expression',
# "reviewer_expression": "obj.action_withdraw()", # todo domain
"has_comment": True,
},),
(0, 0, {
"name": _("退回"),
"workflow_id": val['workflow_id'],
@@ -205,18 +222,13 @@ class SoongWorkflowNodeButton(models.Model):
sequence = fields.Integer(
string="Sequence", default=10, help="Arrange buttons by defining sequence."
)
is_highlight = fields.Boolean(
string="Is Highlighted",
default=True,
help="Control highlighting of the button if needs user attention..",
)
is_highlight = fields.Boolean(string="Is Highlighted", default=True,
help="Control highlighting of the button if needs user attention..", )
has_icon = fields.Boolean(
string="Has Icon", help="Enable it to add icon to the button."
)
icon = fields.Char(
string="Icon",
help="Enter icon name like: fa-print, it's recommended to use FontAwesome Icons.",
)
icon = fields.Char(string="Icon",
help="Enter icon name like: fa-print, it's recommended to use FontAwesome Icons.", )
has_comment = fields.Boolean(string="评论", default=False)
btn_key = fields.Char(string="Button Key", default=_generate_key)
btn_hide = fields.Boolean(
@@ -279,6 +291,7 @@ class SoongWorkflowNodeButton(models.Model):
required=True,
ondelete="cascade",
)
is_automatic = fields.Boolean('是否自动匹配', default=True)
@api.onchange("node_id")
def change_workflow(self):
@@ -382,8 +395,7 @@ class SoongWorkflowNodeButton(models.Model):
user_ids += user_role_id.ids
# 发送信息提醒
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')
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
+5 -1
View File
@@ -26,4 +26,8 @@ access_soong_workflow_log_user,soong_workflow_log_user,model_soong_workflow_log,
access_soong_workflow_comment_wizard_user,soong_workflow_comment_wizard_user,model_soong_workflow_comment_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
access_trans_link,trans_link,model_trans_link,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_entrust,soong_workflow_entrust,model_soong_workflow_entrust,soong_workflow.group_soong_workflow_user,1,1,1,1
access_entrust_all,entrust_all,model_entrust_all,soong_workflow.group_soong_workflow_user,1,1,1,1
access_entrust_all,entrust_all,model_entrust_all,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_inspector,soong_workflow_inspector,model_soong_workflow_inspector,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_inspector_line,soong_workflow_inspector_line,model_soong_workflow_inspector_line,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_inspector_line2,soong_workflow_inspector_line2,model_soong_workflow_inspector_line2,soong_workflow.group_soong_workflow_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
26 access_soong_workflow_entrust soong_workflow_entrust model_soong_workflow_entrust soong_workflow.group_soong_workflow_user 1 1 1 1
27 access_entrust_all entrust_all model_entrust_all soong_workflow.group_soong_workflow_user 1 1 1 1
28 access_soong_workflow_inspector soong_workflow_inspector model_soong_workflow_inspector soong_workflow.group_soong_workflow_user 1 1 1 1
29 access_soong_workflow_inspector_line soong_workflow_inspector_line model_soong_workflow_inspector_line soong_workflow.group_soong_workflow_user 1 1 1 1
30 access_soong_workflow_inspector_line2 soong_workflow_inspector_line2 model_soong_workflow_inspector_line2 soong_workflow.group_soong_workflow_user 1 1 1 1
31
32
33
+28
View File
@@ -34,6 +34,34 @@
action="soong_workflow_entrust_action"
parent="menu_soong_workflow_root"/>
<menuitem id="menu_soong_workflow_inspector"
sequence="4"
name="督查督办"
parent="menu_soong_workflow_root"/>
<menuitem id="menu_soong_workflow_inspector_approval"
sequence="1"
name="督察审批"
action="soong_workflow_inspector_action"
parent="menu_soong_workflow_inspector"/>
<menuitem id="menu_soong_workflow_inspector_transact"
sequence="3"
name="督察办理"
parent="menu_soong_workflow_inspector"/>
<!-- 督办事项的表单 -->
<menuitem id="menu_soong_workflow_inspector_transact_sth"
sequence="1"
name="督察事项"
action="soong_workflow_inspector_line_action"
parent="menu_soong_workflow_inspector_transact"/>
<menuitem id="menu_soong_workflow_inspector_transact_my"
sequence="3"
name="我的任务"
action="soong_workflow_inspector_line_action"
parent="menu_soong_workflow_inspector_transact"/>
<menuitem id="menu_soong_other_setting"
sequence="3"
name="其他配置"
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="soong_workflow_inspector_tree" model="ir.ui.view">
<field name="name">soong.workflow.inspector.tree</field>
<field name="model">soong.workflow.inspector</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="code"/>
<field name="department_id"/>
<field name="inspector_importance"/>
<field name="start_data"/>
<field name="end_data"/>
</tree>
</field>
</record>
<record id="soong_workflow_inspector_form" model="ir.ui.view">
<field name="name">soong.workflow.inspector.form</field>
<field name="model">soong.workflow.inspector</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name" required="1"/>
<field name="department_id"/>
</group>
<group>
<field name="code"/>
<field name="inspector_importance"/>
<label for="start_data"/>
<div>
<field name="start_data" class="oe_inline"/>至
<field name="end_data" class="oe_inline"/>
</div>
</group>
</group>
<group>
<group>
<field name="inspector_html"/>
<field name="inspector_text"/>
<field name="document_id"/>
</group>
<group strin="文档可视化测试">
<field name="attachment_ids" widget="preview_many2many"/>
</group>
</group>
<group>
<field name="inspector_line2_ids">
<tree>
<field name="workflow_inspector_id" column_invisible="1"/>
<field name="department_id"/>
<field name="employee_id"/>
<field name="end_data"/>
<field name="inspector_line_text"/>
</tree>
</field>
</group>
<notebook>
<page string="任务进度">
<field name="inspector_line_ids">
<tree>
<field name="workflow_inspector_id" column_invisible="1"/>
<field name="task_text"/>
<field name="end_data"/>
<field name="task_state"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="soong_workflow_inspector_action" model="ir.actions.act_window">
<field name="name">督查督办</field>
<field name="res_model">soong.workflow.inspector</field>
<field name="view_mode">tree,form</field>
</record>
<!-- 督办事项的表单 -->
<record id="soong_workflow_inspector_line_tree" model="ir.ui.view">
<field name="name">soong.workflow.inspector.line.tree</field>
<field name="model">soong.workflow.inspector.line</field>
<field name="arch" type="xml">
<tree>
<field name="department_id"/>
<field name="employee_id"/>
<field name="end_data"/>
<field name="task_state"/>
<field name="task_text"/>
<field name="workflow_inspector_id"/>
<button name="long_end_data" string="延期" type="object" class="btn-primary"/>
<button name="inspector_task_done" string="办结" type="object" class="btn-primary"/>
<button name="inspector_task_issued" string="任务下发" type="object" class="btn-primary"/>
</tree>
</field>
</record>
<record id="soong_workflow_inspector_line_action" model="ir.actions.act_window">
<field name="name">督察事项</field>
<field name="res_model">soong.workflow.inspector.line</field>
<field name="view_mode">tree</field>
</record>
</odoo>
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--
Workflow Links
-->
<record id="view_form_soong_workflow_link" model="ir.ui.view">
<field name="name">soong.workflow.link.form</field>
<field name="model">soong.workflow.link</field>
@@ -144,6 +144,7 @@
<field name="name" required="1"/>
<field name="is_highlight"/>
<field name="has_comment"/>
<field name="is_automatic"/>
</group>
<group>
<field name="node_id" options="{'no_open': True, 'no_create': True}"
@@ -15,7 +15,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
node_btn_name = fields.Char(string="动作名称", related='node_btn_id.name')
node_link_len = fields.Char(string="转交2")
comment_note_id = fields.Many2one('soong.note', required=True, string="意见")
comment_note_id = fields.Many2one('soong.note', string="意见")
comment_type = fields.Selection(related="comment_note_id.type", string="意见类型")
comment_return_type = fields.Char(related="comment_note_id.return_type", string="退回类型")
state_list = fields.Char(string="状态列表")
@@ -35,6 +35,8 @@ class SoongWorkflowCommentWizard(models.TransientModel):
users_role_ids = fields.Many2many('soong.user.role', string='角色范围')
approval_users_ids = fields.Many2many('res.users', string="传阅/督办人员", compute="compute_approval_users_ids", store=True)
is_automatic = fields.Boolean('是否自动识别')
@api.depends('department_ids', 'employee_ids', 'users_role_ids')
def compute_approval_users_ids(self):
department_users_list = users_role_list = []
@@ -70,5 +72,9 @@ class SoongWorkflowCommentWizard(models.TransientModel):
if self.node_btn_name == '退回':
record_id.write({'state': 'start' if self.return_link_id.name == '拟办' else self.return_link_id.name})
# 填写审批记录
self.log_ids.write({"comment": self.comment_note_id.name})
if self.node_btn_name != '加签':
self.log_ids.write({"comment": self.comment_note_id.name})
# 加签人员写入
if self.node_btn_name == '加签':
record_id.approval_sign_ids = self.approval_users_ids
return self.node_btn_id.with_context(cx).run()
@@ -13,10 +13,11 @@
<field name="node_btn_name" invisible="1"/>
<field name="node_link_len" invisible="1"/>
<field name="record_id" invisible="1"/>
<field name="is_automatic" invisible="1"/>
<!-- 退回意见退回类型 -->
<field name="return_link_id" invisible="node_btn_name != '退回'" string="退回节点"/>
<field name="comment_note_id" invisible="node_btn_name != '退回'" string="退回意见" domain="[('type','=','return')]"/>
<field name="comment_return_type" invisible="node_btn_name != '退回'" required="node_btn_name != '退回'"/>
<field name="comment_return_type" invisible="node_btn_name != '退回'"/>
<!-- 转交人员 -->
<field name="trans_link_id" invisible="not node_link_len" string="转交节点"/>
<field name="comment_note_id" invisible="node_btn_name != '转交'" string="转交意见" domain="[('type','=','agree')]"/>
@@ -26,10 +27,12 @@
<field name="start_date" invisible="send_type != 'super'"/>
<field name="end_date" invisible="send_type != 'super'"/>
<field name="comment_note_id" invisible="node_btn_name != '分发'" string="督办意见" domain="[('type','=','super')]"/>
<field name="department_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
<field name="employee_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
<field name="users_role_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
<field name="department_ids" invisible="node_btn_name not in ['加签', '分发']" widget="many2many_tags"/>
<field name="comment_note_id" invisible="node_btn_name != '加签确认'" string="加签意见"/>
<field name="employee_ids" widget="many2many_tags" invisible="node_btn_name == '加签确认'"/>
<field name="users_role_ids" invisible="node_btn_name not in ['加签', '分发']" widget="many2many_tags"/>
<field name="approval_users_ids" invisible="node_btn_name != '分发'" widget="many2many_tags"/>
<field name="approval_users_ids" string='加签人员' invisible="node_btn_name != '加签'" widget="many2many_tags"/>
</group>
<footer>
<button name="add_comment" string="确认" type="object" class="oe_highlight"/>
+4 -1
View File
@@ -12,7 +12,8 @@
'category': 'Human Resources/Attendances',
'sequence': 240,
'website': 'https://www.pengyuthon.com',
'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail', 'soong_workflow'],
# 'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail', 'soong_workflow'],
'depends': ['hr_attendance', 'resource', 'base', 'hr', 'mail'],
'data': [
'security/ir.model.access.csv',
# 'security/approval_attendance.xml',
@@ -32,6 +33,8 @@
'views/card_approval.xml',
'views/holiday_manage.xml',
'views/holiday_manage_balance.xml',
'views/attendance_iot_datas.xml',
'views/yuthon_mqtt_service.xml',
'views/all_attendance_menu.xml',
],
'installable': True,
+1
View File
@@ -14,4 +14,5 @@ from . import holiday_manage
from . import holiday_manage_balance
from . import attendance_iot_manager
from . import attendance_iot_datas
from . import yuthon_mqtt_service
+2 -1
View File
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class CardApprovals(models.Model):
_name = 'card.approval'
_description = "补卡审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('card_approval'))
+2 -1
View File
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class DutyApprovals(models.Model):
_name = 'duty.approval'
_description = "值班审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('duty_approval'))
+2 -1
View File
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class GoApprovals(models.Model):
_name = 'go.approval'
_description = "外出审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('go_approval'))
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class HolidaysApprovals(models.Model):
_name = 'holidays.approval'
_description = "请假审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('holidays_approval'))
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class LeaveApprovals(models.Model):
_name = 'leave.approval'
_description = "调休审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('leave_approval'))
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class OvertimeApprovals(models.Model):
_name = 'overtime.approval'
_description = "加班审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('overtime_approval'))
@@ -6,7 +6,8 @@ from datetime import datetime, time, timedelta
class RemoveHolidayApprovals(models.Model):
_name = 'remove.holiday.approval'
_description = "销假审批"
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
# _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin']
_rec_name = 'name'
name = fields.Char(string="名称", default=lambda self: self.env['ir.sequence'].next_by_code('remove_holidays_approval'))
@@ -12,5 +12,6 @@ access_holiday_manage,holiday_manage,model_holiday_manage,base.group_user,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
access_yuthon_mqtt_service,yuthon_mqtt_service,model_yuthon_mqtt_service,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
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 access_yuthon_mqtt_service yuthon_mqtt_service model_yuthon_mqtt_service base.group_user 1 1 1 1
16
17
@@ -32,4 +32,6 @@
sequence="18" action="resource.action_resource_calendar_form"/>
<menuitem id="menu_hr_attendance_lot_datas" name="上传识别记录" parent="hr_attendance.menu_hr_attendance_root"
sequence="21" action="attendance_iot_datas_action"/>
<menuitem id="menu_yuthon_mqtt_service_config" name="mqtt服务配置" parent="hr_attendance.menu_hr_attendance_root"
sequence="22" action="act_yuthon_mqtt_service_config"/>
</odoo>
@@ -7,13 +7,15 @@
<tree string="上传记录">
<!-- <field name="name"/>-->
<field name="attendance_date"/>
<field name="attendance_number"/>
<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>
<field name="view_mode">tree</field>
</record>
</odoo>
+1
View File
@@ -1,2 +1,3 @@
from . import controllers
from . import models
from . import wizard
@@ -0,0 +1 @@
from . import employee_banner_route
@@ -0,0 +1,31 @@
from odoo.http import Controller, request, route
from datetime import datetime
from odoo import models, fields, api, http, SUPERUSER_ID, _
class EmployeeBannerRoute(Controller):
@route('/employee/banner/route', type='json', auth='user')
def employee_banner_route(self):
employees = request.env['hr.employee'].sudo()
hired_count = employees.search_count([('use_user_type', '=', 'formal')]) # 正式
in_hired_count = employees.search_count([]) # 在职
all_hired_count = employees.search_count([]) # 全职
return {
'html': f"""
<div style="display: flex; justify-content: space-around; align-items: center; text-align: center; padding: 20px; width: 100%;">
<div style="flex: 1; padding: 20px;">
<h2>正式/h2>
<p style="font-size: 24px; color: #4CAF50;">{hired_count}</p>
</div>
<div style="flex: 1; padding: 20px;">
<h2>在职</h2>
<p style="font-size: 24px; color: #2196F3;">{in_hired_count}</p>
</div>
<div style="flex: 1; padding: 20px;">
<h2>全职</h2>
<p style="font-size: 24px; color: #FF5722;">{all_hired_count}</p>
</div>
</div>
"""
}
@@ -194,6 +194,9 @@
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_tree"/>
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="banner_route">/employee/banner/route</attribute>
</xpath>
<xpath expr="//field[@name='activity_ids']" position="attributes">
<attribute name="column_invisible">1</attribute>
</xpath>
@@ -205,7 +208,6 @@
</xpath>
<xpath expr="//field[@name='name']" position="after">
<field name="company_old"/>
</xpath>
<xpath expr="//field[@name='job_id']" position="after">
<field name="number" optional="hide"/>
+1 -1
View File
@@ -11,7 +11,7 @@
'license': 'LGPL-3',
'author': 'pengyuthon',
'website': 'https://www.pengyuthon.com',
'depends':['base', 'hr', 'yuthon_hr_employee', 'soong_workflow', 'documents','hr_recruitment','room'],
'depends':['base', 'hr', 'yuthon_hr_employee', 'soong_workflow', 'documents', 'hr_recruitment', 'room'],
'data': [
'security/ir.model.access.csv',
'data/process_code_data.xml',
+1 -1
View File
@@ -154,7 +154,7 @@
parent="hr_set_process_menu_root_board"
action="yuthon_hr_employee_approval.yuthon_leaving_approval_action"
sequence="5"/>
<menuitem id="hr_menu_title_approval_root_board"
<menuitem id="hr_menu_appointment_approval_root_board"
name="职称聘任申请表"
parent="hr_set_process_menu_root_board"
action="yuthon_hr_employee_approval.yuthon_appointment_approval_action"
+28 -5
View File
@@ -66,6 +66,29 @@
name="工作委托"
action="soong_workflow.soong_workflow_entrust_action"
parent="menu_soong_workflow_root_board"/>
<menuitem id="menu_soong_workflow_inspector_board"
sequence="4"
name="督查督办"
parent="menu_soong_workflow_root_board"/>
<menuitem id="menu_soong_workflow_inspector_approval_board"
sequence="1"
name="督察审批"
action="soong_workflow.soong_workflow_inspector_action"
parent="menu_soong_workflow_inspector_board"/>
<menuitem id="menu_soong_workflow_inspector_transact_board"
sequence="3"
name="督察办理"
parent="menu_soong_workflow_inspector_board"/>
<menuitem id="menu_soong_workflow_inspector_transact_sth_board"
sequence="1"
name="督察事项"
action="soong_workflow.soong_workflow_inspector_line_action"
parent="menu_soong_workflow_inspector_transact_board"/>
<menuitem id="menu_soong_workflow_inspector_transact_my_board"
sequence="3"
name="我的任务"
action="soong_workflow.soong_workflow_inspector_line_action"
parent="menu_soong_workflow_inspector_transact_board"/>
<menuitem id="menu_soong_other_setting_board"
sequence="5"
name="其他配置"
@@ -85,11 +108,11 @@
parent="menu_soong_other_setting_board"
action="soong_workflow.soong_approval_group_action"
sequence="5"/>
<!-- <menuitem id="soong_workflow_record_menu_board"-->
<!-- name="工作流记录"-->
<!-- parent="menu_soong_workflow_root_board"-->
<!-- action="soong_workflow.soong_workflow_record_action"-->
<!-- sequence="5"/>-->
<!-- <menuitem id="soong_workflow_record_menu_board"-->
<!-- name="工作流记录"-->
<!-- parent="menu_soong_workflow_root_board"-->
<!-- action="soong_workflow.soong_workflow_record_action"-->
<!-- sequence="5"/>-->
<!-- 议题库 -->
<menuitem id="tianhe_issue_library_menu_root_board"
name="议题管理"