diff --git a/backend/app/api/key_visits.py b/backend/app/api/key_visits.py index 2544343..5d40f83 100644 --- a/backend/app/api/key_visits.py +++ b/backend/app/api/key_visits.py @@ -63,7 +63,7 @@ async def create_key_visit( planned_date=data.planned_date, planned_visitor=data.planned_visitor, visit_target=data.visit_target, - manager_id=uuid.UUID(current_user["user_id"]), + manager_id=data.manager_id or uuid.UUID(current_user["user_id"]), ) init_entry(k, current_user["name"]) db.add(k) diff --git a/backend/app/api/mini_business.py b/backend/app/api/mini_business.py index 7cb9fc5..0c35a86 100644 --- a/backend/app/api/mini_business.py +++ b/backend/app/api/mini_business.py @@ -60,7 +60,7 @@ async def create_mini_business( amount=data.amount, follow_up_detail=data.follow_up_detail, status=data.status, - manager_id=uuid.UUID(current_user["user_id"]), + manager_id=data.manager_id or uuid.UUID(current_user["user_id"]), expected_revenue_date=data.expected_revenue_date, ) init_entry(m, current_user["name"]) diff --git a/backend/app/api/work_plans.py b/backend/app/api/work_plans.py index 269e42a..f1b7f30 100644 --- a/backend/app/api/work_plans.py +++ b/backend/app/api/work_plans.py @@ -58,7 +58,7 @@ async def create_work_plan( customer_id=data.customer_id, plan_content=data.plan_content, plan_date=parse_date(data.plan_date), - manager_id=uuid.UUID(current_user["user_id"]), + manager_id=data.manager_id or uuid.UUID(current_user["user_id"]), status=data.status, ) init_entry(wp, current_user["name"]) diff --git a/backend/app/schemas/key_visit.py b/backend/app/schemas/key_visit.py index c7d7454..244eb12 100644 --- a/backend/app/schemas/key_visit.py +++ b/backend/app/schemas/key_visit.py @@ -11,6 +11,7 @@ class KeyVisitCreate(BaseModel): planned_date: str = "" planned_visitor: str = "" visit_target: str = "" + manager_id: Optional[uuid.UUID] = None class KeyVisitUpdate(BaseModel): diff --git a/backend/app/schemas/mini_business.py b/backend/app/schemas/mini_business.py index a0719aa..1c1bc8c 100644 --- a/backend/app/schemas/mini_business.py +++ b/backend/app/schemas/mini_business.py @@ -10,6 +10,7 @@ class MiniBusinessCreate(BaseModel): follow_up_detail: str = "" status: str = "跟进中" expected_revenue_date: str = "" + manager_id: Optional[uuid.UUID] = None class MiniBusinessUpdate(BaseModel): diff --git a/backend/app/schemas/work_plan.py b/backend/app/schemas/work_plan.py index 1816798..b4f640a 100644 --- a/backend/app/schemas/work_plan.py +++ b/backend/app/schemas/work_plan.py @@ -9,6 +9,7 @@ class WorkPlanCreate(BaseModel): plan_content: str = "" plan_date: str # "YYYY-MM-DD" status: str = "计划中" + manager_id: Optional[uuid.UUID] = None # director can assign to a specific manager class WorkPlanUpdate(BaseModel): diff --git a/frontend/src/views/desktop/KeyVisits.vue b/frontend/src/views/desktop/KeyVisits.vue index 8ffa9b8..0fe3473 100644 --- a/frontend/src/views/desktop/KeyVisits.vue +++ b/frontend/src/views/desktop/KeyVisits.vue @@ -10,6 +10,7 @@ const auth = useAuthStore() const loading = ref(false) const keyVisits = ref([]) const customers = ref([]) +const managers = ref([]) const allUsers = ref([]) const plannedVisitors = ref([]) @@ -36,9 +37,16 @@ const managerSummary = computed(() => { }) onMounted(async () => { - await Promise.all([loadItems(), loadCustomers(), loadUsers()]) + await Promise.all([loadItems(), loadCustomers(), loadUsers(), loadManagers()]) }) +async function loadManagers() { + try { + const res = await api.get('/users/', { params: { role: 'manager' } }) + managers.value = res.data || [] + } catch (_) {} +} + async function loadUsers() { try { const res = await api.get('/users/') @@ -66,7 +74,7 @@ async function loadItems() { function openCreate() { dialogMode.value = 'create' - form.value = { customer_id: '', urgency_level: '一般', description: '', progress_status: '未开始', planned_date: '', planned_visitor: '', visit_target: '' } + form.value = { customer_id: '', urgency_level: '一般', description: '', progress_status: '未开始', planned_date: '', planned_visitor: '', visit_target: '', manager_id: '' } plannedVisitors.value = [] dialogVisible.value = true } @@ -191,6 +199,11 @@ async function quickStatusChange(row: any, newStatus: string) { + + + + + diff --git a/frontend/src/views/desktop/MiniBusiness.vue b/frontend/src/views/desktop/MiniBusiness.vue index a75f7d3..51ae3e4 100644 --- a/frontend/src/views/desktop/MiniBusiness.vue +++ b/frontend/src/views/desktop/MiniBusiness.vue @@ -10,6 +10,7 @@ const auth = useAuthStore() const loading = ref(false) const miniBusiness = ref([]) const customers = ref([]) +const managers = ref([]) const dialogVisible = ref(false) const dialogMode = ref<'create' | 'edit'>('create') @@ -34,9 +35,16 @@ const managerSummary = computed(() => { }) onMounted(async () => { - await Promise.all([loadItems(), loadCustomers()]) + await Promise.all([loadItems(), loadCustomers(), loadManagers()]) }) +async function loadManagers() { + try { + const res = await api.get('/users/', { params: { role: 'manager' } }) + managers.value = res.data || [] + } catch (_) {} +} + async function loadCustomers(q?: string) { try { const params: any = { page_size: 100 } @@ -57,7 +65,7 @@ async function loadItems() { function openCreate() { dialogMode.value = 'create' - form.value = { customer_id: '', product_type: '', amount: '', follow_up_detail: '', status: '跟进中', expected_revenue_date: '' } + form.value = { customer_id: '', product_type: '', amount: '', follow_up_detail: '', status: '跟进中', expected_revenue_date: '', manager_id: '' } dialogVisible.value = true } @@ -171,6 +179,11 @@ async function quickStatusChange(row: any, newStatus: string) { + + + + + diff --git a/frontend/src/views/desktop/WorkPlans.vue b/frontend/src/views/desktop/WorkPlans.vue index a11a2a1..f250535 100644 --- a/frontend/src/views/desktop/WorkPlans.vue +++ b/frontend/src/views/desktop/WorkPlans.vue @@ -10,6 +10,7 @@ const auth = useAuthStore() const loading = ref(false) const workPlans = ref([]) const customers = ref([]) +const managers = ref([]) const dialogVisible = ref(false) const dialogMode = ref<'create' | 'edit'>('create') @@ -34,9 +35,16 @@ const managerSummary = computed(() => { }) onMounted(async () => { - await Promise.all([loadPlans(), loadCustomers()]) + await Promise.all([loadPlans(), loadCustomers(), loadManagers()]) }) +async function loadManagers() { + try { + const res = await api.get('/users/', { params: { role: 'manager' } }) + managers.value = res.data || [] + } catch (_) {} +} + async function loadCustomers(q?: string) { try { const params: any = { page_size: 100 } @@ -57,7 +65,7 @@ async function loadPlans() { function openCreate() { dialogMode.value = 'create' - form.value = { customer_id: '', plan_content: '', plan_date: todayStr(), status: '计划中' } + form.value = { customer_id: '', plan_content: '', plan_date: todayStr(), status: '计划中', manager_id: '' } dialogVisible.value = true } @@ -169,6 +177,11 @@ async function quickStatusChange(row: any, newStatus: string) { + + + + +