修改人员列表的成员管理
This commit is contained in:
parent
0c7c2d89b2
commit
9f80d986ee
@ -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 }
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user