Files
gzth/yuthon_will_task/controllers/main.py
T
2026-05-11 11:06:09 +08:00

330 lines
15 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
from urllib.parse import quote
import logging
_logger = logging.getLogger(__name__)
def get_is_leader_domain(is_leader: bool):
operator = 'in' if is_leader else 'not in'
return [('user_role_ids.name', operator, ['董事长', '分管领导', '总经理', '部门副经理', '副总经理', '司机'])]
class YuthonWillTask(http.Controller):
@http.route('/yuthon/yuthon/will/task', methods=['POST'], type='http', auth='none', csrf=False)
def index2(self, **kwargs):
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.documents_ids:
base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url')
file_url = f"http://view.officeapps.live.com/op/view.aspx?src=https://oa.thtzjt.com/web/content/office_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),
'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 取模型 yuthon.will.task 的 request_hour_from 的selection
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 星期几
result['start_date_week'] = fields.Date.from_string(result['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])]
if _filter == 'leader':
domain = [('user_role_ids.name', 'in', ['董事长', '分管领导', '总经理', '部门副经理', '副总经理', '司机'])]
# expression.AND([domain, get_is_leader_domain(True)])
else:
domain = expression.AND([domain, get_is_leader_domain(False)])
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:
# _logger.info(f"当前用户{user_id.name}--对应公司{company_id.name}--任务公司{task.company_id.name}")
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),
'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"http://view.officeapps.live.com/op/view.aspx?src=https://oa.thtzjt.com/web/content/office_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')),
'employee_ids2': ','.join(task.employee_ids2.mapped('name')),
'task_time_ids': ','.join(task.task_time_ids.mapped('name')),
'drivers': task.employee_ids2.read(['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),
'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):
"""
relation: 'ilike'
"""
value = kw.get('value', False)
domain = []
if value:
domain.append(('name', 'ilike', value))
# users_id = int(kw.get('users_id'))
# user = request.env['res.users'].sudo().browse(int(users_id))
# employee_id = user.with_company(user.company_id.id).employee_id.id
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/employee/driver', type='http', auth="none", csrf=False, cors='*')
def phone_employee_driver(self, **kw):
"""
relation: 'ilike', '=', '!='
"""
feild = kw.get('feild', False)
relation = kw.get('relation', False)
value = kw.get('value', False)
domain = []
if feild and value and relation:
domain.append((feild, relation, value))
# users_id = int(kw.get('users_id'))
# user = request.env['res.users'].sudo().browse(int(users_id))
# employee_id = user.with_company(user.company_id.id).employee_id.id
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):
"""
relation: 'ilike'
"""
value = kw.get('value', False)
domain = []
if value:
domain.append(('name', 'ilike', value))
# users_id = int(kw.get('users_id'))
# user = request.env['res.users'].sudo().browse(int(users_id))
# employee_id = user.with_company(user.company_id.id).employee_id.id
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: 关联员工
employee_ids2: 关联司机
task_time_ids: 提醒
address: 地址
start_date: 任务日期
"""
def str2list(value: str) -> list[int]:
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'))
employee_ids2 = str2list(kw.get('employee_ids2'))
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_ids2, 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)],
'employee_ids2': [(6, 0, employee_ids2)],
'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))
# request.env.user = user
record = Task.with_user(user).sudo().create(data)
# users_id = int(kw.get('users_id'))
# user = request.env['res.users'].sudo().browse(int(users_id))
# employee_id = user.with_company(user.company_id.id).employee_id.id
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': ''})