修改人员列表的成员管理

This commit is contained in:
lxd 2025-06-16 15:57:26 +08:00
parent 0c7c2d89b2
commit 9f80d986ee
4 changed files with 139 additions and 99 deletions

View File

@ -72,4 +72,12 @@ export const PersonApi = {
getPersonNoFamilyid: async (params: any) => { getPersonNoFamilyid: async (params: any) => {
return await request.get({ url: `/system/person/page-no-familyid`, params }) return await request.get({ url: `/system/person/page-no-familyid`, params })
}, },
// 更新用户家庭信息
updateFamilyInfo: async (id: number, familyrelation: number) => {
return await request.put({
url: `/system/person/update-family-info`,
data: { id, familyrelation }
})
}
} }

View File

@ -9,10 +9,17 @@
<el-button <el-button
type="primary" type="primary"
plain plain
@click="showTransfer = true" @click="handleAddMemberClick"
> >
<Icon icon="ep:plus" /> 添加成员 <Icon icon="ep:plus" /> 添加成员
</el-button> </el-button>
<el-button
type="success"
plain
@click="handleCreateFamily"
>
<Icon icon="ep:house" /> 创建家庭
</el-button>
<span class="member-count">当前成员{{ memberList.length }} </span> <span class="member-count">当前成员{{ memberList.length }} </span>
</div> </div>
<el-table v-loading="loading" :data="memberList"> <el-table v-loading="loading" :data="memberList">
@ -52,30 +59,37 @@ import { dateFormatter } from '@/utils/formatTime'
import PersonForm from './PersonFrom.vue' import PersonForm from './PersonFrom.vue'
import MemberDrawer from './memberdrawer.vue' import MemberDrawer from './memberdrawer.vue'
import { PersonApi, PersonVO } from '@/api/person' import { PersonApi, PersonVO } from '@/api/person'
import { ElMessage } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
defineOptions({ name: 'PersonMember' }) defineOptions({ name: 'PersonMember' })
//
const dialogVisible = ref(false) const dialogVisible = ref(false)
//
const showTransfer = ref(false) const showTransfer = ref(false)
//
const loading = ref(false) const loading = ref(false)
//
const memberList = ref<FamilyMember[]>([]) const memberList = ref<FamilyMember[]>([])
//
const currentMember = ref<FamilyMember | null>(null) const currentMember = ref<FamilyMember | null>(null)
//
const formRef = ref() const formRef = ref()
//
interface FamilyMember { interface FamilyMember {
id: number id: number //
name: string name: string //
mobile: string mobile: string //
age: number age: number //
gender: string gender: string //
relation: number relation: number //
address: string address: string //
createTime: string createTime: string //
familyid: string familyid: string //
familyrelation: number familyrelation: number //
} }
//
const open = (member: FamilyMember) => { const open = (member: FamilyMember) => {
currentMember.value = member currentMember.value = member
memberList.value = [] // memberList.value = [] //
@ -83,6 +97,7 @@ const open = (member: FamilyMember) => {
getMemberList() getMemberList()
} }
//
const getMemberList = async () => { const getMemberList = async () => {
if (!currentMember.value?.familyid) return if (!currentMember.value?.familyid) return
@ -106,7 +121,7 @@ const getMemberList = async () => {
} }
} }
// // 1-2-3-4-5-6-
const getFamilyRelation = (relation: number): string => { const getFamilyRelation = (relation: number): string => {
const relationMap: Record<number, string> = { const relationMap: Record<number, string> = {
1: '主号', 1: '主号',
@ -119,10 +134,30 @@ const getFamilyRelation = (relation: number): string => {
return relationMap[relation] || '其他' return relationMap[relation] || '其他'
} }
/** 处理添加成员按钮点击 */
const handleAddMemberClick = () => {
if (!currentMember.value) return
//
if (!currentMember.value.familyid) {
ElMessage.warning('请先创建家庭后再添加成员')
return
}
//
showTransfer.value = true
}
/** 添加成员 */ /** 添加成员 */
const handleAddMembers = async (members: FamilyMember[]) => { const handleAddMembers = async (members: FamilyMember[]) => {
if (!currentMember.value) return if (!currentMember.value) return
//
if (!currentMember.value.familyid) {
ElMessage.warning('请先创建家庭后再添加成员')
return
}
// 5 // 5
if (memberList.value.length + members.length > 5) { if (memberList.value.length + members.length > 5) {
ElMessage.warning('家庭成员不能超过5人') ElMessage.warning('家庭成员不能超过5人')
@ -133,12 +168,12 @@ const handleAddMembers = async (members: FamilyMember[]) => {
loading.value = true loading.value = true
// API // API
for (const member of members) { for (const member of members) {
await PersonApi.addMembers(member.id, currentMember.value.familyid,member.relation) await PersonApi.addMembers(member.id, currentMember.value.familyid, member.relation)
} }
// //
// familyrelation // familyrelation
const newMembers = members.map(member => ({ const newMembers = members.map(member => ({
...member, ...member,
familyrelation: member.relation // 使 relation familyrelation familyrelation: member.relation // 使 relation familyrelation
})) }))
@ -173,6 +208,54 @@ const handleRemove = async (row: FamilyMember) => {
} }
} }
const handleCreateFamily = async () => {
if (!currentMember.value) return
//
if (currentMember.value.familyid) {
ElMessage.warning('该成员已存在家庭组号,不能重复创建家庭')
return
}
try {
//
await ElMessageBox.confirm(
'确定要创建家庭吗?创建后该成员将成为家庭主号。',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
)
loading.value = true
// familyid
const res = await PersonApi.updateFamilyInfo(
currentMember.value.id,
1
)
// 使familyid
currentMember.value.familyid = res
currentMember.value.familyrelation = 1
//
await getMemberList()
ElMessage.success('创建家庭成功')
} catch (error) {
if (error === 'cancel') {
return
}
console.error('创建家庭失败:', error)
ElMessage.error('创建家庭失败')
} finally {
loading.value = false
}
}
defineExpose({ defineExpose({
open open
}) })
@ -182,10 +265,11 @@ defineExpose({
.mb-15px { .mb-15px {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; gap: 10px;
} }
.member-count { .member-count {
margin-left: auto;
color: #409EFF; color: #409EFF;
font-size: 14px; font-size: 14px;
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<el-dialog <el-dialog
:title="visit?.visitStatus ? '编辑回访记录' : '新增回访记录'" :title="'新增回访记录'"
v-model="dialogVisible" v-model="dialogVisible"
width="600px" width="600px"
append-to-body append-to-body

View File

@ -52,27 +52,20 @@
<ContentWrap> <ContentWrap>
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="visitList" :data="list"
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
> >
<el-table-column label="姓名" align="center" prop="name" width="160" /> <!-- <el-table-column label="ID" align="center" prop="id" width="100" /> -->
<el-table-column label="手机号" align="center" prop="phone" /> <el-table-column label="姓名" align="center" prop="name" width="160" />
<el-table-column label="回访状态" align="center" prop="visitStatus" > <el-table-column label="手机号" align="center" prop="phone" width="160" />
<el-table-column label="地址" align="center" prop="address" />
<el-table-column label="是否会员" align="center" prop="isvip">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.visitStatus ? 'success' : 'warning'"> <el-tag :type="scope.row.isvip ? 'success' : 'info'">
{{ scope.row.visitStatus ? '已回访' : '未回访' }} {{ scope.row.isvip ? '是' : '否' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="回访时间" align="center" prop="visitTime" />
<el-table-column label="回访结果" align="center" prop="result" >
<template #default="scope">
<el-tag :type="getResultType(scope.row.result)">
{{ scope.row.result || '-' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="下次回访" align="center" prop="nextVisitTime" />
<el-table-column label="操作" align="center" width="150"> <el-table-column label="操作" align="center" width="150">
<template #default="scope"> <template #default="scope">
<div class="flex items-center justify-center"> <div class="flex items-center justify-center">
@ -82,10 +75,9 @@
size="default" size="default"
@click="handleVisit(scope.row)" @click="handleVisit(scope.row)"
> >
<Icon icon="ep:edit" class="mr-5px" />{{ scope.row.visitStatus ? '编辑' : '回访' }} <Icon icon="ep:edit" class="mr-5px" />回访
</el-button> </el-button>
<el-button <el-button
v-if="scope.row.visitStatus"
type="info" type="info"
link link
size="default" size="default"
@ -129,12 +121,15 @@ import VisitDialog from './components/VisitDialog.vue'
import VisitDetail from './components/VisitDetail.vue' import VisitDetail from './components/VisitDetail.vue'
import { Icon } from '@/components/Icon' import { Icon } from '@/components/Icon'
import { RecordApi } from '@/api/record' import { RecordApi } from '@/api/record'
import { PersonApi } from '@/api/person'
import { getUserProfile } from '@/api/system/user/profile'
// 访 // 访
const visitList = ref([]) const visitList = ref([])
const loading = ref(false) const loading = ref(false)
const total = ref(0) const total = ref(0)
const userProfile = ref()
const list = ref([]) //
// //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
@ -163,64 +158,20 @@ const getResultType = (result) => {
return types[result] || 'info' return types[result] || 'info'
} }
//
const mockVisits = [
{
id: 1,
name: '张三',
phone: '13800138000',
visitStatus: true,
visitTime: '2024-03-20 14:30:00',
content: '客户对产品使用体验非常满意,建议增加更多功能',
result: '满意',
nextVisitTime: '2024-04-20'
},
{
id: 2,
name: '李四',
phone: '13800138001',
visitStatus: false,
visitTime: '',
content: '',
result: '',
nextVisitTime: ''
},
{
id: 3,
name: '王五',
phone: '13800138002',
visitStatus: true,
visitTime: '2024-03-19 10:00:00',
content: '客户反映产品偶尔会出现卡顿现象',
result: '一般',
nextVisitTime: '2024-04-19'
}
]
// 访 // 访
const getList = () => { const getList = async () => {
loading.value = true loading.value = true
setTimeout(() => { try {
// //
let filteredList = [...mockVisits] userProfile.value = await getUserProfile()
if (queryParams.name) { queryParams.orgid = userProfile.value.dept.id
filteredList = filteredList.filter(m => m.name.includes(queryParams.name)) queryParams.isvip = 1
} const data = await PersonApi.getPersonPage(queryParams)
if (queryParams.visitStatus !== undefined) { list.value = data.list
filteredList = filteredList.filter(m => m.visitStatus === queryParams.visitStatus) total.value = data.total
} } finally {
if (queryParams.result) {
filteredList = filteredList.filter(m => m.result === queryParams.result)
}
//
const start = (queryParams.pageNo - 1) * queryParams.pageSize
const end = start + queryParams.pageSize
visitList.value = filteredList.slice(start, end)
total.value = filteredList.length
loading.value = false loading.value = false
}, 500) }
} }
// //
@ -248,16 +199,13 @@ const handleDetail = (visit) => {
} }
// 访 // 访
const handleVisitSuccess = (data) => { const handleVisitSuccess = () => {
const index = mockVisits.findIndex(m => m.id === data.id) getList()
if (index !== -1) { ElMessage.success('操作成功')
mockVisits[index] = data
getList()
ElMessage.success('操作成功')
}
} }
onMounted(() => { onMounted(() => {
queryParams.pageNo = 1
getList() getList()
}) })
</script> </script>