init
This commit is contained in:
2025-06-27 17:42:38 +08:00
commit bd6402478b
5317 changed files with 785994 additions and 0 deletions
@@ -0,0 +1,83 @@
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
const { createConfirm } = useMessage();
enum Api {
list = '/health-emergency/emergency/emergencySeriousDisease/list',
save = '/health-emergency/emergency/emergencySeriousDisease/add',
edit = '/health-emergency/emergency/emergencySeriousDisease/edit',
deleteOne = '/health-emergency/emergency/emergencySeriousDisease/delete',
deleteBatch = '/health-emergency/emergency/emergencySeriousDisease/deleteBatch',
importExcel = '/health-emergency/emergency/emergencySeriousDisease/importExcel',
exportXls = '/health-emergency/emergency/emergencySeriousDisease/exportXls',
queryById = '/health-emergency/emergency/emergencySeriousDisease/queryById',
getZHospital = '/health-emergency/api/emergency/resource/selectStationHospitalList',
}
/**
* 导出api
* @param params
*/
export const getExportUrl = Api.exportXls;
export const queryByIdUrl = Api.queryById;
/**
* 导入api
*/
export const getImportUrl = Api.importExcel;
/**
* 列表接口
* @param params
*/
export const list = (params) => defHttp.get({ url: Api.list, params });
export const getZHospitalApi = () => defHttp.get({ url: Api.getZHospital });
/**
* 删除单个
*/
export const deleteOne = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () =>
defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
handleSuccess();
}),
});
};
/**
* 批量删除
* @param params
* @param handleSuccess
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
handleSuccess();
});
},
});
};
/**
* 保存或者更新
* @param params
* @param isUpdate
*/
export const saveOrUpdate = (params, isUpdate) => {
const url = isUpdate ? Api.edit : Api.save;
return defHttp.post({ url: url, params });
};
@@ -0,0 +1,438 @@
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { render } from '/@/utils/common/renderUtils';
import { getHospitalsList, getNewHospitalApi } from '../../system/user/user.api';
import { personType } from '/@/views/emergency/outburst/ScheduleCustom/ScheduleDefault.api';
import dayjs from 'dayjs';
import { onSitePersonNewApi } from '/@/views/emergency/communication/components/commApi';
import { useMessage } from '/@/hooks/web/useMessage';
import moment from 'moment';
import { getZHospitalApi } from '/@/views/emergency/EmergencySeriousDisease/EmergencySeriousDisease.api';
const { createMessage } = useMessage();
//列表数据
export const columns: BasicColumn[] = [
{
title: '就医人员',
align: 'center',
dataIndex: 'realname',
customRender: ({ record }) => {
const { realname, sex_dictText, age } = record;
return `${realname}-${sex_dictText}-${age}`;
},
},
{
title: '部门',
align: 'center',
dataIndex: 'userDepart',
},
// {
// title: '就医人员',
// align: 'center',
// dataIndex: 'sex_dictText',
// ifShow: false,
// },
{
title: '预约医院',
align: 'center',
dataIndex: 'hospitalName',
},
{
title: '挂号类别',
align: 'center',
dataIndex: 'registerCategory',
customRender: ({ text }) => {
return render.renderDict(text, 'category');
},
},
{
title: '预约科室',
align: 'center',
dataIndex: 'reservationOffice',
},
{
title: '预约医生',
align: 'center',
dataIndex: 'reservationDoctor',
},
{
title: '预约时间',
align: 'center',
dataIndex: 'reservationTime',
// return !text ? '' : text.length > 10 ? text.substr(0, 14) : text;
customRender: ({ text }) => {
if (text) {
return moment(text).format('yyyy-MM-DD HH:mm');
} else {
return '';
}
},
},
{
title: '期望预约时间',
align: 'center',
dataIndex: 'desireTime',
customRender: ({ text }) => {
if (text) {
return moment(text).format('yyyy-MM-DD HH:mm');
} else {
return '';
}
},
},
// {
// title: '真实姓名',
// align: 'center',
// dataIndex: 'realname',
// },
{
title: '驻场人员',
align: 'center',
dataIndex: 'stationUserName',
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
{
label: '就医人员',
field: 'realname',
component: 'Input',
colProps: {
span: 6,
},
},
{
label: '医院',
field: 'hospitalId',
component: 'ApiSelect',
colProps: {
span: 6,
},
componentProps: {
api: getNewHospitalApi,
resultField: 'list',
labelField: 'name',
valueField: 'id',
immediate: true,
},
},
{
label: '挂号类别',
field: 'registerCategory',
component: 'JDictSelectTag',
colProps: {
span: 6,
},
componentProps: {
dictCode: 'category',
},
},
{
label: '期望预约时间',
field: 'desireTime',
component: 'DatePicker',
componentProps: {
// format: 'YYYY-MM-DD HH:mm',
// showTime: { format: 'YYYY-MM-DD HH:mm' },
valueFormat: 'YYYY-MM-DD HH:mm:ss',
placeholder: '请选择期望预约时间',
},
},
];
function checkAge(_, value) {
if (!value) {
return Promise.reject('请输入年龄');
}
if (!Number.isInteger(value)) {
return Promise.reject('年龄必须是整数');
}
if (Number(value) < 1) {
return Promise.reject('请输入正确年龄');
} else {
return Promise.resolve();
}
}
//表单数据
// @ts-ignore
export const formSchema: FormSchema[] = [
{
label: '就医人员',
field: 'realname',
component: 'Input',
required: true,
componentProps: {
placeholder: '请选择就医人员',
readOnly: true,
onClick: () => {
// 弹窗选择所有用户
selUserModal.openModal();
},
},
},
{
label: '年龄',
field: 'age',
component: 'InputNumber',
rules: [{ required: true, trigger: 'blur', validator: checkAge }],
},
{
label: '性别',
field: 'sex',
component: 'JDictSelectTag',
required: true,
componentProps: {
dictCode: 'sex2',
type: 'radio',
// stringToNumber: true,
},
},
{
label: '部门',
field: 'userDepart',
component: 'Input',
ifShow: false,
},
{
label: '手机号码',
field: 'telPhone',
component: 'Input',
rules: [{ required: true, pattern: /^1[3456789]\d{9}$/, message: '${label}格式有误' }],
},
{
label: '身份证号',
field: 'idNo',
component: 'Input',
rules: [
{
required: true,
pattern: /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/,
message: '${label}格式有误',
},
],
},
{
label: '',
field: 'userId', // 就医人员选中的用户ID
component: 'Input',
show: false,
},
{
label: '预约医院',
field: 'hospitalId',
component: 'ApiSelect',
required: true,
componentProps: ({ formModel }) => {
return {
api: getZHospitalApi,
resultField: 'list',
labelField: 'name',
valueField: 'id',
immediate: true,
onChange: (val, option) => {
formModel.hospitalId = val;
formModel.stationUserId = '';
formModel.stationUserName = '';
formModel.hospitalName = option?.label;
},
onDeselect: () => {
formModel.hospitalId = '';
formModel.stationUserId = '';
formModel.stationUserName = '';
},
// // 请求后回调
// onOptionsChange: (options) => {
// console.log('get options', options.length, options);
// },
onOptionsChange: () => {
// console.log("options",options)
},
};
},
},
{
label: '',
field: 'hospitalName', // 医院名称选中的医院ID
component: 'Input',
show: false,
},
{
label: '就诊卡号',
field: 'medicalCardNo',
component: 'Input',
rules: [
{
pattern: /^[0-9]*$/,
trigger: 'blur',
message: '就诊卡号格式有误',
required: false,
},
],
},
{
label: '挂号类别 ',
field: 'registerCategory',
component: 'JDictSelectTag',
required: true,
componentProps: {
dictCode: 'category',
},
},
// {
// label: '预约号',
// field: 'reservationNo',
// required: true,
// component: 'Input',
// },
{
label: '预约时间',
field: 'reservationTime',
component: 'DatePicker',
required: true,
componentProps: {
format: 'YYYY-MM-DD HH:mm',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
showTime: { format: 'YYYY-MM-DD HH:mm' },
placeholder: '请选择预约时间',
},
},
{
label: '期望预约时间',
field: 'desireTime',
component: 'DatePicker',
required: true,
componentProps: {
format: 'YYYY-MM-DD HH:mm',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
showTime: { format: 'YYYY-MM-DD HH:mm' },
placeholder: '请选择期望预约时间',
},
},
{
label: '预约科室',
field: 'reservationOffice',
component: 'Input',
},
{
label: '预约医生',
field: 'reservationDoctor',
component: 'Input',
},
{
label: '病情描述',
field: 'diseaseDescribe',
component: 'InputTextArea',
},
// {
// label: '特殊要求',
// field: 'specialRequirements',
// component: 'InputTextArea',
// },
{
label: '状态',
field: 'state',
component: 'JDictSelectTag',
componentProps: {
dictCode: 'serious_medical_condition',
},
},
{
label: '驻场人员',
field: 'stationUserId',
component: 'ApiSelect',
componentProps: ({ formModel }) => {
return {
getPopupContainer: () => document.body,
api: onSitePersonNewApi,
params: {
personType: '7',
hospital: formModel.hospitalId || '@&^*G',
pageSize: 999,
},
resultField: 'list',
labelField: 'realname',
valueField: 'id',
immediate: true,
onChange: (e, option) => {
formModel.stationUserId = e;
formModel.stationUserName = option.label;
},
onFocus: () => {
if (!formModel.hospitalId) {
return createMessage.warn('请先选择医院!');
}
},
};
},
},
{
label: '驻场人员',
field: 'stationUserName',
component: 'Input',
show: false,
},
{
label: '派单时间',
field: 'sendOrderTime',
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD HH:mm',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
showTime: { format: 'YYYY-MM-DD HH:mm' },
placeholder: '请选择派单时间',
},
},
{
label: '操作人员',
field: 'operatorId',
component: 'ApiSelect',
componentProps: () => {
return {
getPopupContainer: () => document.body,
api: personType,
params: {
personType: '5',
pageSize: 999,
},
resultField: 'list',
labelField: 'realname',
valueField: 'id',
immediate: true,
};
},
},
{
label: '驳回时间',
field: 'rejectionTime',
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD HH:mm',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
showTime: { format: 'YYYY-MM-DD HH:mm' },
placeholder: '请选择驳回时间',
},
},
{
label: '驳回原因',
field: 'rejectionReason',
component: 'InputTextArea',
},
// TODO 主键隐藏字段,目前写死为ID
{
label: '',
field: 'id',
component: 'Input',
show: false,
},
];
/**
* 流程表单调用这个方法获取formSchema
* @param _formData
*/
export function getBpmFormSchema(_formData): FormSchema[] {
// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
return formSchema;
}
@@ -0,0 +1,145 @@
<template>
<div>
<!--引用表格-->
<BasicTable :rowSelection="rowSelection" @register="registerTable">
<!--插槽:table标题-->
<template #tableTitle>
<a-button v-auth="'emergency:emergency_serious_disease:add'" preIcon="ant-design:plus-outlined" type="primary" @click="handleAdd">
新增
</a-button>
<a-button type="primary" @click="batchHandleDelete" preIcon="ant-design:delete-outlined"> 批量删除 </a-button>
<a-button
v-auth="'emergency:emergency_serious_disease:exportXls'"
preIcon="ant-design:export-outlined"
type="primary"
@click="onExportXls"
>导出</a-button
>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
</BasicTable>
<!-- 表单区域 -->
<EmergencySeriousDiseaseModal @register="registerDrawer" @success="handleSuccess" />
</div>
</template>
<script lang="ts" name="emergency-emergencySeriousDisease" setup>
import { BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import EmergencySeriousDiseaseModal from './components/EmergencySeriousDiseaseModal.vue';
import { columns, searchFormSchema } from './EmergencySeriousDisease.data';
import { batchDelete, deleteOne, list } from './EmergencySeriousDisease.api';
import { message } from 'ant-design-vue';
import { useDrawer } from '/@/components/Drawer';
//注册model
const [registerDrawer, { openDrawer }] = useDrawer();
//注册table数据
const { tableContext, onExportXls } = useListPage({
tableProps: {
title: '大病就医',
api: list,
columns,
canResize: false,
clearSelectOnPageChange: true,
beforeFetch: (params) => {
return params;
},
formConfig: {
labelWidth: 90,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: false,
fieldMapToNumber: [],
fieldMapToTime: [],
},
actionColumn: {
width: 160,
fixed: 'right',
},
},
});
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
/**
* 新增事件
*/
function handleAdd() {
openDrawer(true, {
isUpdate: false,
showFooter: true,
title: '新增',
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
showFooter: true,
title: '编辑',
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
showFooter: false,
title: '详情',
});
}
/**
* 删除事件
*/
function handleDelete(record: Recordable) {
deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
function batchHandleDelete() {
if (selectedRowKeys.value.length === 0) {
return message.warning('未选中任何数据');
}
batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record: Recordable) {
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'emergency:emergency_serious_disease:edit',
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
onClick: handleDelete.bind(null, record),
auth: 'emergency:emergency_serious_disease:delete',
},
];
}
</script>
<style scoped lang="less">
:deep(.ant-popover-inner) {
min-width: 150px;
}
</style>
@@ -0,0 +1,175 @@
<template>
<div>
<BasicDrawer
v-bind="$attrs"
:showFooter="showFooter"
@register="registerModal"
destroyOnClose
:title="title"
:width="800"
@ok="handleSubmit"
:maskClosable="false"
>
<BasicForm @register="registerForm" style="overflow: auto" />
</BasicDrawer>
<!-- <UserSelectModal rowKey="id" @register="registerSelUserModal" @getSelectResult="onSelectUserOk" />-->
<replace-other ref="replaceOtherRef" title="选择用户" @choose-employ="onSelectUserOk" />
<list-user-by-person-type @register="registerListModal" />
</div>
</template>
<script lang="ts" setup>
import { ref, unref } from 'vue';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from '../EmergencySeriousDisease.data';
import { saveOrUpdate } from '../EmergencySeriousDisease.api';
import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModalIllness.vue';
import { useModal } from '/@/components/Modal';
import { useDrawer } from '/@/components/Drawer';
import ListUserByPersonType from '/@/views/emergency/EmergencySeriousDisease/components/listUserByPersonType.vue';
import ReplaceOther from '/@/views/emergency/communication/components/replaceOther.vue';
const [registerSelUserModal, selUserModal] = useDrawer();
const [registerListModal, { openDrawer: openListModal }] = useDrawer();
// Emits声明
const emit = defineEmits(['register', 'success']);
const replaceOtherRef = ref();
const isUpdate = ref(true);
const showFooter = ref<boolean>(true);
//设置标题
const title = ref<string>('');
formSchema[0].componentProps.onClick = () => {
replaceOtherRef.value.showModal();
};
formSchema[7].componentProps.onOptionsChange = (options) => {
onSelectHospital(options);
};
function c(type, title) {
openListModal(true, {
personType: type,
title: title,
});
}
//
// formSchema.map((item) => {
// switch (item.field) {
// case 'stationUserName':
// item.componentProps.onClick = () => c('7', '驻场人员');
// break;
// case 'operatorName':
// item.componentProps.onClick = () => c('6', '操作人员');
// break;
// }
// });
//表单配置
const [registerForm, { setProps, resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({
//labelWidth: 150,
schemas: formSchema,
showActionButtonGroup: false,
baseColProps: { span: 24 },
});
//表单赋值
const [registerModal, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
//重置表单
await resetFields();
setDrawerProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });
isUpdate.value = !!data?.isUpdate;
showFooter.value = data.showFooter;
title.value = data.title;
if (unref(isUpdate)) {
await updateSchema([{ field: 'userDepart', ifShow: true }]);
//表单赋值
await setFieldsValue({
...data.record,
});
if (!!data?.showFooter) {
await updateSchema([
{ field: 'age', ifShow: false },
{ field: 'sex', ifShow: false },
{ field: 'userDepart', ifShow: false },
{ field: 'telPhone', ifShow: false },
{ field: 'idNo', ifShow: false },
{ field: 'stationUserId', ifShow: true },
{ field: 'sendOrderTime', ifShow: true },
{ field: 'operatorId', ifShow: true },
{ field: 'rejectionTime', ifShow: true },
{ field: 'rejectionReason', ifShow: true },
]);
} else {
await updateSchema([
{ field: 'age', ifShow: true },
{ field: 'sex', ifShow: true },
{ field: 'userDepart', ifShow: true },
{ field: 'telPhone', ifShow: true },
{ field: 'idNo', ifShow: true },
{ field: 'stationUserId', ifShow: !!data.record.stationUserName },
{ field: 'sendOrderTime', ifShow: !!data.record.sendOrderTime },
{ field: 'operatorId', ifShow: !!data.record.operatorId },
{ field: 'rejectionTime', ifShow: !!data.record.rejectionTime },
{ field: 'rejectionReason', ifShow: !!data.record.rejectionReason },
]);
}
} else {
await updateSchema([
{ field: 'age', ifShow: false },
{ field: 'sex', ifShow: false },
{ field: 'userDepart', ifShow: false },
{ field: 'telPhone', ifShow: false },
{ field: 'idNo', ifShow: false },
{ field: 'stationUserId', ifShow: true },
{ field: 'sendOrderTime', ifShow: true },
{ field: 'operatorId', ifShow: true },
{ field: 'rejectionTime', ifShow: true },
{ field: 'rejectionReason', ifShow: true },
]);
}
await clearValidate();
// 隐藏底部时禁用整个表单
await setProps({ disabled: !data?.showFooter });
});
//表单提交事件
async function handleSubmit() {
try {
let values = await validate();
setDrawerProps({ confirmLoading: true });
//提交表单
await saveOrUpdate(values, isUpdate.value);
//关闭弹窗
closeDrawer();
//刷新列表
emit('success');
} finally {
setDrawerProps({ confirmLoading: false });
}
}
// 选择用户成功
async function onSelectUserOk(e) {
let json = JSON.parse(e);
await setFieldsValue({
realname: json.realname,
userId: json.id,
});
}
// 选择医院名称
async function onSelectHospital(options) {
await setFieldsValue({
hospitalName: options[0]['label'],
hospitalId: options[0]['value'],
});
}
</script>
<style lang="less" scoped>
/** 时间和数字输入框样式 */
:deep(.ant-input-number) {
width: 100%;
}
:deep(.ant-calendar-picker) {
width: 100%;
}
</style>
@@ -0,0 +1,16 @@
import { BasicColumn, FormSchema } from '/@/components/Table';
export const columns: BasicColumn[] = [
{
title: '名称',
align: 'center',
dataIndex: 'realname',
},
{
title: '性别',
align: 'center',
dataIndex: 'sex_dictText',
},
];
export const searchFormPersonType: FormSchema[] = [];
@@ -0,0 +1,55 @@
<template>
<!-- <BasicDrawer v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="600" @ok="handleSubmit">-->
<BasicDrawer
:title="title"
width="70%"
:showFooter="false"
destroyOnClose
v-bind="$attrs"
@ok="handleSubmit"
@register="registerModal"
:maskClosable="false"
>
<BasicTable :rowSelection="{ type: 'radio' }" @register="registerTable" />
</BasicDrawer>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import BasicTable from '/@/components/Table/src/BasicTable.vue';
import { useListPage } from '/@/hooks/system/useListPage';
import { personType } from '/@/views/emergency/outburst/ScheduleCustom/ScheduleDefault.api';
import { columns } from '/@/views/emergency/EmergencySeriousDisease/components/listUserByPersonType.data';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
const personTypes = ref<String>('5');
const title = ref<String>('5');
const emit = defineEmits(['choosePerson']);
const [registerModal] = useDrawerInner(async (data) => {
personTypes.value = data.personType;
title.value = data.title;
});
const { tableContext } = useListPage({
tableProps: {
api: personType,
columns,
canResize: false,
clearSelectOnPageChange: true,
clickToRowSelect: true,
beforeFetch: (params) => {
params['personType'] = personTypes.value;
return params;
},
useSearchForm: false,
showActionColumn: false,
},
});
const [registerTable, {}, { rowSelection, selectedRowKeys }] = tableContext;
const handleSubmit = () => {
emit('choosePerson', {});
};
</script>
<style scoped lang="less">
:deep(.ant-table-title) {
display: none;
}
</style>