修改人员列表的成员管理

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) => {
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
type="primary"
plain
@click="showTransfer = true"
@click="handleAddMemberClick"
>
<Icon icon="ep:plus" /> 添加成员
</el-button>
<el-button
type="success"
plain
@click="handleCreateFamily"
>
<Icon icon="ep:house" /> 创建家庭
</el-button>
<span class="member-count">当前成员{{ memberList.length }} </span>
</div>
<el-table v-loading="loading" :data="memberList">
@ -52,30 +59,37 @@ import { dateFormatter } from '@/utils/formatTime'
import PersonForm from './PersonFrom.vue'
import MemberDrawer from './memberdrawer.vue'
import { PersonApi, PersonVO } from '@/api/person'
import { ElMessage } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
defineOptions({ name: 'PersonMember' })
//
const dialogVisible = ref(false)
//
const showTransfer = ref(false)
//
const loading = ref(false)
//
const memberList = ref<FamilyMember[]>([])
//
const currentMember = ref<FamilyMember | null>(null)
//
const formRef = ref()
//
interface FamilyMember {
id: number
name: string
mobile: string
age: number
gender: string
relation: number
address: string
createTime: string
familyid: string
familyrelation: number
id: number //
name: string //
mobile: string //
age: number //
gender: string //
relation: number //
address: string //
createTime: string //
familyid: string //
familyrelation: number //
}
//
const open = (member: FamilyMember) => {
currentMember.value = member
memberList.value = [] //
@ -83,6 +97,7 @@ const open = (member: FamilyMember) => {
getMemberList()
}
//
const getMemberList = async () => {
if (!currentMember.value?.familyid) return
@ -106,7 +121,7 @@ const getMemberList = async () => {
}
}
//
// 1-2-3-4-5-6-
const getFamilyRelation = (relation: number): string => {
const relationMap: Record<number, string> = {
1: '主号',
@ -119,10 +134,30 @@ const getFamilyRelation = (relation: number): string => {
return relationMap[relation] || '其他'
}
/** 处理添加成员按钮点击 */
const handleAddMemberClick = () => {
if (!currentMember.value) return
//
if (!currentMember.value.familyid) {
ElMessage.warning('请先创建家庭后再添加成员')
return
}
//
showTransfer.value = true
}
/** 添加成员 */
const handleAddMembers = async (members: FamilyMember[]) => {
if (!currentMember.value) return
//
if (!currentMember.value.familyid) {
ElMessage.warning('请先创建家庭后再添加成员')
return
}
// 5
if (memberList.value.length + members.length > 5) {
ElMessage.warning('家庭成员不能超过5人')
@ -133,12 +168,12 @@ const handleAddMembers = async (members: FamilyMember[]) => {
loading.value = true
// API
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
const newMembers = members.map(member => ({
// familyrelation
const newMembers = members.map(member => ({
...member,
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({
open
})
@ -182,10 +265,11 @@ defineExpose({
.mb-15px {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.member-count {
margin-left: auto;
color: #409EFF;
font-size: 14px;
}

View File

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

View File

@ -52,27 +52,20 @@
<ContentWrap>
<el-table
v-loading="loading"
:data="visitList"
:data="list"
:show-overflow-tooltip="true"
>
<el-table-column label="姓名" align="center" prop="name" width="160" />
<el-table-column label="手机号" align="center" prop="phone" />
<el-table-column label="回访状态" align="center" prop="visitStatus" >
<!-- <el-table-column label="ID" align="center" prop="id" width="100" /> -->
<el-table-column label="姓名" align="center" prop="name" width="160" />
<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">
<el-tag :type="scope.row.visitStatus ? 'success' : 'warning'">
{{ scope.row.visitStatus ? '已回访' : '未回访' }}
<el-tag :type="scope.row.isvip ? 'success' : 'info'">
{{ scope.row.isvip ? '是' : '否' }}
</el-tag>
</template>
</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">
<template #default="scope">
<div class="flex items-center justify-center">
@ -82,10 +75,9 @@
size="default"
@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
v-if="scope.row.visitStatus"
type="info"
link
size="default"
@ -129,12 +121,15 @@ import VisitDialog from './components/VisitDialog.vue'
import VisitDetail from './components/VisitDetail.vue'
import { Icon } from '@/components/Icon'
import { RecordApi } from '@/api/record'
import { PersonApi } from '@/api/person'
import { getUserProfile } from '@/api/system/user/profile'
// 访
const visitList = ref([])
const loading = ref(false)
const total = ref(0)
const userProfile = ref()
const list = ref([]) //
//
const queryParams = reactive({
pageNo: 1,
@ -163,64 +158,20 @@ const getResultType = (result) => {
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
setTimeout(() => {
//
let filteredList = [...mockVisits]
if (queryParams.name) {
filteredList = filteredList.filter(m => m.name.includes(queryParams.name))
}
if (queryParams.visitStatus !== undefined) {
filteredList = filteredList.filter(m => m.visitStatus === queryParams.visitStatus)
}
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
try {
//
userProfile.value = await getUserProfile()
queryParams.orgid = userProfile.value.dept.id
queryParams.isvip = 1
const data = await PersonApi.getPersonPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}, 500)
}
}
//
@ -248,16 +199,13 @@ const handleDetail = (visit) => {
}
// 访
const handleVisitSuccess = (data) => {
const index = mockVisits.findIndex(m => m.id === data.id)
if (index !== -1) {
mockVisits[index] = data
getList()
ElMessage.success('操作成功')
}
const handleVisitSuccess = () => {
getList()
ElMessage.success('操作成功')
}
onMounted(() => {
queryParams.pageNo = 1
getList()
})
</script>