From 4c3b3eef3b433d1b8d95756df82ee2c1d8239452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Wed, 4 Mar 2026 12:04:20 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_attendance/models/card_approval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yuthon_hr_attendance/models/card_approval.py b/yuthon_hr_attendance/models/card_approval.py index 7e2ff567b..996b93f11 100644 --- a/yuthon_hr_attendance/models/card_approval.py +++ b/yuthon_hr_attendance/models/card_approval.py @@ -48,7 +48,7 @@ class CardApprovals(models.Model): ('vacation_date', '=', vacation_date), ], limit=1) if vacation_report: - vacation_report.vacation_date() + vacation_report._compute_number_card() self.number_cards_replaced = vacation_report.number_card From 59869b71f4a3b2d56e1e6d87bc92f17ec7c4732a Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Wed, 4 Mar 2026 12:29:41 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_catering/models/yuthon_catering.py | 27 +++++++++++++++++++++++ yuthon_catering/views/yuthon_catering.xml | 1 + 2 files changed, 28 insertions(+) diff --git a/yuthon_catering/models/yuthon_catering.py b/yuthon_catering/models/yuthon_catering.py index 42640d663..0ae223ff9 100644 --- a/yuthon_catering/models/yuthon_catering.py +++ b/yuthon_catering/models/yuthon_catering.py @@ -254,6 +254,33 @@ class YuthonCatering(models.Model): btntxt="查看详情" ) + # 一次性,生成3.1-3.3所有数据,状态为已确认 + def test_1(self): + employee_ids = self.env['yuthon.catering.conf'].search([])[0].employee_ids + for emp in employee_ids: + self.env['yuthon.catering'].create({ + 'date': '2026-03-01', + 'state': 'confirmed', + 'employee_id': emp.id, + 'breakfast': True, + 'lunch': True, + }) + self.env['yuthon.catering'].create({ + 'date': '2026-03-02', + 'state': 'confirmed', + 'employee_id': emp.id, + 'breakfast': True, + 'lunch': True, + }) + self.env['yuthon.catering'].create({ + 'date': '2026-03-03', + 'state': 'confirmed', + 'employee_id': emp.id, + 'breakfast': True, + 'lunch': True, + }) + + # 定义批量提醒方法 def batch_remind_catering(self): """ diff --git a/yuthon_catering/views/yuthon_catering.xml b/yuthon_catering/views/yuthon_catering.xml index 0ae28bbc0..92391998a 100644 --- a/yuthon_catering/views/yuthon_catering.xml +++ b/yuthon_catering/views/yuthon_catering.xml @@ -9,6 +9,7 @@
From d122d96fc5770a074d80ee42235d0f8daecccce2 Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Wed, 4 Mar 2026 13:47:57 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_notice/models/yuthon_confirm_users.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yuthon_notice/models/yuthon_confirm_users.py b/yuthon_notice/models/yuthon_confirm_users.py index 1789bc3a3..85261f10d 100644 --- a/yuthon_notice/models/yuthon_confirm_users.py +++ b/yuthon_notice/models/yuthon_confirm_users.py @@ -41,8 +41,8 @@ class YuthonConfirmUsers(models.Model): confirm_noice_ids = self.env["yuthon.confirm.users"].browse(self._context.get('active_ids', self._context.get('active_id'))) i = 0 for rec in confirm_noice_ids: - if rec.state in ['yes', 'to_sent']: - continue + # if rec.state in ['yes', 'to_sent']: + # continue url = f'https://phone.thtzjt.com/phone/Notice/110?employee_id={rec.employee_id.id}' result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=rec.employee_id.wecom_userid, title="通知公告", description="您有待确认的通知公告请尽快确认", From 3af63a22a7e70c659af4940144f1e7f979a8478e Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Wed, 4 Mar 2026 14:09:59 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_notice/models/yuthon_confirm_users.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yuthon_notice/models/yuthon_confirm_users.py b/yuthon_notice/models/yuthon_confirm_users.py index 85261f10d..da9ab54e3 100644 --- a/yuthon_notice/models/yuthon_confirm_users.py +++ b/yuthon_notice/models/yuthon_confirm_users.py @@ -32,7 +32,7 @@ class YuthonConfirmUsers(models.Model): for record in self.search([('state', '=', 'no')]): partner_ids = record.employee_id.user_id.partner_id.id record.with_context(lang=record.env.lang)._message_auto_subscribe_notify(partner_ids, 'yuthon_notice.message_yuthon_confirm_users_data') - url = f'https://phone.thtzjt.com/phone/Notice/110?employee_id={record.employee_id.id}' + url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={record.employee_id.id}' self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=record.employee_id.wecom_userid, title="通知公告", description="您有待确认的通知公告请尽快确认", url=url, btntxt="详细信息") @@ -43,7 +43,7 @@ class YuthonConfirmUsers(models.Model): for rec in confirm_noice_ids: # if rec.state in ['yes', 'to_sent']: # continue - url = f'https://phone.thtzjt.com/phone/Notice/110?employee_id={rec.employee_id.id}' + url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={rec.employee_id.id}' result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=rec.employee_id.wecom_userid, title="通知公告", description="您有待确认的通知公告请尽快确认", url=url, btntxt="详细信息") @@ -51,7 +51,7 @@ class YuthonConfirmUsers(models.Model): res_dict = result_data[1] if res_dict.get('errmsg') == 'ok': i = i + 1 - url = f'https://phone.thtzjt.com/phone/Notice/110?employee_id=298' + url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id=298' self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser='18562027762', title="通知公告", @@ -71,7 +71,7 @@ class YuthonConfirmUsers(models.Model): if rec.employee_id.wecom_userid: we_id_list.append(rec.employee_id.wecom_userid) touser = "|".join(we_id_list) if we_id_list else "" - url = f'https://phone.thtzjt.com/phone/Notice/110?employee_id={self.users_id.id}' + url = f'https://phone.thtzjt.com/phone/Notice/{self.notice_id.id}?employee_id={self.users_id.id}' self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', touser=touser, title="通知公告", description=self.name + '发布人:' + self.users_id.name, url=url, btntxt="详细信息") From ab25637569e66d9ba5df80c1ae896a83bc57b5f9 Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Wed, 4 Mar 2026 14:21:24 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_notice/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yuthon_notice/controllers/main.py b/yuthon_notice/controllers/main.py index a90149822..3284c8e47 100644 --- a/yuthon_notice/controllers/main.py +++ b/yuthon_notice/controllers/main.py @@ -102,7 +102,7 @@ class YuthonNotice(http.Controller): def yuthon_notice_confirm(self, **kwargs): notice_id = kwargs.get('id') employee_id = kwargs.get('employee_id') - confirm_id = request.env['yuthon.confirm.users'].sudo().search([('notice_id', '=', notice_id), ('employee_id', '=', employee_id)]) + confirm_id = request.env['yuthon.confirm.users'].sudo().search([('notice_id', '=', int(notice_id)), ('employee_id.user_id', '=', employee_id)]) confirm_id.write({'state': 'yes'}) return json.dumps({'code': 200, 'message': 'OK'}) From 6d95bab4520236af1f9145567518e7a2fbce280e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Wed, 4 Mar 2026 14:34:17 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_hr_attendance/models/yuthon_vacation_reports.py | 1 - 1 file changed, 1 deletion(-) diff --git a/yuthon_hr_attendance/models/yuthon_vacation_reports.py b/yuthon_hr_attendance/models/yuthon_vacation_reports.py index 5f80ac58b..39d3eb1c4 100644 --- a/yuthon_hr_attendance/models/yuthon_vacation_reports.py +++ b/yuthon_hr_attendance/models/yuthon_vacation_reports.py @@ -2101,7 +2101,6 @@ class VacationOverline(models.Model): if res_model and res_id and res_model in self.env: overtime_id = rec.env[res_model].search([('id', '=', res_id)], limit=1) if overtime_id: - rec.meal = overtime_id.meal rec.reason_application = overtime_id.reason_application rec.overtime_name = overtime_id.name or '' rec.start_time = overtime_id.start_time or '' From 743a3221fd5f334aae642ac43df1b62733028c26 Mon Sep 17 00:00:00 2001 From: pengyuthon Date: Wed, 4 Mar 2026 14:36:36 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E9=A4=90=E9=A5=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yuthon_catering/controllers/decorators.py | 23 +++++++++++++++++++ yuthon_catering/controllers/restaurant.py | 15 ++++++++---- .../models/yuthon_catering_setting.py | 1 + yuthon_catering/views/yuthon_catering.xml | 2 +- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 yuthon_catering/controllers/decorators.py diff --git a/yuthon_catering/controllers/decorators.py b/yuthon_catering/controllers/decorators.py new file mode 100644 index 000000000..41e336993 --- /dev/null +++ b/yuthon_catering/controllers/decorators.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +import json +import logging +from functools import wraps + +from odoo.exceptions import AccessDenied, UserError, ValidationError + +_logger = logging.getLogger(__name__) + + +def exception_handle(func): + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except (AccessDenied, UserError, ValidationError) as e: + _logger.info(str(e)) + return json.dumps({'data': '', 'code': 500, 'message': str(e)}) + except Exception as e: + _logger.exception(e) + return json.dumps({'data': '', 'code': 500, 'message': str(e)}) + + return wrapper diff --git a/yuthon_catering/controllers/restaurant.py b/yuthon_catering/controllers/restaurant.py index e5963be84..13d16a5a3 100644 --- a/yuthon_catering/controllers/restaurant.py +++ b/yuthon_catering/controllers/restaurant.py @@ -4,12 +4,14 @@ from datetime import date from odoo.tools import DEFAULT_SERVER_DATE_FORMAT as DATE_FORMAT from odoo.http import request, Controller, route +from .decorators import exception_handle _logger = logging.getLogger(__name__) class RestaurantController(Controller): @route('/phone/restaurant/menu_days', methods=['POST'], type='http', auth="none", csrf=False, cors='*') + @exception_handle def get_menu_days(self, **kwargs): year = int(kwargs.get('year', date.today().year)) Menu = request.env['yuthon.menu.setting'].sudo() @@ -23,6 +25,7 @@ class RestaurantController(Controller): return json.dumps({'data': result, 'code': 200, 'message': ''}) @route('/phone/restaurant/menus', methods=['POST'], type='http', auth="none", csrf=False, cors='*') + @exception_handle def get_menus(self, **kwargs): menu_date = kwargs.get('menu_date', date.today()) Menu = request.env['yuthon.menu.setting'].sudo() @@ -41,6 +44,7 @@ class RestaurantController(Controller): return json.dumps({'data': result, 'code': 200, 'message': ''}) @route('/phone/restaurant/collect_catering', methods=['POST'], type='http', auth="none", csrf=False, cors='*') + @exception_handle def collect_catering(self, **kwargs): user_id = int(kwargs.get('user_id')) menu_date = kwargs.get('menu_date', date.today()) @@ -53,7 +57,8 @@ class RestaurantController(Controller): 'employee_id': employee.id, 'breakfast': kwargs.get('breakfast') == 'true', 'lunch': kwargs.get('lunch') == 'true', - 'menu_day_id': kwargs.get('menu_id') + 'menu_day_id': kwargs.get('menu_id'), + 'state': 'confirmed' }) if record: catering_data = { @@ -68,6 +73,7 @@ class RestaurantController(Controller): return json.dumps({'data': '', 'code': 500, 'message': '提交失败'}) @route('/phone/restaurant/update_catering', methods=['POST'], type='http', auth="none", csrf=False, cors='*') + @exception_handle def update_catering(self, **kwargs): user_id = int(kwargs.get('user_id')) catering_id = int(kwargs.get('id')) @@ -95,10 +101,11 @@ class RestaurantController(Controller): return json.dumps({'data': catering_data, 'code': 200, 'message': '修改成功'}) @route('/phone/restaurant/get_catering', methods=['POST'], type='http', auth="none", csrf=False, cors='*') + @exception_handle def get_catering(self, **kwargs): user_id = int(kwargs.get('user_id')) menu_date = kwargs.get('menu_date', date.today()) - menu_id = kwargs.get('menu_id') + menu_id = int(kwargs.get('menu_id')) if not user_id or not menu_date or not menu_id: return json.dumps({'data': '', 'code': 500, 'message': '请求失败'}) @@ -107,8 +114,8 @@ class RestaurantController(Controller): catering = request.env['yuthon.catering'].sudo().search([ ('employee_id', '=', employee.id), ('date', '=', menu_date), - ('menu_day_id', '=', menu_id), - ]) + # ('menu_day_id', '=', menu_id), + ], limit=1, order='id desc') if catering: catering_data = { 'id': catering.id, diff --git a/yuthon_catering/models/yuthon_catering_setting.py b/yuthon_catering/models/yuthon_catering_setting.py index 59ea8e5cb..db394b3ba 100644 --- a/yuthon_catering/models/yuthon_catering_setting.py +++ b/yuthon_catering/models/yuthon_catering_setting.py @@ -4,6 +4,7 @@ from odoo import api, fields, models class YuthonMenuSetting(models.Model): _name = 'yuthon.menu.setting' _description = '菜单配置' + _rec_name = 'id' breakfast_ids = fields.Many2many( 'yuthon.dishes.setting', diff --git a/yuthon_catering/views/yuthon_catering.xml b/yuthon_catering/views/yuthon_catering.xml index cd5530e41..98a1f46e1 100644 --- a/yuthon_catering/views/yuthon_catering.xml +++ b/yuthon_catering/views/yuthon_catering.xml @@ -9,7 +9,7 @@