# -*- coding: utf-8 -*- import calendar from collections import defaultdict from datetime import date, datetime from odoo import http from odoo.http import request class CateringController(http.Controller): # 登记页面 @http.route(['/catering/registration/'], type='http', auth='public', methods=['GET', 'POST'], csrf=False) def catering_portal(self, employee_id, **kwargs): employee = request.env['hr.employee'].sudo().browse(employee_id) today = datetime.today().strftime('%Y-%m-%d') # 今日菜单 menu_setting = request.env['yuthon.menu.setting'].search([('menu_date', '=', today)]) menu_map = defaultdict(list) for menu in menu_setting: menu_map['breakfast'].extend(menu.breakfast_ids.mapped('name')) menu_map['lunch'].extend(menu.lunch_ids.mapped('name')) # 构建qweb上下文 qcontext = { 'employee': employee, # 员工 'today': today, # 日期 'breakfast_menu': list(set(menu_map['breakfast'])), # 早餐 'lunch_menu': list(set(menu_map['lunch'])), # 午餐 **kwargs # post请求的数据 } if request.httprequest.method == 'GET': # 渲染 QWeb 模板 return request.render('yuthon_catering.catering_registration_template', qcontext) else: # 创建数据 # [XSK] TODO 可以添加判断条件,如果今天已经登记则修改q_context['error']为错误信息 -2025/12/6 16:10 request.env['yuthon.catering'].create({ 'date': kwargs.get('date'), 'employee_id': employee.id, 'breakfast': kwargs.get('breakfast') == 'true', 'lunch': kwargs.get('lunch') == 'true', }) qcontext.update({ 'tips': '提交成功', }) # 渲染 QWeb 模板 return request.render('yuthon_catering.catering_registration_template', qcontext) # 统计页面 @http.route(['/catering/statistics/'], type='http', auth='public', methods=['GET'], csrf=False) def catering_create(self, employee_id, **kwargs): # 公司信息 company = request.env.company # 当前员工 employee = request.env['hr.employee'].sudo().browse(employee_id) today = datetime.today().strftime('%Y-%m-%d') # 获取筛选模式 默认筛选模式为天 filter_mode = kwargs.get('filter_mode', 'day') # 筛选数据 filter_date = kwargs.get('filter_date') filter_month = kwargs.get('filter_month') department_id = kwargs.get('department_id') if filter_mode == 'day' and not filter_date: filter_date = today if filter_mode == 'month' and not filter_month: filter_month = datetime.today().strftime('%Y-%m') # 获取所有部门 departments = request.env['hr.department'].sudo().search([]) # 构建查询条件 domain = [] # 根据筛选模式添加条件 if filter_mode == 'day' and filter_date: domain.append(('date', '=', filter_date)) elif filter_mode == 'month' and filter_month: # 解析月份 year, month = map(int, filter_month.split('-')) from_date = date(year, month, 1) to_date = date(year, month, calendar.monthrange(year, month)[1]) domain.append(('date', '>=', from_date)) domain.append(('date', '<=', to_date)) else: if department_id: domain.append(('dept_id', '=', department_id)) result = request.env['yuthon.catering'].sudo().search(domain) qcontext = { **kwargs, 'employee': employee, 'departments': departments, 'today': datetime.today().strftime('%Y-%m-%d'), 'filter_month': filter_month, 'filter_mode': kwargs.get('filter_mode', 'day'), 'breakfast': len(result.filtered(lambda x: x.breakfast)), 'lunch': len(result.filtered(lambda x: x.lunch)), 'total': sum(result.mapped('amount')), } return request.render('yuthon_catering.catering_statistics_template', qcontext)