修改人员列表的成员管理
This commit is contained in:
parent
0c7c2d89b2
commit
9f80d986ee
@ -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 }
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="visit?.visitStatus ? '编辑回访记录' : '新增回访记录'"
|
||||
:title="'新增回访记录'"
|
||||
v-model="dialogVisible"
|
||||
width="600px"
|
||||
append-to-body
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user