餐饮人员配置
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
'views/yuthon_catering_setting_views.xml',
|
||||
'views/yuthon_catering_templates.xml',
|
||||
'wizard/catering_reinstated_wizard_views.xml',
|
||||
'wizard/catering_conf_change_wizard_views.xml',
|
||||
'data/yuthon_catering_cron.xml',
|
||||
'views/root_menu.xml',
|
||||
],
|
||||
|
||||
@@ -103,10 +103,15 @@ class YuthonCatering(models.Model):
|
||||
'lunch': True,
|
||||
})
|
||||
|
||||
def _get_active_conf_employees(self):
|
||||
"""获取当前有效配置(无失效日期)的员工列表"""
|
||||
conf = self.env['yuthon.catering.conf'].search([('expiry_date', '=', False)], limit=1)
|
||||
return conf.employee_ids if conf else self.env['hr.employee']
|
||||
|
||||
def task_catering(self):
|
||||
today = fields.Date.today()
|
||||
tomorrow = today + timedelta(days=1)
|
||||
employee_ids = self.env['yuthon.catering.conf'].search([])[0].employee_ids
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
if not self._process_shift_days(today):
|
||||
return
|
||||
tomorrow_menu = self.env['yuthon.menu.setting'].search([
|
||||
@@ -130,8 +135,8 @@ class YuthonCatering(models.Model):
|
||||
def task_conf(self):
|
||||
tomorrow = fields.Date.today() + timedelta(days=1)
|
||||
company_main = self.env["res.company"].search([("name", "=", "集团本部")], limit=1)
|
||||
catering_conf = self.env["yuthon.catering.conf"].search([("company_id", "=", company_main.id)])
|
||||
employee_ids = catering_conf.mapped('employee_ids')
|
||||
catering_conf = self.env['yuthon.catering.conf'].search([('company_id', '=', company_main.id), ('expiry_date', '=', False)], limit=1)
|
||||
employee_ids = catering_conf.employee_ids if catering_conf else self.env['hr.employee']
|
||||
menu_setting = self.env["yuthon.menu.setting"].search([("menu_date", "=", tomorrow)], limit=1)
|
||||
if not menu_setting:
|
||||
return
|
||||
@@ -185,8 +190,7 @@ class YuthonCatering(models.Model):
|
||||
|
||||
|
||||
def catering_task(self):
|
||||
conf_records = self.env['yuthon.catering.conf'].search([])
|
||||
employee_ids = conf_records.mapped('employee_ids')
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
|
||||
# 获取今天的日期
|
||||
today = fields.Date.today()
|
||||
@@ -232,10 +236,9 @@ class YuthonCatering(models.Model):
|
||||
menu_today = self.env['yuthon.menu.setting'].search([('menu_date', '=', today)], limit=1)
|
||||
if not menu_today:
|
||||
return
|
||||
conf_records = self.env['yuthon.catering.conf'].search([])
|
||||
if not conf_records:
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
if not employee_ids:
|
||||
return
|
||||
employee_ids = conf_records.mapped('employee_ids')
|
||||
create_vals = []
|
||||
for employee in employee_ids:
|
||||
existing = self.search([
|
||||
@@ -333,8 +336,7 @@ class YuthonCatering(models.Model):
|
||||
# 如果不是工作日,则不发送提醒
|
||||
return
|
||||
# 发送通用提醒消息
|
||||
conf_records = self.env['yuthon.catering.conf'].search([])
|
||||
employees = conf_records.mapped('employee_ids')
|
||||
employees = self._get_active_conf_employees()
|
||||
|
||||
for employee in employees:
|
||||
if employee.user_id: # 确保员工有关联的用户
|
||||
@@ -358,7 +360,7 @@ class YuthonCatering(models.Model):
|
||||
|
||||
# 一次性,生成3.1-3.3所有数据,状态为已确认
|
||||
def test_1(self):
|
||||
employee_ids = self.env['yuthon.catering.conf'].search([])[0].employee_ids
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
for emp in employee_ids:
|
||||
self.env['yuthon.catering'].create({
|
||||
'date': '2026-03-01',
|
||||
@@ -394,10 +396,7 @@ class YuthonCatering(models.Model):
|
||||
"""一次性:补3月4日缺失数据,已确认且早餐午餐全勾"""
|
||||
from datetime import date as date_cls
|
||||
target_date = date_cls(2026, 3, 4)
|
||||
conf_records = self.env['yuthon.catering.conf'].search([])
|
||||
if not conf_records:
|
||||
return
|
||||
employee_ids = conf_records.mapped('employee_ids')
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
if not employee_ids:
|
||||
return
|
||||
create_vals = []
|
||||
@@ -421,10 +420,7 @@ class YuthonCatering(models.Model):
|
||||
"""表3月12日缺失员工的餐饮收集任务数据"""
|
||||
from datetime import date as date_cls
|
||||
target_date = date_cls(2026, 3, 12)
|
||||
conf_records = self.env['yuthon.catering.conf'].search([])
|
||||
if not conf_records:
|
||||
return
|
||||
employee_ids = conf_records.mapped('employee_ids')
|
||||
employee_ids = self._get_active_conf_employees()
|
||||
if not employee_ids:
|
||||
return
|
||||
create_vals = []
|
||||
@@ -445,7 +441,7 @@ class YuthonCatering(models.Model):
|
||||
def batch_generate_catering(self):
|
||||
"""批量生成2025-12、2026-01、2026-02的餐饮收集任务数据,排除节假日"""
|
||||
from datetime import date as date_cls
|
||||
conf = self.env['yuthon.catering.conf'].search([], limit=1)
|
||||
conf = self.env['yuthon.catering.conf'].search([('expiry_date', '=', False)], limit=1)
|
||||
if not conf or not conf.employee_ids:
|
||||
return
|
||||
employee_ids = conf.employee_ids
|
||||
|
||||
@@ -4,12 +4,39 @@ from odoo import api, fields, models
|
||||
|
||||
class YuthonCateringConf(models.Model):
|
||||
_name = 'yuthon.catering.conf'
|
||||
_order = 'is_active desc, effective_date desc'
|
||||
|
||||
company_id = fields.Many2one(string='公司', comodel_name='res.company', required=True, default=lambda self: self.env.company)
|
||||
employee_ids = fields.Many2many(string='员工', comodel_name='hr.employee')
|
||||
employee_count = fields.Integer(string='人数', compute='_compute_employee_count', store=True)
|
||||
effective_date = fields.Date(string='生效日期')
|
||||
expiry_date = fields.Date(string='失效日期')
|
||||
is_active = fields.Integer(string='是否生效', compute='_compute_is_active', store=True)
|
||||
|
||||
@api.depends('employee_ids')
|
||||
def _compute_employee_count(self):
|
||||
for record in self:
|
||||
record.employee_count = len(record.employee_ids)
|
||||
|
||||
@api.depends('expiry_date')
|
||||
def _compute_is_active(self):
|
||||
for record in self:
|
||||
record.is_active = 0 if record.expiry_date else 1
|
||||
|
||||
def action_change_employees(self):
|
||||
"""变更员工按鈕:打开wizard"""
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': '变更员工',
|
||||
'res_model': 'catering.conf.change.wizard',
|
||||
'view_mode': 'form',
|
||||
'target': 'new',
|
||||
'context': {'active_id': self.id},
|
||||
}
|
||||
|
||||
def action_fix_null_effective_date(self):
|
||||
"""一次性修复:将没有生效日期的记录补为 2020-01-01,使其排到最下面"""
|
||||
from datetime import date as date_cls
|
||||
records = self.search([('effective_date', '=', False)])
|
||||
if records:
|
||||
records.write({'effective_date': date_cls(2020, 1, 1)})
|
||||
|
||||
@@ -4,5 +4,6 @@ access_yuthon_catering_conf,yuthon_catering_conf,model_yuthon_catering_conf,,1,1
|
||||
access_yuthon_menu_setting,yuthon_menu_setting,model_yuthon_menu_setting,,1,1,1,1
|
||||
access_yuthon_dishes_setting,yuthon_dishes_setting,model_yuthon_dishes_setting,,1,1,1,1
|
||||
access_catering_reinstated_wizard,catering_reinstated_wizard,model_catering_reinstated_wizard,,1,1,1,1
|
||||
access_catering_conf_change_wizard,catering_conf_change_wizard,model_catering_conf_change_wizard,,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
@@ -6,10 +6,15 @@
|
||||
<field name="name">yuthon.catering.conf.tree</field>
|
||||
<field name="model">yuthon.catering.conf</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="配置" editable="top">
|
||||
<tree string="配置" default_order="is_active desc, effective_date desc">
|
||||
<field name="company_id"/>
|
||||
<field name="employee_ids" widget="many2many_tags" domain="[('company_id', '=', company_id)]"/>
|
||||
<field name="employee_ids" widget="many2many_tags" readonly="1"/>
|
||||
<field name="employee_count"/>
|
||||
<field name="effective_date"/>
|
||||
<field name="expiry_date"/>
|
||||
<field name="is_active" column_invisible="1"/>
|
||||
<button name="action_change_employees" string="变更员工" type="object" class="btn btn-primary" invisible="expiry_date != False"/>
|
||||
<button name="action_fix_null_effective_date" string="修复日期" type="object" class="btn btn-secondary"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -19,7 +24,6 @@
|
||||
<field name="name">餐饮人员配置</field>
|
||||
<field name="res_model">yuthon.catering.conf</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="search_view_id" ref=""/>
|
||||
</record>
|
||||
|
||||
<!-- 二级菜单 -->
|
||||
@@ -30,4 +34,4 @@
|
||||
sequence="1"
|
||||
action="yuthon_catering_conf_action_window"/>
|
||||
</data>
|
||||
</odoo>
|
||||
</odoo>
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
from . import catering_reinstated_wizard
|
||||
from . import catering_reinstated_wizard
|
||||
from . import catering_conf_change_wizard
|
||||
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class CateringConfChangeWizard(models.TransientModel):
|
||||
_name = 'catering.conf.change.wizard'
|
||||
_description = '餐饮人员配置变更确认'
|
||||
|
||||
conf_id = fields.Many2one(string='配置记录', comodel_name='yuthon.catering.conf', required=True)
|
||||
employee_ids = fields.Many2many(
|
||||
string='员工',
|
||||
comodel_name='hr.employee',
|
||||
)
|
||||
|
||||
@api.model
|
||||
def default_get(self, fields_list):
|
||||
res = super().default_get(fields_list)
|
||||
conf_id = self._context.get('active_id')
|
||||
if conf_id:
|
||||
conf = self.env['yuthon.catering.conf'].browse(conf_id)
|
||||
res['conf_id'] = conf_id
|
||||
res['employee_ids'] = [(6, 0, conf.employee_ids.ids)]
|
||||
return res
|
||||
|
||||
def action_confirm(self):
|
||||
"""确认:旧记录加失效日期,生成新记录"""
|
||||
today = fields.Date.today()
|
||||
# 旧记录加失效日期(跳过write覆写,直接用super)
|
||||
from odoo.models import Model
|
||||
Model.write(self.conf_id, {'expiry_date': today})
|
||||
# 生成新记录
|
||||
self.env['yuthon.catering.conf'].create({
|
||||
'company_id': self.conf_id.company_id.id,
|
||||
'employee_ids': [(6, 0, self.employee_ids.ids)],
|
||||
'effective_date': today,
|
||||
})
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
def action_cancel(self):
|
||||
"""取消:不做任何变更"""
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
def action_modify(self):
|
||||
"""仅修改当前记录员工,不生成新记录,不更新日期"""
|
||||
from odoo.models import Model
|
||||
Model.write(self.conf_id, {'employee_ids': [(6, 0, self.employee_ids.ids)]})
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="catering_conf_change_wizard_form_view" model="ir.ui.view">
|
||||
<field name="name">catering.conf.change.wizard.form</field>
|
||||
<field name="model">catering.conf.change.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="变更员工">
|
||||
<sheet>
|
||||
<field name="conf_id" invisible="1"/>
|
||||
<field name="employee_ids" widget="many2many"
|
||||
nolabel="1"
|
||||
string="员工">
|
||||
<tree>
|
||||
<field name="name" string="员工姓名"/>
|
||||
<field name="department_id" string="部门"/>
|
||||
<field name="job_id" string="岗位"/>
|
||||
</tree>
|
||||
</field>
|
||||
</sheet>
|
||||
<footer>
|
||||
<button name="action_confirm" string="确认生成新记录" type="object" class="btn btn-primary"/>
|
||||
<button name="action_modify" string="仅修改当前记录" type="object" class="btn btn-secondary"/>
|
||||
<button name="action_cancel" string="取消" type="object" class="btn btn-secondary"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user