283 lines
12 KiB
Python
283 lines
12 KiB
Python
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': ''})
|