Files
4an-workorder/app/views/history.py
T
2025-08-08 10:38:10 +08:00

134 lines
5.7 KiB
Python
Executable File

from flask import render_template, request, flash, redirect, url_for
from flask_login import login_required, current_user
from scripts.models import db, WorkOrderHandling, ManualWorkOrder
from datetime import datetime
def init_history_routes(app):
@app.route('/history')
@login_required
def history():
if current_user.role not in ['装维员', '统计员']:
app.logger.warning(f'未授权访问:用户 {current_user.name} 尝试访问历史记录')
flash('您没有权限访问此页面')
return redirect(url_for('statistics'))
app.logger.info(f'用户 {current_user.name} 访问历史记录页面')
page = request.args.get('page', 1, type=int)
per_page = 20
search = request.args.get('search', '')
# 查询普通工单
if current_user.role == '统计员':
query1 = WorkOrderHandling.query
query2 = ManualWorkOrder.query
else:
# 装维员只能看到自己处理的工单
query1 = WorkOrderHandling.query.filter_by(handler=current_user.name)
query2 = ManualWorkOrder.query.filter_by(handler=current_user.name)
# 添加搜索条件
if search:
query1 = query1.filter(
db.or_(
WorkOrderHandling.order_id.contains(search),
WorkOrderHandling.device_id.contains(search),
WorkOrderHandling.branch.contains(search),
WorkOrderHandling.handler.contains(search),
WorkOrderHandling.fault_type.contains(search),
WorkOrderHandling.handle_description.contains(search),
WorkOrderHandling.contact_person.contains(search),
WorkOrderHandling.remark.contains(search)
)
)
query2 = query2.filter(
db.or_(
ManualWorkOrder.order_id.contains(search),
ManualWorkOrder.device_id.contains(search),
ManualWorkOrder.branch.contains(search),
ManualWorkOrder.handler.contains(search),
ManualWorkOrder.fault_type.contains(search),
ManualWorkOrder.handle_description.contains(search),
ManualWorkOrder.contact_person.contains(search),
ManualWorkOrder.remark.contains(search)
)
)
# 合并两种工单并按时间排序
handlings1 = query1.all()
handlings2 = query2.all()
# 将手工故障单转换为与普通工单相同的格式
combined_handlings = []
for h in handlings1:
combined_handlings.append({
'order_id': h.order_id,
'branch': h.branch,
'device_id': h.device_id,
'handler': h.handler,
'time': h.restore_time,
'fault_type': h.fault_type,
'type': 'normal'
})
for h in handlings2:
combined_handlings.append({
'order_id': h.order_id,
'branch': h.branch,
'device_id': h.device_id,
'handler': h.handler,
'time': h.create_time,
'fault_type': h.fault_type,
'type': 'manual'
})
# 按时间排序
combined_handlings.sort(key=lambda x: x['time'], reverse=True)
# 手动分页
total = len(combined_handlings)
start = (page - 1) * per_page
end = start + per_page
current_page = combined_handlings[start:end]
# 创建分页对象
class Pagination:
def __init__(self, items, page, per_page, total):
self.items = items
self.page = page
self.per_page = per_page
self.total = total
self.pages = (total + per_page - 1) // per_page
self.has_prev = page > 1
self.has_next = page < self.pages
self.prev_num = page - 1
self.next_num = page + 1
handlings = Pagination(current_page, page, per_page, total)
return render_template('history.html', handlings=handlings, search=search)
@app.route('/history/<string:order_id>')
@login_required
def history_detail(order_id):
if current_user.role not in ['装维员', '统计员']:
app.logger.warning(f'未授权访问:用户 {current_user.name} 尝试查看工单详情 {order_id}')
flash('您没有权限访问此页面')
return redirect(url_for('statistics'))
app.logger.info(f'用户 {current_user.name} 查看工单 {order_id} 的详情')
# 根据工单号前缀判断是普通工单还是手工故障单
if order_id.startswith('M'):
handling = ManualWorkOrder.query.get_or_404(order_id)
else:
handling = WorkOrderHandling.query.filter_by(order_id=order_id).first_or_404()
# 装维员只能查看自己处理的工单
if current_user.role == '装维员' and handling.handler != current_user.name:
flash('您没有权限查看此工单')
return redirect(url_for('history'))
# 传递工单类型到模板
order_type = 'manual' if order_id.startswith('M') else 'normal'
return render_template('history_detail.html', handling=handling, order_type=order_type)