餐饮定时任务

This commit is contained in:
李鹏宇
2026-04-03 11:59:59 +08:00
parent c69230266e
commit d554f94c13
2 changed files with 127 additions and 0 deletions
@@ -247,6 +247,120 @@ class YuthonMealExpenses(models.Model):
})
return True
def cron_send_monthly_meal_reminder(self):
"""定时任务:每月第一个工作日发送餐费缴费提醒"""
from datetime import datetime, timedelta
import calendar
# 检查是否是工作日
today = datetime.now()
if today.weekday() >= 5: # 0-4是工作日,5-6是周末
# 记录日志
self.env['ir.logging'].sudo().create({
'name': '餐费缴费提醒',
'type': 'info',
'message': f'今天{today.strftime("%Y-%m-%d")}是周末,跳过发送餐费缴费提醒',
'path': __name__,
'func': 'cron_send_monthly_meal_reminder',
})
return True
# 计算上月的年份和月份
last_month = today - timedelta(days=today.day)
last_year = str(last_month.year)
last_month_num = str(last_month.month)
# 计算当前月的年份和月份
current_year = str(today.year)
current_month = str(today.month)
# 查询所有状态为待缴的餐费记录
meals = self.sudo().search([
('toll_state', '=', 'to_do'),
('select_year', '=', last_year),
('select_time', '=', last_month_num),
])
# 按员工分组
employee_meals = {}
for meal in meals:
if meal.employee_id not in employee_meals:
employee_meals[meal.employee_id] = meal
# 发送提醒
sent_count = 0
for employee, meal in employee_meals.items():
if not employee or not employee.user_id or not employee.wecom_userid:
continue
# 检查是否已经发送过提醒(通过日志记录)
log_domain = [
('name', '=', '餐费缴费提醒'),
('message', 'like', f'{last_year}年{last_month_num}月'),
('message', 'like', employee.name),
]
existing_log = self.env['ir.logging'].sudo().search(log_domain, limit=1)
if existing_log:
continue
# 计算上月餐费金额
last_month_amount = meal.total_payment
# 计算当月餐费金额(如果有)
current_month_meal = self.sudo().search([
('employee_id', '=', employee.id),
('select_year', '=', current_year),
('select_time', '=', current_month),
], limit=1)
current_month_amount = current_month_meal.total_payment if current_month_meal else 0
# 构建提醒内容
employee_name = employee.name or ''
description = (
f'【餐费缴费提醒】亲爱的同事,{last_year}年{last_month_num}月餐费明细已出,你的上月餐费金额为{last_month_amount}元,'
f'请尽快核对并缴费到指定账户:44001580909059000222广州市天河投资集团有限公司(转账时请备注"姓名+{last_month_num}月餐费")。'
f'有任何问题,随时找办公室小伙伴沟通呀!'
)
# 发送提醒
try:
self.sudo().env["wecom.apps"].sync_send_message_textcard(
category='can',
user_id=employee.wecom_userid,
title="餐费缴费提醒",
description=description,
url=f'https://phone.thtzjt.com/phone/Meal/{employee.user_id.id}',
btntxt="详细信息",
)
sent_count += 1
# 记录日志,避免重复发送
self.env['ir.logging'].sudo().create({
'name': '餐费缴费提醒',
'type': 'info',
'message': f'已发送{last_year}年{last_month_num}月餐费缴费提醒给{employee_name}',
'path': __name__,
'func': 'cron_send_monthly_meal_reminder',
})
except Exception as e:
self.env['ir.logging'].sudo().create({
'name': '餐费缴费提醒',
'type': 'error',
'message': f'发送{last_year}年{last_month_num}月餐费缴费提醒给{employee_name}失败:{str(e)}',
'path': __name__,
'func': 'cron_send_monthly_meal_reminder',
})
# 记录总发送情况
self.env['ir.logging'].sudo().create({
'name': '餐费缴费提醒',
'type': 'info',
'message': f'成功发送{sent_count}条{last_year}年{last_month_num}月餐费缴费提醒',
'path': __name__,
'func': 'cron_send_monthly_meal_reminder',
})
return True
def action_view_detail(self):
self.ensure_one()
date_start, date_end = self._get_date_range()