dingdanquanliucheng/backend/app/services/customer_service.py
2026-05-14 13:51:06 +08:00

150 lines
5.7 KiB
Python

from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from backend.app.repositories.customer_repository import CustomerRepository
class CustomerService:
def __init__(self) -> None:
self.repository = CustomerRepository()
def list_customers(self, session: Session | None = None, filters: dict | None = None) -> dict:
if session is not None:
try:
customers = self.repository.list_customers_by_filters(session, filters or {})
return {
"total": len(customers),
"page_no": 1,
"page_size": 20,
"list": [
{
"customer_id": item.id,
"customer_name": item.customer_name,
"mobile": item.mobile,
"address": item.address,
"settlement_type": item.settlement_type,
"settlement_days": item.settlement_days,
"customer_type": item.customer_type,
"salesman_id": item.salesman_id,
"salesman_name": "",
"arrears_amount": 0,
"status": 1,
}
for item in customers
],
}
except SQLAlchemyError:
pass
return {
"total": 1,
"page_no": 1,
"page_size": 20,
"list": [
{
"customer_id": 3001,
"customer_name": "演示客户",
"mobile": "13900000000",
"address": "杭州市西湖区演示地址 1 号",
"settlement_type": "monthly",
"settlement_days": 30,
"customer_type": "channel",
"salesman_id": 1,
"salesman_name": "演示业务员",
"arrears_amount": 0,
"status": 1,
}
],
}
def create_customer(self, session: Session | None = None, payload: dict | None = None) -> dict:
if session is not None and payload is not None:
try:
existed = self.repository.find_by_name_and_mobile(
session,
payload["customer_name"],
payload["mobile"],
)
if existed is not None:
return {
"customer_id": existed.id,
"customer_name": existed.customer_name,
"mobile": existed.mobile,
}
customer = self.repository.create_customer(
session,
{
"customer_name": payload["customer_name"],
"mobile": payload["mobile"],
"address": payload.get("address"),
"settlement_type": payload.get("settlement_type"),
"settlement_days": payload.get("settlement_days", 0),
"customer_type": payload.get("customer_type"),
"salesman_id": payload.get("salesman_id"),
"credit_limit": payload.get("credit_limit", 0),
"remark": payload.get("remark"),
},
)
session.commit()
return {
"customer_id": customer.id,
"customer_name": customer.customer_name,
"mobile": customer.mobile,
}
except SQLAlchemyError:
session.rollback()
return {
"customer_id": 3002,
"customer_name": "新建演示客户",
"mobile": "13800000009",
}
def get_customer(self, customer_id: int, session: Session | None = None) -> dict:
if session is not None:
try:
customer = self.repository.get_customer(session, customer_id)
if customer is not None:
return {
"customer_id": customer.id,
"customer_name": customer.customer_name,
"mobile": customer.mobile,
"address": customer.address,
"settlement_type": customer.settlement_type,
"settlement_days": customer.settlement_days,
"customer_type": customer.customer_type,
"salesman_id": customer.salesman_id,
"salesman_name": "",
"credit_limit": float(customer.credit_limit or 0),
"remark": customer.remark,
}
except SQLAlchemyError:
pass
return {
"customer_id": customer_id,
"customer_name": "演示客户",
"mobile": "13900000000",
"address": "杭州市西湖区演示地址 1 号",
"settlement_type": "monthly",
"settlement_days": 30,
"customer_type": "channel",
"salesman_id": 1,
"salesman_name": "演示业务员",
"credit_limit": 10000,
"remark": "演示备注",
}
def import_customers(self) -> dict:
return {
"total_count": 100,
"success_count": 90,
"duplicate_count": 5,
"fail_count": 5,
"fail_list": [{"row_no": 12, "reason": "手机号格式错误"}],
}
customer_service = CustomerService()