新增档案相关

This commit is contained in:
Flow 2025-06-05 13:29:39 +08:00
parent f2740ec3ba
commit 3a2491a9a6
7 changed files with 966 additions and 205 deletions

53
src/api/person/index.ts Normal file
View File

@ -0,0 +1,53 @@
import request from '@/config/axios'
// 用户基本信息 VO
export interface PersonVO {
id: number // 主键ID
phone: string // 手机号(登录账号)
password: string // 密码
name: string // 姓名
address: string // 地址
orgid: number // 机构ID
orgname: string // 机构名称
familyid: string // 家庭组号
familyrelation: number // 家庭关系1-本人2-兄弟3-父亲4-母亲5-子女6-其他
isvip: number // 是否会员0-否1-是
idcard: string // 身份证号
createtime: Date // 创建时间
updatetime: Date // 更新时间
createby: string // 创建人
updateby: string // 更新人
}
// 用户基本信息 API
export const PersonApi = {
// 查询用户基本信息分页
getPersonPage: async (params: any) => {
return await request.get({ url: `/system/person/page`, params })
},
// 查询用户基本信息详情
getPerson: async (id: number) => {
return await request.get({ url: `/system/person/get?id=` + id })
},
// 新增用户基本信息
createPerson: async (data: PersonVO) => {
return await request.post({ url: `/system/person/create`, data })
},
// 修改用户基本信息
updatePerson: async (data: PersonVO) => {
return await request.put({ url: `/system/person/update`, data })
},
// 删除用户基本信息
deletePerson: async (id: number) => {
return await request.delete({ url: `/system/person/delete?id=` + id })
},
// 导出用户基本信息 Excel
exportPerson: async (params) => {
return await request.download({ url: `/system/person/export-excel`, params })
},
}

View File

@ -0,0 +1,73 @@
import request from '@/config/axios'
// 人员档案 VO
export interface PersonArchiveVO {
id: number // 主键ID
userid: number // 人员表ID
orgid: number // 机构ID
orgname: string // 机构名称
name: string // 姓名
gender: number // 性别 1男 2女
age: number // 年龄
idcard: string // 身份证号
address: string // 户籍住址
phone: string // 联系电话
bloodtype: string // 血型
sleepsituation: string // 睡眠情况
height: number // 身高cm
weight: number // 体重kg
waist: number // 腰围cm
hip: number // 臀围cm
drinking: string // 饮酒情况
disability: number // 残疾情况 0无 1有
drugallergy: number // 药物过敏史 0无 1有
exposure: number // 暴露史 0无 1有
diseasehistory: number // 疾病史 0无 1有
surgeryhistory: number // 手术史 0无 1有
traumahistory: number // 外伤史 0无 1有
transfusionhistory: number // 输血史 0无 1有
disabilitydesc: string // 残疾情况描述
drugallergydesc: string // 药物过敏史描述
exposuredesc: string // 暴露史描述
diseasehistorydesc: string // 疾病史描述
surgeryhistorydesc: string // 手术史描述
traumahistorydesc: string // 外伤史描述
transfusionhistorydesc: string // 输血史描述
createtime: Date // 创建时间
updatetime: Date // 更新时间
createby: string // 创建人
updateby: string // 更新人
}
// 人员档案 API
export const PersonArchiveApi = {
// 查询人员档案分页
getPersonArchivePage: async (params: any) => {
return await request.get({ url: `/system/person-archive/page`, params })
},
// 查询人员档案详情
getPersonArchive: async (id: number) => {
return await request.get({ url: `/system/person-archive/get?id=` + id })
},
// 新增人员档案
createPersonArchive: async (data: PersonArchiveVO) => {
return await request.post({ url: `/system/person-archive/create`, data })
},
// 修改人员档案
updatePersonArchive: async (data: PersonArchiveVO) => {
return await request.put({ url: `/system/person-archive/update`, data })
},
// 删除人员档案
deletePersonArchive: async (id: number) => {
return await request.delete({ url: `/system/person-archive/delete?id=` + id })
},
// 导出人员档案 Excel
exportPersonArchive: async (params) => {
return await request.download({ url: `/system/person-archive/export-excel`, params })
},
}

View File

@ -1,69 +1,78 @@
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle">
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="手机号" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="formData.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" placeholder="请输入手机号码" />
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model="formData.age" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-radio-group v-model="formData.gender">
<el-radio label="male"></el-radio>
<el-radio label="female"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="地址" prop="address">
<div class="flex items-center gap-2">
<el-cascader
v-model="selectedOptions"
:options="options"
@change="handleAddressChange"
placeholder="请选择省/市/区"
clearable
class="w-[450px]"
/>
<el-input
v-model="formData.detailAddress"
placeholder="请输入详细地址"
class="w-[450px]"
/>
</div>
<el-input v-model="formData.address" placeholder="请输入地址" />
</el-form-item>
<el-form-item label="机构ID" prop="orgid">
<el-input v-model="formData.orgid" placeholder="请输入机构ID" />
</el-form-item>
<el-form-item label="机构名称" prop="orgname">
<el-input v-model="formData.orgname" placeholder="请输入机构名称" />
</el-form-item>
<el-form-item label="家庭组号" prop="familyid">
<el-input v-model="formData.familyid" placeholder="请输入家庭组号" />
</el-form-item>
<el-form-item label="家庭关系" prop="familyrelation">
<el-input v-model="formData.familyrelation" placeholder="请输入家庭关系" />
</el-form-item>
<el-form-item label="是否会员" prop="isvip">
<el-select v-model="formData.isvip" placeholder="请选择是否会员">
<el-option label="是" value="1" />
<el-option label="否" value="0" />
</el-select>
</el-form-item>
<el-form-item label="身份证号" prop="idcard">
<el-input v-model="formData.idcard" placeholder="请输入身份证号" />
</el-form-item>
<el-form-item label="创建时间" prop="createtime">
<el-date-picker
v-model="formData.createtime"
type="date"
value-format="x"
placeholder="选择创建时间"
/>
</el-form-item>
<el-form-item label="更新时间" prop="updatetime">
<el-date-picker
v-model="formData.updatetime"
type="date"
value-format="x"
placeholder="选择更新时间"
/>
</el-form-item>
<el-form-item label="创建人" prop="createby">
<el-input v-model="formData.createby" placeholder="请输入创建人" />
</el-form-item>
<el-form-item label="更新人" prop="updateby">
<el-input v-model="formData.updateby" placeholder="请输入更新人" />
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { PersonApi, PersonVO } from '@/api/person'
<script lang="ts" setup>
import { ref, reactive, computed, watch } from 'vue'
import type { FormInstance } from 'element-plus'
import {
provinceAndCityData,
pcTextArr,
regionData,
pcaTextArr,
codeToText,
} from 'element-china-area-data'
interface CascaderOption {
value: string
label: string
children?: CascaderOption[]
}
/** 用户基本信息 表单 */
defineOptions({ name: 'PersonForm' })
const { t } = useI18n() //
@ -73,47 +82,31 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formRef = ref<FormInstance>()
const formData = reactive({
const formData = ref({
id: undefined,
name: '',
mobile: '',
age: 18,
gender: 'male',
address: '',
detailAddress: ''
phone: undefined,
password: undefined,
name: undefined,
address: undefined,
orgid: undefined,
orgname: undefined,
familyid: undefined,
familyrelation: undefined,
isvip: undefined,
idcard: undefined,
createtime: undefined,
updatetime: undefined,
createby: undefined,
updateby: undefined,
})
const selectedOptions = ref<string[]>([])
const options = ref<CascaderOption[]>(regionData as unknown as CascaderOption[])
//
const formRules = {
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
mobile: [
{ required: true, message: '请输入手机号码', trigger: 'blur' },
{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
],
age: [
{ required: true, message: '请输入年龄', trigger: 'blur' },
{ pattern: /^[1-9]\d{0,2}$/, message: '请输入1-999之间的数字', trigger: 'blur' }
],
gender: [{ required: true, message: '请选择性别', trigger: 'change' }],
address: [{ required: true, message: '请选择省市区', trigger: 'change' }]
}
//
const handleAddressChange = (value: string[]) => {
if (value && value.length > 0) {
const province = codeToText[value[0]]
const city = codeToText[value[1]]
const area = codeToText[value[2]]
formData.address = `${province}/${city}/${area}`
} else {
formData.address = ''
}
}
const formRules = reactive({
phone: [{ required: true, message: '手机号(登录账号)不能为空', trigger: 'blur' }],
password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
orgid: [{ required: true, message: '机构ID不能为空', trigger: 'blur' }],
orgname: [{ required: true, message: '机构名称不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
@ -125,34 +118,7 @@ const open = async (type: string, id?: number) => {
if (id) {
formLoading.value = true
try {
// APIAPI
const mockData = {
id: id,
name: '张三',
mobile: '13800138001',
age: 45,
gender: 'male',
address: '北京市/北京市/朝阳区',
detailAddress: '建国路88号'
}
Object.assign(formData, mockData)
//
if (mockData.address) {
const addressParts = mockData.address.split('/')
if (addressParts.length >= 3) {
//
const provinceCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[0])
let cityCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[1])
if(provinceCode === '12'){
cityCode = '1201'
}
const areaCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[2])
if (provinceCode && cityCode && areaCode) {
selectedOptions.value = [provinceCode, cityCode, areaCode]
}
}
}
formData.value = await PersonApi.getPerson(id)
} finally {
formLoading.value = false
}
@ -164,17 +130,16 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
await formRef.value.validate()
//
formLoading.value = true
try {
// APIAPI
await new Promise(resolve => setTimeout(resolve, 500))
const data = formData.value as unknown as PersonVO
if (formType.value === 'create') {
await PersonApi.createPerson(data)
message.success(t('common.createSuccess'))
} else {
await PersonApi.updatePerson(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
@ -187,14 +152,23 @@ const submitForm = async () => {
/** 重置表单 */
const resetForm = () => {
formData.id = undefined
formData.name = ''
formData.mobile = ''
formData.age = 18
formData.gender = 'male'
formData.address = ''
formData.detailAddress = ''
selectedOptions.value = []
formData.value = {
id: undefined,
phone: undefined,
password: undefined,
name: undefined,
address: undefined,
orgid: undefined,
orgname: undefined,
familyid: undefined,
familyrelation: undefined,
isvip: undefined,
idcard: undefined,
createtime: undefined,
updatetime: undefined,
createby: undefined,
updateby: undefined,
}
formRef.value?.resetFields()
}
</script>
</script>

View File

@ -19,18 +19,18 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-form-item label="手机号码" prop="phone">
<el-input
v-model="queryParams.mobile"
v-model="queryParams.phone"
placeholder="请输入手机号码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item label="创建时间" prop="createtime">
<el-date-picker
v-model="queryParams.createTime"
v-model="queryParams.createtime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
@ -61,20 +61,42 @@
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="编号" align="center" key="id" prop="id" width="100" />
<el-table-column label="编号" align="center" key="id" prop="id" width="80" />
<el-table-column
label="姓名"
align="center"
prop="name"
:show-overflow-tooltip="true"
width="100"
/>
<el-table-column label="手机号码" align="center" prop="phone" width="120" />
<el-table-column label="身份证号" align="center" prop="idcard" width="180" />
<el-table-column label="机构ID" align="center" prop="orgid" width="80" />
<el-table-column
label="机构名称"
align="center"
prop="orgname"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column label="手机号码" align="center" prop="mobile" width="140" />
<el-table-column label="年龄" align="center" prop="age" width="80" />
<el-table-column label="性别" align="center" prop="gender" width="80">
<el-table-column
label="家庭组号"
align="center"
prop="familyid"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column label="家庭关系" align="center" prop="familyrelation" width="100">
<template #default="scope">
<el-tag :type="scope.row.gender === 'male' ? 'primary' : 'success'">
{{ scope.row.gender === 'male' ? '男' : '女' }}
<el-tag :type="getFamilyRelationType(scope.row.familyrelation)">
{{ getFamilyRelationLabel(scope.row.familyrelation) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="是否会员" align="center" prop="isvip" width="100">
<template #default="scope">
<el-tag :type="scope.row.isvip === 1 ? 'success' : 'info'">
{{ scope.row.isvip === 1 ? '是' : '否' }}
</el-tag>
</template>
</el-table-column>
@ -88,11 +110,30 @@
<el-table-column
label="创建时间"
align="center"
prop="createTime"
prop="createtime"
:formatter="dateFormatter"
width="180"
width="160"
/>
<el-table-column label="操作" align="center" width="160">
<el-table-column
label="更新时间"
align="center"
prop="updatetime"
:formatter="dateFormatter"
width="160"
/>
<el-table-column
label="创建人"
align="center"
prop="createby"
width="100"
/>
<el-table-column
label="更新人"
align="center"
prop="updateby"
width="100"
/>
<el-table-column label="操作" align="center" width="160" fixed="right">
<template #default="scope">
<div class="flex items-center justify-center">
<el-button
@ -140,6 +181,7 @@
import { dateFormatter } from '@/utils/formatTime'
import PersonForm from './PersonFrom.vue'
import PersonMember from './Personmember.vue'
import { PersonApi, PersonVO } from '@/api/person'
defineOptions({ name: 'FamilyMember' })
@ -148,74 +190,34 @@ const { t } = useI18n() // 国际化
const loading = ref(false) //
const total = ref(0) //
const list = ref<FamilyMember[]>([]) //
const list = ref<PersonVO[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
phone: undefined,
password: undefined,
name: undefined,
mobile: undefined,
createTime: []
address: undefined,
orgid: undefined,
orgname: undefined,
familyid: undefined,
familyrelation: undefined,
isvip: undefined,
idcard: undefined,
createtime: [],
updatetime: [],
createby: undefined,
updateby: undefined,
})
const queryFormRef = ref() //
interface FamilyMember {
id: number
name: string
mobile: string
age: number
gender: string
address: string
createTime: string
}
//
const mockData: FamilyMember[] = [
{
id: 1,
name: '张三',
mobile: '13800138001',
age: 45,
gender: 'male',
address: '北京市朝阳区建国路88号',
createTime: '2024-03-20 10:00:00'
},
{
id: 2,
name: '李四',
mobile: '13800138002',
age: 42,
gender: 'female',
address: '北京市朝阳区建国路88号',
createTime: '2024-03-20 10:00:00'
},
{
id: 3,
name: '王五',
mobile: '13800138003',
age: 35,
gender: 'female',
address: '北京市海淀区中关村大街1号',
createTime: '2024-03-20 10:00:00'
},
{
id: 4,
name: '张小明',
mobile: '13800138004',
age: 12,
gender: 'male',
address: '北京市朝阳区建国路88号',
createTime: '2024-03-20 10:00:00'
}
]
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
// API
await new Promise(resolve => setTimeout(resolve, 500))
list.value = mockData
total.value = mockData.length
const data = await PersonApi.getPersonPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
@ -243,10 +245,37 @@ const handleSuccess = () => {
getList()
}
/** 获取家庭关系标签 */
const getFamilyRelationLabel = (relation: number) => {
const relationMap = {
1: '本人',
2: '兄弟',
3: '父亲',
4: '母亲',
5: '子女',
6: '其他'
}
return relationMap[relation] || '未知'
}
/** 获取家庭关系标签类型 */
const getFamilyRelationType = (relation: number) => {
const typeMap = {
1: 'primary',
2: 'success',
3: 'warning',
4: 'danger',
5: 'info',
6: ''
}
return typeMap[relation] || ''
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
await message.delConfirm()
await PersonApi.deletePerson(id)
message.success('删除成功')
await getList()
} catch {}
@ -258,8 +287,7 @@ const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
//
await new Promise(resolve => setTimeout(resolve, 1000))
await PersonApi.exportPerson(queryParams)
message.success('导出成功')
} catch {
} finally {
@ -269,7 +297,7 @@ const handleExport = async () => {
/** 查看详情 */
const memberRef = ref()
const handleDetail = (row: FamilyMember) => {
const handleDetail = (row: PersonVO) => {
memberRef.value?.open(row)
}

View File

@ -0,0 +1,413 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="人员表ID" prop="userid">
<el-input v-model="formData.userid" placeholder="请输入人员表ID" />
</el-form-item>
<el-form-item label="机构ID" prop="orgid">
<el-input v-model="formData.orgid" placeholder="请输入机构ID" />
</el-form-item>
<el-form-item label="机构名称" prop="orgname">
<el-input v-model="formData.orgname" placeholder="请输入机构名称" />
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="formData.gender" placeholder="请选择性别">
<el-option label="男" :value="1" />
<el-option label="女" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model="formData.age" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="身份证号" prop="idcard">
<el-input v-model="formData.idcard" placeholder="请输入身份证号" />
</el-form-item>
<el-form-item label="户籍住址" prop="address">
<el-cascader
v-model="selectedOptions"
:options="options"
@change="handleAddressChange"
placeholder="请选择省/市/区"
clearable
class="w-[450px]"
/>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="血型" prop="bloodtype">
<el-select v-model="formData.bloodtype" placeholder="请选择血型">
<el-option label="A型" value="A" />
<el-option label="B型" value="B" />
<el-option label="AB型" value="AB" />
<el-option label="O型" value="O" />
<el-option label="其他" value="其他" />
</el-select>
</el-form-item>
<el-form-item label="睡眠情况" prop="sleepsituation">
<el-select v-model="formData.sleepsituation" placeholder="请选择睡眠情况">
<el-option label="良好" value="良好" />
<el-option label="一般" value="一般" />
<el-option label="较差" value="较差" />
</el-select>
</el-form-item>
<el-form-item label="身高cm" prop="height">
<el-input v-model="formData.height" placeholder="请输入身高cm" />
</el-form-item>
<el-form-item label="体重kg" prop="weight">
<el-input v-model="formData.weight" placeholder="请输入体重kg" />
</el-form-item>
<el-form-item label="饮酒情况" prop="drinking">
<el-select v-model="formData.drinking" placeholder="请选择饮酒情况">
<el-option label="从不" value="从不" />
<el-option label="偶尔" value="偶尔" />
<el-option label="经常" value="经常" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="残疾情况" prop="disability">
<el-select v-model="formData.disability" placeholder="请选择残疾情况">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.disability === 1" label="残疾情况描述" prop="disabilitydesc">
<el-input v-model="formData.disabilitydesc" placeholder="请输入残疾情况描述" />
</el-form-item>
<el-form-item label="药物过敏史" prop="drugallergy">
<el-select v-model="formData.drugallergy" placeholder="请选择药物过敏史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.drugallergy === 1" label="药物过敏史描述" prop="drugallergydesc">
<el-input v-model="formData.drugallergydesc" placeholder="请输入药物过敏史描述" />
</el-form-item>
<el-form-item label="暴露史" prop="exposure">
<el-select v-model="formData.exposure" placeholder="请选择暴露史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.exposure === 1" label="暴露史描述" prop="exposuredesc">
<el-input v-model="formData.exposuredesc" placeholder="请输入暴露史描述" />
</el-form-item>
<el-form-item label="疾病史" prop="diseasehistory">
<el-select v-model="formData.diseasehistory" placeholder="请选择疾病史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.diseasehistory === 1" label="疾病史描述" prop="diseasehistorydesc">
<el-input v-model="formData.diseasehistorydesc" placeholder="请输入疾病史描述" />
</el-form-item>
<el-form-item label="手术史" prop="surgeryhistory">
<el-select v-model="formData.surgeryhistory" placeholder="请选择手术史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.surgeryhistory === 1" label="手术史描述" prop="surgeryhistorydesc">
<el-input v-model="formData.surgeryhistorydesc" placeholder="请输入手术史描述" />
</el-form-item>
<el-form-item label="外伤史" prop="traumahistory">
<el-select v-model="formData.traumahistory" placeholder="请选择外伤史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.traumahistory === 1" label="外伤史描述" prop="traumahistorydesc">
<el-input v-model="formData.traumahistorydesc" placeholder="请输入外伤史描述" />
</el-form-item>
<el-form-item label="输血史" prop="transfusionhistory">
<el-select v-model="formData.transfusionhistory" placeholder="请选择输血史">
<el-option label="无" :value="0" />
<el-option label="有" :value="1" />
</el-select>
</el-form-item>
<el-form-item v-if="formData.transfusionhistory === 1" label="输血史描述" prop="transfusionhistorydesc">
<el-input v-model="formData.transfusionhistorydesc" placeholder="请输入输血史描述" />
</el-form-item>
<el-form-item label="创建时间" prop="createtime">
<el-date-picker
v-model="formData.createtime"
type="date"
value-format="x"
placeholder="选择创建时间"
/>
</el-form-item>
<el-form-item label="更新时间" prop="updatetime">
<el-date-picker
v-model="formData.updatetime"
type="date"
value-format="x"
placeholder="选择更新时间"
/>
</el-form-item>
<el-form-item label="创建人" prop="createby">
<el-input v-model="formData.createby" placeholder="请输入创建人" />
</el-form-item>
<el-form-item label="更新人" prop="updateby">
<el-input v-model="formData.updateby" placeholder="请输入更新人" />
</el-form-item>
<el-form-item label="腰围cm" prop="waist">
<el-input v-model="formData.waist" placeholder="请输入腰围cm" />
</el-form-item>
<el-form-item label="臀围cm" prop="hip">
<el-input v-model="formData.hip" placeholder="请输入臀围cm" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { PersonArchiveApi, PersonArchiveVO } from '@/api/personarchive'
import {provinceAndCityData,
pcTextArr,
regionData,
pcaTextArr,
codeToText,
} from "element-china-area-data"
interface CascaderOption {
value: string
label: string
children?: CascaderOption[]
}
/** 人员档案 表单 */
defineOptions({ name: 'PersonArchiveForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref<{
id: number | undefined
userid: number | undefined
orgid: number | undefined
orgname: string | undefined
name: string | undefined
gender: number | undefined
age: number | undefined
idcard: string | undefined
address: string | undefined
phone: string | undefined
bloodtype: string | undefined
sleepsituation: string | undefined
height: number | undefined
weight: number | undefined
waist: number | undefined
hip: number | undefined
drinking: string | undefined
disability: number | undefined
drugallergy: number | undefined
exposure: number | undefined
diseasehistory: number | undefined
surgeryhistory: number | undefined
traumahistory: number | undefined
transfusionhistory: number | undefined
disabilitydesc: string | undefined
drugallergydesc: string | undefined
exposuredesc: string | undefined
diseasehistorydesc: string | undefined
surgeryhistorydesc: string | undefined
traumahistorydesc: string | undefined
transfusionhistorydesc: string | undefined
createtime: number | undefined
updatetime: number | undefined
createby: string | undefined
updateby: string | undefined
}>({
id: undefined,
userid: undefined,
orgid: undefined,
orgname: undefined,
name: undefined,
gender: undefined,
age: undefined,
idcard: undefined,
address: undefined,
phone: undefined,
bloodtype: undefined,
sleepsituation: undefined,
height: undefined,
weight: undefined,
waist: undefined,
hip: undefined,
drinking: undefined,
disability: undefined,
drugallergy: undefined,
exposure: undefined,
diseasehistory: undefined,
surgeryhistory: undefined,
traumahistory: undefined,
transfusionhistory: undefined,
disabilitydesc: undefined,
drugallergydesc: undefined,
exposuredesc: undefined,
diseasehistorydesc: undefined,
surgeryhistorydesc: undefined,
traumahistorydesc: undefined,
transfusionhistorydesc: undefined,
createtime: undefined,
updatetime: undefined,
createby: undefined,
updateby: undefined,
})
const formRules = reactive({
userid: [{ required: true, message: '人员表ID不能为空', trigger: 'blur' }],
orgid: [{ required: true, message: '机构ID不能为空', trigger: 'blur' }],
orgname: [{ required: true, message: '机构名称不能为空', trigger: 'blur' }],
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const selectedOptions = ref<string[]>([]) //
const options = ref<CascaderOption[]>(regionData as unknown as CascaderOption[])
/** 处理地址变化 */
const handleAddressChange = (value: any) => {
if (value && value.length === 3) {
const address = codeToText[value[0]] + '/' + codeToText[value[1]] + '/' + codeToText[value[2]]
formData.value.address = address
}
}
//
watch(() => formData.value.address, (newValue) => {
if (selectedOptions.value && selectedOptions.value.length === 3) {
const address = codeToText[selectedOptions.value[0]] + '/' + codeToText[selectedOptions.value[1]] + '/' + codeToText[selectedOptions.value[2]]
formData.value.address = address
}
})
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await PersonArchiveApi.getPersonArchive(id)
//
if (formData.value.address) {
const addressParts = formData.value.address.split('/')
if (addressParts.length >= 3) {
//
const provinceCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[0])
let cityCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[1])
if(provinceCode == '12'){
cityCode = '1201'
}
const areaCode = Object.keys(codeToText).find(key => codeToText[key] === addressParts[2])
if (provinceCode && cityCode && areaCode) {
selectedOptions.value = [provinceCode, cityCode, areaCode]
}
}
}
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as PersonArchiveVO
if (formType.value === 'create') {
await PersonArchiveApi.createPersonArchive(data)
message.success(t('common.createSuccess'))
} else {
await PersonArchiveApi.updatePersonArchive(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userid: undefined,
orgid: undefined,
orgname: undefined,
name: undefined,
gender: undefined,
age: undefined,
idcard: undefined,
address: undefined,
phone: undefined,
bloodtype: undefined,
sleepsituation: undefined,
height: undefined,
weight: undefined,
waist: undefined,
hip: undefined,
drinking: undefined,
disability: undefined,
drugallergy: undefined,
exposure: undefined,
diseasehistory: undefined,
surgeryhistory: undefined,
traumahistory: undefined,
transfusionhistory: undefined,
disabilitydesc: undefined,
drugallergydesc: undefined,
exposuredesc: undefined,
diseasehistorydesc: undefined,
surgeryhistorydesc: undefined,
traumahistorydesc: undefined,
transfusionhistorydesc: undefined,
createtime: undefined,
updatetime: undefined,
createby: undefined,
updateby: undefined,
}
selectedOptions.value = []
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,223 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="姓名" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="身份证号" prop="idcard">
<el-input
v-model="queryParams.idcard"
placeholder="请输入身份证号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="姓名" align="center" prop="name" />
<el-table-column label="性别" align="center" prop="gender" >
<template #default="scope">
<el-tag v-if="scope.row.gender === 1" type="success"></el-tag>
<el-tag v-else type="danger"></el-tag>
</template>
</el-table-column>
<el-table-column label="身份证号" align="center" prop="idcard" />
<el-table-column label="年龄" align="center" prop="age" />
<el-table-column label="血型" align="center" prop="bloodtype" >
<template #default="scope">
<el-tag v-if="scope.row.bloodtype === 'A'" type="success">A</el-tag>
<el-tag v-else-if="scope.row.bloodtype === 'B'" type="danger">B</el-tag>
<el-tag v-else-if="scope.row.bloodtype === 'AB'" type="warning">AB</el-tag>
<el-tag v-else type="info">O</el-tag>
</template>
</el-table-column>
<el-table-column label="联系电话" align="center" prop="phone" />
<el-table-column label="户籍住址" align="center" prop="address" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
>
详情
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<PersonArchiveForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { PersonArchiveApi, PersonArchiveVO } from '@/api/personarchive'
import PersonArchiveForm from './PersonArchiveForm.vue'
/** 人员档案 列表 */
defineOptions({ name: 'PersonArchive' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<PersonArchiveVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userid: undefined,
orgid: undefined,
orgname: undefined,
name: undefined,
gender: undefined,
age: undefined,
idcard: undefined,
address: undefined,
phone: undefined,
bloodtype: undefined,
sleepsituation: undefined,
height: undefined,
weight: undefined,
waist: undefined,
hip: undefined,
drinking: undefined,
disability: undefined,
drugallergy: undefined,
exposure: undefined,
diseasehistory: undefined,
surgeryhistory: undefined,
traumahistory: undefined,
transfusionhistory: undefined,
disabilitydesc: undefined,
drugallergydesc: undefined,
exposuredesc: undefined,
diseasehistorydesc: undefined,
surgeryhistorydesc: undefined,
traumahistorydesc: undefined,
transfusionhistorydesc: undefined,
createtime: [],
updatetime: [],
createby: undefined,
updateby: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PersonArchiveApi.getPersonArchivePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await PersonArchiveApi.deletePersonArchive(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PersonArchiveApi.exportPersonArchive(queryParams)
download.excel(data, '人员档案.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -39,7 +39,6 @@
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dept:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
@ -84,7 +83,6 @@
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dept:update']"
>
修改
</el-button>
@ -92,7 +90,6 @@
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dept:delete']"
>
删除
</el-button>