181 lines
7.1 KiB
Python
181 lines
7.1 KiB
Python
from copy import deepcopy
|
|
|
|
|
|
class DemoStore:
|
|
def __init__(self) -> None:
|
|
self.users = {
|
|
("sales01", "salesman"): {
|
|
"user_id": 1,
|
|
"username": "sales01",
|
|
"real_name": "张三",
|
|
"mobile": "13800000000",
|
|
"role_id": 2,
|
|
"role_name": "业务员",
|
|
"role_code": "salesman",
|
|
"token": "demo-sales-token",
|
|
"menus": [{"menu_name": "我的订单", "menu_path": "/orders"}],
|
|
"permissions": ["order:create", "order:list", "order:submit"],
|
|
},
|
|
("admin01", "admin"): {
|
|
"user_id": 99,
|
|
"username": "admin01",
|
|
"real_name": "管理员",
|
|
"mobile": "13900000001",
|
|
"role_id": 1,
|
|
"role_name": "管理员",
|
|
"role_code": "admin",
|
|
"token": "demo-admin-token",
|
|
"menus": [{"menu_name": "后台首页", "menu_path": "/dashboard"}],
|
|
"permissions": ["system:user:list", "system:role:list", "order:list"],
|
|
},
|
|
("driver01", "driver"): {
|
|
"user_id": 10,
|
|
"username": "driver01",
|
|
"real_name": "演示司机",
|
|
"mobile": "13900000010",
|
|
"role_id": 4,
|
|
"role_name": "司机",
|
|
"role_code": "driver",
|
|
"token": "demo-driver-token",
|
|
"menus": [{"menu_name": "我的任务", "menu_path": "/pages/task-list"}],
|
|
"permissions": ["driver:task:list", "driver:task:accept"],
|
|
},
|
|
}
|
|
self.orders = [
|
|
{
|
|
"order_id": 9001,
|
|
"order_no": "SO202605140001",
|
|
"customer_name": "李四",
|
|
"customer_mobile": "13900000000",
|
|
"salesman_name": "张三",
|
|
"order_status": "approved",
|
|
"customer_address": "杭州市西湖区演示路 1 号",
|
|
"order_source": "线下拜访",
|
|
"delivery_type": "工厂直送",
|
|
"factory_id": 1001,
|
|
"factory_name": "工厂A",
|
|
"sale_price_total": 100.0,
|
|
"cost_price_total": 60.0,
|
|
"profit_total": 20.0,
|
|
"profit_rate": 20.0,
|
|
"commission_amount": 50.0,
|
|
"created_at": "2026-05-14 10:00:00",
|
|
"items": [
|
|
{
|
|
"item_id": 1,
|
|
"product_id": 2001,
|
|
"product_name": "产品A",
|
|
"specification": "10kg",
|
|
"unit": "吨",
|
|
"quantity": 1,
|
|
"sale_price": 100,
|
|
"cost_price": 60,
|
|
"rebate_amount": 0,
|
|
"freight_amount": 0,
|
|
"tax_amount": 0,
|
|
"other_fee_amount": 0,
|
|
"remark": "演示明细",
|
|
}
|
|
],
|
|
"approve_logs": [],
|
|
"attachments": [],
|
|
"remark": "演示订单",
|
|
}
|
|
]
|
|
self.logistics_tasks = []
|
|
|
|
def login(self, username: str, role_type: str) -> dict | None:
|
|
user = self.users.get((username, role_type))
|
|
return deepcopy(user) if user else None
|
|
|
|
def get_me(self, token: str) -> dict | None:
|
|
for user in self.users.values():
|
|
if user["token"] == token:
|
|
data = deepcopy(user)
|
|
return data
|
|
return None
|
|
|
|
def list_orders(self) -> list[dict]:
|
|
return deepcopy(self.orders)
|
|
|
|
def get_order(self, order_id: int) -> dict | None:
|
|
for order in self.orders:
|
|
if order["order_id"] == order_id:
|
|
return deepcopy(order)
|
|
return None
|
|
|
|
def create_order(self, payload: dict) -> dict:
|
|
next_id = max(order["order_id"] for order in self.orders) + 1 if self.orders else 9001
|
|
sale_total = sum(item["quantity"] * item["sale_price"] for item in payload["items"])
|
|
cost_total = sum(item["quantity"] * item["cost_price"] for item in payload["items"])
|
|
profit_total = sale_total - cost_total - payload["rebate_total"] - payload["freight_total"] - payload["tax_total"] - payload["other_fee_total"]
|
|
profit_rate = round((profit_total / sale_total) * 100, 2) if sale_total else 0
|
|
order = {
|
|
"order_id": next_id,
|
|
"order_no": f"SO{next_id}",
|
|
"customer_name": payload["customer_name"],
|
|
"customer_mobile": payload["customer_mobile"],
|
|
"salesman_name": "张三",
|
|
"order_status": "draft",
|
|
"sale_price_total": round(sale_total, 2),
|
|
"cost_price_total": round(cost_total, 2),
|
|
"profit_total": round(profit_total, 2),
|
|
"profit_rate": profit_rate,
|
|
"commission_amount": payload["commission_amount"],
|
|
"created_at": "2026-05-14 12:00:00",
|
|
"items": payload["items"],
|
|
"approve_logs": [],
|
|
"attachments": [],
|
|
"remark": payload.get("remark"),
|
|
}
|
|
self.orders.append(order)
|
|
return deepcopy(order)
|
|
|
|
def list_logistics_tasks(self) -> dict:
|
|
return {
|
|
"total": len(self.logistics_tasks),
|
|
"page_no": 1,
|
|
"page_size": 20,
|
|
"list": deepcopy(self.logistics_tasks),
|
|
}
|
|
|
|
def create_logistics_task(self, payload: dict) -> dict:
|
|
next_id = max([task["task_id"] for task in self.logistics_tasks], default=5000) + 1
|
|
order = self.get_order(payload["order_id"])
|
|
task = {
|
|
"task_id": next_id,
|
|
"task_no": f"LT{next_id}",
|
|
"order_id": payload["order_id"],
|
|
"order_no": order["order_no"] if order else "",
|
|
"driver_id": payload["driver_id"],
|
|
"driver_name": f"司机{payload['driver_id']}",
|
|
"factory_id": payload.get("factory_id"),
|
|
"factory_name": order.get("factory_name", "") if order else "",
|
|
"pickup_address": payload["pickup_address"],
|
|
"delivery_address": payload["delivery_address"],
|
|
"pickup_content": payload["pickup_content"],
|
|
"quantity": payload["quantity"],
|
|
"status": "pending",
|
|
"remark": payload.get("remark"),
|
|
"created_at": "2026-05-14 14:00:00",
|
|
"salesman_name": order.get("salesman_name", "") if order else "",
|
|
"customer_name": order.get("customer_name", "") if order else "",
|
|
}
|
|
self.logistics_tasks.append(task)
|
|
|
|
for index, item in enumerate(self.orders):
|
|
if item["order_id"] == payload["order_id"]:
|
|
self.orders[index]["order_status"] = "pending_driver"
|
|
break
|
|
|
|
return deepcopy(task)
|
|
|
|
def get_logistics_task(self, task_id: int) -> dict | None:
|
|
for task in self.logistics_tasks:
|
|
if task["task_id"] == task_id:
|
|
return deepcopy(task)
|
|
return None
|
|
|
|
|
|
demo_store = DemoStore()
|