330 lines
15 KiB
Python
330 lines
15 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
|
||
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': ''})
|