feat: 支局长/分管领导可为任意客户经理代填记录

后端:
- 5个模块的 Create/Update schema 新增可选 manager_id 字段
- POST 端点: director/leader 可指定 manager_id,manager 角色自动用自身
- PUT 端点: director/leader 可修改 manager_id,manager 角色禁止修改

前端(移动端+桌面端共10个页面):
- 支局长/领导可见「客户经理」下拉选择框
- 创建和编辑时均可指定记录归属的客户经理
- 涵盖今日拜访、今日纪要、工作计划、商机跟单、要客拜访五个模块

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-12 18:19:05 +08:00
parent c489a8d6fd
commit 4453ee2ca0
19 changed files with 145 additions and 15 deletions
+10 -1
View File
@@ -15,6 +15,7 @@ const loading = ref(false)
const isLight = computed(() => themeStore.currentTheme === 'light')
const miniBusiness = ref<any[]>([])
const customers = ref<any[]>([])
const allManagers = ref<any[]>([])
const shotRef = ref<HTMLElement | null>(null)
const { capturing, captureEl } = useScreenshot()
@@ -64,6 +65,9 @@ const managerSummary = computed(() => {
onMounted(async () => {
await Promise.all([loadItems(), loadCustomers(), loadManagerColors()])
if (auth.isDirector || auth.isLeader) {
api.get('/users/', { params: { role: 'manager' } }).then(r => { allManagers.value = r.data }).catch(() => {})
}
})
const customerSearch = ref('')
@@ -110,7 +114,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: auth.userId || '' }
dialogVisible.value = true
}
@@ -271,6 +275,11 @@ async function quickStatusChange(row: any, newStatus: string) {
</template>
</el-select>
</el-form-item>
<el-form-item v-if="auth.isDirector || auth.isLeader" label="客户经理">
<el-select v-model="form.manager_id" filterable placeholder="选择客户经理" style="width:100%">
<el-option v-for="m in allManagers" :key="m.id" :label="m.name" :value="m.id" />
</el-select>
</el-form-item>
<el-form-item label="产品类型"><el-input v-model="form.product_type" placeholder="云专线SD-WAN" /></el-form-item>
<el-form-item label="金额"><el-input v-model="form.amount" placeholder="50000/" /></el-form-item>
<el-form-item label="跟进内容"><el-input v-model="form.follow_up_detail" type="textarea" :rows="4" placeholder="请输入跟进详情" /></el-form-item>