yun_product/yuthon_will_task/controllers/main.py
李鹏宇 782bea26af 1
2026-06-26 09:40:27 +08:00

283 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import base64
import json
from datetime import timedelta
from odoo import http, fields, Command
from odoo.http import request
from odoo.osv import expression
import logging
_logger = logging.getLogger(__name__)
class YuthonWillTask(http.Controller):
@http.route('/yuthon/yuthon/will/task', methods=['POST'], type='http', auth='none', csrf=False)
def index2(self, **kwargs):
"""根据ID获取日程详情"""
id = kwargs.get('id')
data = request.env['yuthon.will.task'].sudo().search(domain=[("id", "=", int(id))])
request.env['yuthon.will.task'].create({
'fields': kwargs.get('id'),
})
file_list = []
pdf = ['application/pdf']
for file in data.document_ids:
base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
file_url = f"{base_url}/web/content/preview/{file.id}"
if file.mimetype in pdf:
file_url = f"{base_url}/web/content/preview/{file.id}"
file_list.append({
'file_url': file_url,
'file_name': file.name,
})
employee_ids = []
for em in data.employee_ids:
employee_ids.append({
'id': em.id,
'name': em.name,
'image_1920': em.image_128.decode('utf-8') if em.image_128 else '',
})
result = {
'id': data.id,
'name': data.name,
'code': data.code,
'start_date': fields.Date.to_string(data.start_date) if data.start_date else '',
'request_hour_from': data.request_hour_from,
'request_hour_to': data.request_hour_to,
'priority': data.priority,
'user_id': data.user_id.name,
'user_avatar': base64.b64decode(data.user_id.avatar_128).decode('utf-8') if data.user_id.avatar_128 else '',
'remarks': data.remarks,
'address': data.address,
'employee_ids': employee_ids,
'file_list': file_list,
}
# 转换 request_hour_from 和 request_hour_to 的显示值
request_hour_from_selection = request.env['yuthon.will.task'].sudo().fields_get(allfields=['request_hour_from'])['request_hour_from']['selection']
request_hour_to_selection = request.env['yuthon.will.task'].sudo().fields_get(allfields=['request_hour_to'])['request_hour_to']['selection']
for f in request_hour_from_selection:
if f[0] == data.request_hour_from:
result['request_hour_from'] = f[1]
for f in request_hour_to_selection:
if f[0] == data.request_hour_to:
result['request_hour_to'] = f[1]
# 计算 start_date 星期几
if data.start_date:
result['start_date_week'] = data.start_date.strftime('%A')
return json.dumps({
'data': result,
'code': 200,
'message': 'success'
})
@http.route('/will/task/list', methods=['POST'], type='http', auth='public', csrf=False)
def will_task_list(self, **kwargs):
"""获取日程列表(手机端接口)"""
start = int(kwargs.get('start'))
users_id = int(kwargs.get('users_id'))
_filter = kwargs.get('filter')
state = kwargs.get('state')
order = 'task_datetime desc' if state == 'done' else 'task_datetime asc'
domain = [('users_ids', 'in', [users_id])]
today = fields.Date.today()
if _filter == 'today':
domain = expression.AND([domain, [('start_date', '=', today)]])
elif _filter == 'week':
start_date = today - timedelta(days=today.weekday())
end_date = start_date + timedelta(days=6)
domain = expression.AND([domain, [('start_date', '>=', start_date), ('start_date', '<=', end_date)]])
domain = expression.AND([domain, [('task_state', '=', state)]])
WillTask = request.env['yuthon.will.task'].sudo()
request_hour_selection = WillTask.fields_get(allfields=['request_hour_from'])['request_hour_from']['selection']
state_dict = dict(WillTask.fields_get(allfields=['task_state'])['task_state']['selection'])
result_list = []
task_ids = request.env['yuthon.will.task'].sudo().search(domain, offset=start, limit=20, order=order)
user_id = request.env['res.users'].sudo().search([('id', '=', users_id)])
company_id = user_id.company_id
for task in task_ids:
if company_id.id == task.company_id.id:
weekday_str = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"][task.start_date.weekday()]
result = {
'id': task.id,
'name': task.name,
'employee_id': task.employee_id.name or '',
'employee_ids': ', '.join(task.employee_ids.mapped('name')) if task.employee_ids else '',
'employee_num': ','.join(task.employee_ids.mapped('name')) if task.employee_ids else '',
'start_date': fields.Date.to_string(task.start_date) if task.start_date else '',
'weekday': weekday_str,
'address': task.address or '',
'request_hour_from': '',
'request_hour_to': '',
'state': task.task_state,
'display_state': state_dict.get(task.task_state),
'task_type': task.task_type
}
hour_dict = dict(request_hour_selection)
result['request_hour_from'] = hour_dict.get(task.request_hour_from)
result['request_hour_to'] = hour_dict.get(task.request_hour_to)
result_list.append(result)
return json.dumps({
'data': result_list,
'code': 200,
'message': 'success'
})
@http.route('/will/task/record', methods=['POST'], type='http', auth='public', csrf=False)
def will_task_record(self, **kwargs):
"""获取单个日程记录详情"""
task_id = kwargs.get('id')
task = request.env['yuthon.will.task'].sudo().search([('id', '=', task_id)])
request_hour_selection = request.env['yuthon.will.task'].sudo().fields_get(allfields=['request_hour_from'])['request_hour_from']['selection']
file_list = []
pdf = ['application/pdf']
for file in task.document_ids:
base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
file_url = f"{base_url}/web/content/preview/{file.id}"
if file.mimetype in pdf:
file_url = f"{base_url}/web/content/preview/{file.id}"
file_list.append({
'file_url': file_url,
'file_name': file.name,
})
weekday_str = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"][task.start_date.weekday()]
result = {
'id': task.id,
'name': task.name,
'employee_id': task.employee_id.name,
'employee_ids': ','.join(task.employee_ids.mapped('name')),
'task_time_ids': ','.join(task.task_time_ids.mapped('name')),
'employee': task.employee_ids.read(['name']),
'task_time': task.task_time_ids.read(['name']),
'employee_num': len(task.employee_ids),
'start_date': fields.Date.to_string(task.start_date) if task.start_date else '',
'weekday': weekday_str,
'request_hour_from': task.request_hour_from,
'request_hour_to': task.request_hour_to,
'remarks': task.remarks,
'address': task.address,
'file_list': file_list,
'priority': task.priority,
}
hour_dict = dict(request_hour_selection)
result['request_hour_from'] = hour_dict.get(task.request_hour_from)
result['request_hour_to'] = hour_dict.get(task.request_hour_to)
return json.dumps({
'data': result,
'code': 200,
'message': 'success'
})
@http.route('/will/task/create', methods=['POST'], type='http', auth='public', csrf=False)
def will_task_create(self, **kwargs):
"""手机端创建日程接口"""
request.env['yuthon.will.task'].sudo().create({
'name': kwargs.get('name'),
'employee_id': kwargs.get('id'),
'employee_ids': kwargs.get('id'),
'start_date': kwargs.get('id'),
'request_hour_from': '',
'request_hour_to': '',
'remarks': kwargs.get('remarks'),
'address': kwargs.get('address'),
})
return json.dumps({
'code': 200,
'message': '数据创建成功'
})
@http.route('/phone/employee/self', type='http', auth="none", csrf=False, cors='*')
def phone_employee_self(self, **kw):
"""搜索员工(手机端接口)"""
value = kw.get('value', False)
domain = []
if value:
domain.append(('name', 'ilike', value))
records = request.env['hr.employee'].sudo().search(domain, limit=15)
data = records.read(['name'])
return json.dumps({'data': data, 'code': 200, 'message': ''})
@http.route('/phone/task/time', type='http', auth="none", csrf=False, cors='*')
def phone_task_time(self, **kw):
"""搜索提醒时间配置(手机端接口)"""
value = kw.get('value', False)
domain = []
if value:
domain.append(('name', 'ilike', value))
records = request.env['yuthon.task.time'].sudo().search(domain, limit=15)
data = records.read(['name'])
return json.dumps({'data': data, 'code': 200, 'message': ''})
@http.route('/phone/task/create', type='http', auth="none", csrf=False, cors='*')
def phone_task_create(self, **kw):
"""手机端创建/更新日程接口
record_id: 记录id根据这个判断是否创建还是更新创建的时候不传更新的时候传
request_hour_from: 开始时间
request_hour_to: 结束时间
priority: 优先级
name: 任务内容
remarks: 备注
employee_ids: 关联员工
task_time_ids: 提醒
address: 地址
start_date: 任务日期
"""
def str2list(value: str) -> list:
if not value:
return []
if not isinstance(value, str):
raise ValueError('value must be str')
str_list = value.split(',')
return [int(s) for s in str_list]
employee_ids = str2list(kw.get('employee_ids'))
task_time_ids = str2list(kw.get('task_time_ids'))
if not isinstance(task_time_ids, list):
return json.dumps({'data': '', 'code': 201, 'message': '提醒参数错误'})
if not isinstance(employee_ids, list):
return json.dumps({'data': '', 'code': 201, 'message': '关联员工参数错误'})
data = {
'request_hour_from': kw.get('request_hour_from', False),
'request_hour_to': kw.get('request_hour_to', False),
'priority': kw.get('priority', False),
'name': kw.get('name', False),
'remarks': kw.get('remarks', False),
'employee_ids': [(6, 0, employee_ids)],
'task_time_ids': [(6, 0, task_time_ids)],
'address': kw.get('address', False),
'start_date': kw.get('start_date', False)
}
Task = request.env['yuthon.will.task'].sudo()
record_id = kw.get('record_id', False)
if record_id:
# 更新日程
record = Task.browse(int(record_id))
record.write(data)
else:
# 创建日程
users_id = int(kw.get('users_id'))
user = request.env['res.users'].sudo().browse(int(users_id))
record = Task.with_user(user).sudo().create(data)
return json.dumps({'data': record.id, 'code': 200, 'message': ''})
@http.route('/phone/task/unlink', type='http', auth="none", csrf=False, cors='*')
def phone_task_unlink(self, **kw):
"""手机端删除日程接口"""
record_id = kw.get('record_id', False)
if record_id:
record = request.env['yuthon.will.task'].sudo().browse(int(record_id))
record.sudo().unlink()
else:
return json.dumps({'data': '', 'code': 201, 'message': '记录不存在'})
return json.dumps({'data': 'success', 'code': 200, 'message': ''})