diff --git a/yuthon_salary/models/yuthon_meal_expenses.py b/yuthon_salary/models/yuthon_meal_expenses.py index c88de870e..701394d55 100644 --- a/yuthon_salary/models/yuthon_meal_expenses.py +++ b/yuthon_salary/models/yuthon_meal_expenses.py @@ -159,7 +159,7 @@ class YuthonMealExpenses(models.Model): return True def cron_send_meal_reminder(self): - """定时任务:给状态为已发送且缴费状态为待缴的记录发送缴费提醒""" + """定时任务:给状态为已发送且缴费状态为待缴的记录发送缴费提醒,每人每天只发一次""" # 节假日不发送 if not self._is_chinese_workday(): self.env['ir.logging'].sudo().create({ @@ -172,11 +172,18 @@ class YuthonMealExpenses(models.Model): }) return True + # 每月1号跳过:交给 cron_send_monthly_meal_reminder 处理,避免重复发送 + if datetime.now().day == 1: + return True + # 找出所有 已发送 且 仍然 待缴 的餐费记录 meals = self.sudo().search([ ('meal_state', '=', 'done'), ('toll_state', '=', 'to_do'), ]) + # 按员工去重,每人只发一条 + sent_employees = set() + sent_count = 0 for meal in meals: # 如果早餐次数和午餐次数都为0,则不发送提醒 if meal.number_breakfasts == 0 and meal.number_lunches == 0: @@ -184,6 +191,9 @@ class YuthonMealExpenses(models.Model): employee = meal.employee_id if not employee or not employee.user_id or not employee.wecom_userid: continue + if employee.id in sent_employees: + continue + sent_employees.add(employee.id) # 和现有手机端餐费链接保持一致 url = f'https://phone.thtzjt.com/phone/Meal/{employee.user_id.id}' # 提示文案,按照要求修改 @@ -199,6 +209,17 @@ class YuthonMealExpenses(models.Model): url=url, btntxt="详细信息", ) + sent_count += 1 + + # 记录发送日志 + self.env['ir.logging'].sudo().create({ + 'name': '餐费缴费提醒', + 'type': 'server', + 'message': f'成功发送{sent_count}条餐费缴费提醒({len(meals)}条待缴记录,去重后发送{sent_count}人)', + 'path': __name__, + 'func': 'cron_send_meal_reminder', + 'line': 0, + }) def action_generate_missing_feb(self): target_year = '2026'