161 lines
6.2 KiB
Python
161 lines
6.2 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
管理员面板 - 管理异常工单
|
||
"""
|
||
|
||
import tkinter as tk
|
||
from tkinter import ttk, messagebox
|
||
import requests
|
||
import sys
|
||
import os
|
||
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
|
||
class AdminPanel:
|
||
"""管理员面板"""
|
||
|
||
@staticmethod
|
||
def translate_status(status):
|
||
"""将英文状态转换为中文"""
|
||
status_map = {
|
||
'pending': '待处理',
|
||
'claimed': '已认领',
|
||
'completed': '已完成'
|
||
}
|
||
return status_map.get(status, status)
|
||
|
||
def __init__(self, root, api_base_url):
|
||
self.root = root
|
||
self.root.title("管理员面板 - 工单管理")
|
||
self.root.geometry("900x600")
|
||
if isinstance(root, tk.Toplevel):
|
||
self.root.transient(root.master)
|
||
self.api_base_url = api_base_url
|
||
self.claimed_orders = []
|
||
|
||
self._create_widgets()
|
||
self.load_claimed_orders()
|
||
|
||
def _create_widgets(self):
|
||
"""创建界面"""
|
||
# 标题
|
||
title_frame = tk.Frame(self.root, bg="#2c3e50", height=60)
|
||
title_frame.pack(fill=tk.X)
|
||
title_frame.pack_propagate(False)
|
||
|
||
tk.Label(title_frame, text="管理员面板 - 已认领工单管理", font=("微软雅黑", 18, "bold"), fg="white", bg="#2c3e50").pack(pady=15)
|
||
|
||
# 工单列表
|
||
list_frame = tk.LabelFrame(self.root, text="已认领工单列表", font=("微软雅黑", 12), padx=10, pady=10)
|
||
list_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||
|
||
columns = ("追溯号", "工序号", "工序名称", "操作员", "认领时间", "状态")
|
||
self.tree = ttk.Treeview(list_frame, columns=columns, show="headings")
|
||
|
||
for col in columns:
|
||
self.tree.heading(col, text=col)
|
||
self.tree.column(col, width=150, anchor=tk.CENTER)
|
||
|
||
scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.tree.yview)
|
||
self.tree.configure(yscrollcommand=scrollbar.set)
|
||
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
|
||
|
||
# 按钮
|
||
button_frame = tk.Frame(self.root, padx=10, pady=10)
|
||
button_frame.pack(fill=tk.X)
|
||
|
||
tk.Button(button_frame, text="刷新列表", font=("微软雅黑", 10), bg="#3498db", fg="white", width=12, command=self.load_claimed_orders).pack(side=tk.LEFT, padx=5)
|
||
tk.Button(button_frame, text="退领选中工单", font=("微软雅黑", 10), bg="#e67e22", fg="white", width=12, command=self.unclaim_selected).pack(side=tk.LEFT, padx=5)
|
||
tk.Button(button_frame, text="批量退领", font=("微软雅黑", 10), bg="#e74c3c", fg="white", width=12, command=self.unclaim_all).pack(side=tk.LEFT, padx=5)
|
||
|
||
def load_claimed_orders(self):
|
||
"""加载已认领工单"""
|
||
try:
|
||
response = requests.get(f"{self.api_base_url}/work-orders/claimed", timeout=2)
|
||
if response.status_code == 200:
|
||
data = response.json()
|
||
if data.get("success"):
|
||
self.claimed_orders = data.get("data", [])
|
||
self.update_list()
|
||
except Exception as e:
|
||
messagebox.showerror("错误", f"加载失败: {e}")
|
||
|
||
def update_list(self):
|
||
"""更新列表"""
|
||
self.tree.delete(*self.tree.get_children())
|
||
for order in self.claimed_orders:
|
||
status = order.get('status', 'claimed')
|
||
status_cn = self.translate_status(status)
|
||
self.tree.insert("", tk.END, values=(
|
||
order.get('trace_id'), order.get('process_id'), order.get('process_name', '--'),
|
||
order.get('operator', '--'), order.get('claimed_at', '--'), status_cn
|
||
))
|
||
|
||
def unclaim_selected(self):
|
||
"""退领选中工单"""
|
||
selected = self.tree.selection()
|
||
if not selected:
|
||
messagebox.showwarning("警告", "请选择要退领的工单")
|
||
return
|
||
|
||
item = self.tree.item(selected[0])
|
||
values = item['values']
|
||
trace_id, process_id = values[0], values[1]
|
||
|
||
if not messagebox.askyesno("确认", f"确定退领工单 {trace_id} - {process_id}?"):
|
||
return
|
||
|
||
try:
|
||
response = requests.post(f"{self.api_base_url}/work-orders/unclaim", json={"trace_id": trace_id, "process_id": process_id}, timeout=2)
|
||
if response.status_code == 200 and response.json().get("success"):
|
||
messagebox.showinfo("成功", "退领成功")
|
||
self.load_claimed_orders()
|
||
except Exception as e:
|
||
messagebox.showerror("错误", f"退领失败: {e}")
|
||
|
||
def unclaim_all(self):
|
||
"""批量退领所有工单"""
|
||
if not self.claimed_orders:
|
||
messagebox.showinfo("提示", "没有需要退领的工单")
|
||
return
|
||
|
||
if not messagebox.askyesno("确认", f"确定退领所有 {len(self.claimed_orders)} 个工单?"):
|
||
return
|
||
|
||
success_count = 0
|
||
for order in self.claimed_orders:
|
||
try:
|
||
requests.post(f"{self.api_base_url}/work-orders/unclaim", json={"trace_id": order['trace_id'], "process_id": order['process_id']}, timeout=2)
|
||
success_count += 1
|
||
except:
|
||
pass
|
||
|
||
messagebox.showinfo("完成", f"成功退领 {success_count}/{len(self.claimed_orders)} 个工单")
|
||
self.load_claimed_orders()
|
||
|
||
|
||
def main():
|
||
import json
|
||
api_url = "http://localhost:5000/api"
|
||
try:
|
||
config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config.json")
|
||
if os.path.exists(config_path):
|
||
with open(config_path, "r", encoding="utf-8") as f:
|
||
config = json.load(f)
|
||
api_url = config.get("api", {}).get("base_url", api_url)
|
||
if not api_url.endswith("/api"):
|
||
api_url = api_url.rstrip("/") + "/api"
|
||
except:
|
||
pass
|
||
|
||
root = tk.Tk()
|
||
AdminPanel(root, api_url)
|
||
root.mainloop()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|